On 8/6/2012 7:12 AM, Russell King - ARM Linux wrote:
On Tue, Jul 31, 2012 at 07:04:37PM -0400, Cyril Chemparathy wrote:+static void __init init_patch_kernel(void) +{ + const void *start = &__patch_table_begin; + const void *end = &__patch_table_end; + + BUG_ON(patch_kernel(start, end - start)); + flush_icache_range(init_mm.start_code, init_mm.end_code);Err. You are asking the kernel to flush every single cache line manually throughout the kernel code. That's a flush every 32-bytes over maybe a few megabytes of address space.
With a flush_cache_all(), we could avoid having to operate a cacheline at a time, but that clobbers way more than necessary.
Maybe the better answer is to flush only the patched cachelines.
This is one of the reasons we do the patching in assembly code before the caches are enabled - so we don't have to worry about the interaction with the CPU caches, which for this kind of application would be very expensive.
Sure, flushing caches is expensive. But then, so is running the patching code with caches disabled. I guess memory access latencies drive the performance trade off here.
-- Thanks - Cyril -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

