arch/tile: properly flush the I$ when unloading kernel modules
authorChris Metcalf <cmetcalf@tilera.com>
Mon, 2 May 2011 19:35:06 +0000 (15:35 -0400)
committerChris Metcalf <cmetcalf@tilera.com>
Wed, 4 May 2011 18:40:25 +0000 (14:40 -0400)
Otherwise, in principle, there could be stale I$ data present
next time the page that previously held the kernel module code was
used to run some new code.

Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
arch/tile/kernel/module.c

index e2ab82b..f68df69 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/kernel.h>
 #include <asm/opcode-tile.h>
 #include <asm/pgtable.h>
+#include <asm/homecache.h>
 
 #ifdef __tilegx__
 # define Elf_Rela Elf64_Rela
@@ -86,8 +87,13 @@ error:
 void module_free(struct module *mod, void *module_region)
 {
        vfree(module_region);
+
+       /* Globally flush the L1 icache. */
+       flush_remote(0, HV_FLUSH_EVICT_L1I, cpu_online_mask,
+                    0, 0, 0, NULL, NULL, 0);
+
        /*
-        * FIXME: If module_region == mod->init_region, trim exception
+        * FIXME: If module_region == mod->module_init, trim exception
         * table entries.
         */
 }