diff options
Diffstat (limited to 'kernel/module.c')
-rw-r--r-- | kernel/module.c | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/kernel/module.c b/kernel/module.c index e797812a4d95..2383e60fcf3f 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
@@ -18,6 +18,7 @@ | |||
18 | */ | 18 | */ |
19 | #include <linux/module.h> | 19 | #include <linux/module.h> |
20 | #include <linux/moduleloader.h> | 20 | #include <linux/moduleloader.h> |
21 | #include <linux/ftrace_event.h> | ||
21 | #include <linux/init.h> | 22 | #include <linux/init.h> |
22 | #include <linux/kallsyms.h> | 23 | #include <linux/kallsyms.h> |
23 | #include <linux/fs.h> | 24 | #include <linux/fs.h> |
@@ -1489,9 +1490,6 @@ static void free_module(struct module *mod) | |||
1489 | /* Free any allocated parameters. */ | 1490 | /* Free any allocated parameters. */ |
1490 | destroy_params(mod->kp, mod->num_kp); | 1491 | destroy_params(mod->kp, mod->num_kp); |
1491 | 1492 | ||
1492 | /* release any pointers to mcount in this module */ | ||
1493 | ftrace_release(mod->module_core, mod->core_size); | ||
1494 | |||
1495 | /* This may be NULL, but that's OK */ | 1493 | /* This may be NULL, but that's OK */ |
1496 | module_free(mod, mod->module_init); | 1494 | module_free(mod, mod->module_init); |
1497 | kfree(mod->args); | 1495 | kfree(mod->args); |
@@ -1892,11 +1890,9 @@ static noinline struct module *load_module(void __user *umod, | |||
1892 | unsigned int symindex = 0; | 1890 | unsigned int symindex = 0; |
1893 | unsigned int strindex = 0; | 1891 | unsigned int strindex = 0; |
1894 | unsigned int modindex, versindex, infoindex, pcpuindex; | 1892 | unsigned int modindex, versindex, infoindex, pcpuindex; |
1895 | unsigned int num_mcount; | ||
1896 | struct module *mod; | 1893 | struct module *mod; |
1897 | long err = 0; | 1894 | long err = 0; |
1898 | void *percpu = NULL, *ptr = NULL; /* Stops spurious gcc warning */ | 1895 | void *percpu = NULL, *ptr = NULL; /* Stops spurious gcc warning */ |
1899 | unsigned long *mseg; | ||
1900 | mm_segment_t old_fs; | 1896 | mm_segment_t old_fs; |
1901 | 1897 | ||
1902 | DEBUGP("load_module: umod=%p, len=%lu, uargs=%p\n", | 1898 | DEBUGP("load_module: umod=%p, len=%lu, uargs=%p\n", |
@@ -2172,7 +2168,19 @@ static noinline struct module *load_module(void __user *umod, | |||
2172 | sizeof(*mod->tracepoints), | 2168 | sizeof(*mod->tracepoints), |
2173 | &mod->num_tracepoints); | 2169 | &mod->num_tracepoints); |
2174 | #endif | 2170 | #endif |
2175 | 2171 | #ifdef CONFIG_EVENT_TRACING | |
2172 | mod->trace_events = section_objs(hdr, sechdrs, secstrings, | ||
2173 | "_ftrace_events", | ||
2174 | sizeof(*mod->trace_events), | ||
2175 | &mod->num_trace_events); | ||
2176 | #endif | ||
2177 | #ifdef CONFIG_FTRACE_MCOUNT_RECORD | ||
2178 | /* sechdrs[0].sh_size is always zero */ | ||
2179 | mod->ftrace_callsites = section_objs(hdr, sechdrs, secstrings, | ||
2180 | "__mcount_loc", | ||
2181 | sizeof(*mod->ftrace_callsites), | ||
2182 | &mod->num_ftrace_callsites); | ||
2183 | #endif | ||
2176 | #ifdef CONFIG_MODVERSIONS | 2184 | #ifdef CONFIG_MODVERSIONS |
2177 | if ((mod->num_syms && !mod->crcs) | 2185 | if ((mod->num_syms && !mod->crcs) |
2178 | || (mod->num_gpl_syms && !mod->gpl_crcs) | 2186 | || (mod->num_gpl_syms && !mod->gpl_crcs) |
@@ -2237,11 +2245,6 @@ static noinline struct module *load_module(void __user *umod, | |||
2237 | dynamic_debug_setup(debug, num_debug); | 2245 | dynamic_debug_setup(debug, num_debug); |
2238 | } | 2246 | } |
2239 | 2247 | ||
2240 | /* sechdrs[0].sh_size is always zero */ | ||
2241 | mseg = section_objs(hdr, sechdrs, secstrings, "__mcount_loc", | ||
2242 | sizeof(*mseg), &num_mcount); | ||
2243 | ftrace_init_module(mod, mseg, mseg + num_mcount); | ||
2244 | |||
2245 | err = module_finalize(hdr, sechdrs, mod); | 2248 | err = module_finalize(hdr, sechdrs, mod); |
2246 | if (err < 0) | 2249 | if (err < 0) |
2247 | goto cleanup; | 2250 | goto cleanup; |
@@ -2302,7 +2305,6 @@ static noinline struct module *load_module(void __user *umod, | |||
2302 | cleanup: | 2305 | cleanup: |
2303 | kobject_del(&mod->mkobj.kobj); | 2306 | kobject_del(&mod->mkobj.kobj); |
2304 | kobject_put(&mod->mkobj.kobj); | 2307 | kobject_put(&mod->mkobj.kobj); |
2305 | ftrace_release(mod->module_core, mod->core_size); | ||
2306 | free_unload: | 2308 | free_unload: |
2307 | module_unload_free(mod); | 2309 | module_unload_free(mod); |
2308 | #if defined(CONFIG_MODULE_UNLOAD) && defined(CONFIG_SMP) | 2310 | #if defined(CONFIG_MODULE_UNLOAD) && defined(CONFIG_SMP) |