diff options
author | Chris Metcalf <cmetcalf@tilera.com> | 2011-05-02 15:35:06 -0400 |
---|---|---|
committer | Chris Metcalf <cmetcalf@tilera.com> | 2011-05-04 14:40:25 -0400 |
commit | 229f4df1fb84e5d3306b4fc49b41f7847340092d (patch) | |
tree | 1e7bbb5c6af2d5a2891910492469df876e2885d6 /arch/tile/kernel/module.c | |
parent | 7194988fb5add6341b95f4501f6778bf27b4d3de (diff) |
arch/tile: properly flush the I$ when unloading kernel modules
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>
Diffstat (limited to 'arch/tile/kernel/module.c')
-rw-r--r-- | arch/tile/kernel/module.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/arch/tile/kernel/module.c b/arch/tile/kernel/module.c index e2ab82b7c7e..f68df69f1f6 100644 --- a/arch/tile/kernel/module.c +++ b/arch/tile/kernel/module.c @@ -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. */ } |