Re: [PATCH 01/22] ARM: add mechanism for late code patching

From: Cyril Chemparathy
Date: Mon Aug 06 2012 - 09:19:19 EST


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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/