diff options
Diffstat (limited to 'kernel/module.c')
| -rw-r--r-- | kernel/module.c | 12 | 
1 files changed, 8 insertions, 4 deletions
| diff --git a/kernel/module.c b/kernel/module.c index d753fd9d83ec..7576c2d9462f 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
| @@ -1431,6 +1431,9 @@ static void free_module(struct module *mod) | |||
| 1431 | /* Module unload stuff */ | 1431 | /* Module unload stuff */ | 
| 1432 | module_unload_free(mod); | 1432 | module_unload_free(mod); | 
| 1433 | 1433 | ||
| 1434 | /* release any pointers to mcount in this module */ | ||
| 1435 | ftrace_release(mod->module_core, mod->core_size); | ||
| 1436 | |||
| 1434 | /* This may be NULL, but that's OK */ | 1437 | /* This may be NULL, but that's OK */ | 
| 1435 | module_free(mod, mod->module_init); | 1438 | module_free(mod, mod->module_init); | 
| 1436 | kfree(mod->args); | 1439 | kfree(mod->args); | 
| @@ -1839,6 +1842,7 @@ static noinline struct module *load_module(void __user *umod, | |||
| 1839 | struct module *mod; | 1842 | struct module *mod; | 
| 1840 | long err = 0; | 1843 | long err = 0; | 
| 1841 | void *percpu = NULL, *ptr = NULL; /* Stops spurious gcc warning */ | 1844 | void *percpu = NULL, *ptr = NULL; /* Stops spurious gcc warning */ | 
| 1845 | void *mseg; | ||
| 1842 | struct exception_table_entry *extable; | 1846 | struct exception_table_entry *extable; | 
| 1843 | mm_segment_t old_fs; | 1847 | mm_segment_t old_fs; | 
| 1844 | 1848 | ||
| @@ -2190,10 +2194,9 @@ static noinline struct module *load_module(void __user *umod, | |||
| 2190 | #endif | 2194 | #endif | 
| 2191 | } | 2195 | } | 
| 2192 | 2196 | ||
| 2193 | if (mcountindex) { | 2197 | /* sechdrs[0].sh_size is always zero */ | 
| 2194 | void *mseg = (void *)sechdrs[mcountindex].sh_addr; | 2198 | mseg = (void *)sechdrs[mcountindex].sh_addr; | 
| 2195 | ftrace_init_module(mseg, mseg + sechdrs[mcountindex].sh_size); | 2199 | ftrace_init_module(mseg, mseg + sechdrs[mcountindex].sh_size); | 
| 2196 | } | ||
| 2197 | 2200 | ||
| 2198 | err = module_finalize(hdr, sechdrs, mod); | 2201 | err = module_finalize(hdr, sechdrs, mod); | 
| 2199 | if (err < 0) | 2202 | if (err < 0) | 
| @@ -2264,6 +2267,7 @@ static noinline struct module *load_module(void __user *umod, | |||
| 2264 | cleanup: | 2267 | cleanup: | 
| 2265 | kobject_del(&mod->mkobj.kobj); | 2268 | kobject_del(&mod->mkobj.kobj); | 
| 2266 | kobject_put(&mod->mkobj.kobj); | 2269 | kobject_put(&mod->mkobj.kobj); | 
| 2270 | ftrace_release(mod->module_core, mod->core_size); | ||
| 2267 | free_unload: | 2271 | free_unload: | 
| 2268 | module_unload_free(mod); | 2272 | module_unload_free(mod); | 
| 2269 | module_free(mod, mod->module_init); | 2273 | module_free(mod, mod->module_init); | 
