diff --git a/include/linux/moduleloader.h b/include/linux/moduleloader.h index 4fa67a8b22652e30737fd3158d73ac84da426b65..2d835b7dc918cb50618824dff11cb1d89ebb0022 100644 --- a/include/linux/moduleloader.h +++ b/include/linux/moduleloader.h @@ -96,6 +96,8 @@ void module_arch_cleanup(struct module *mod); /* Any cleanup before freeing mod->module_init */ void module_arch_freeing_init(struct module *mod); +void flush_module_icache(const struct module *mod); + #if defined(CONFIG_KASAN) && !defined(CONFIG_KASAN_VMALLOC) #include #define MODULE_ALIGN (PAGE_SIZE << KASAN_SHADOW_SCALE_SHIFT) diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c index de077785e5075b682a93b5e5f1954553702b8f7e..1fde6ba196a475683aadae7e9bbf57c27b7dc0b1 100644 --- a/kernel/livepatch/core.c +++ b/kernel/livepatch/core.c @@ -1214,6 +1214,7 @@ static int klp_init_patch(struct klp_patch *patch) goto out; } + flush_module_icache(patch->mod); set_mod_klp_rel_state(patch->mod, MODULE_KLP_REL_DONE); module_disable_ro(patch->mod); jump_label_apply_nops(patch->mod); diff --git a/kernel/module.c b/kernel/module.c index c5af21dcb873b94b16403ba300f20773df47fb4e..e7b9ecc1aa3419e814acec313d670b1c89511a88 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -3523,7 +3523,7 @@ static int check_module_license_and_versions(struct module *mod) return 0; } -static void flush_module_icache(const struct module *mod) +void flush_module_icache(const struct module *mod) { /* * Flush the instruction cache, since we've played with text.