aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/module.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/module.c')
-rw-r--r--kernel/module.c51
1 files changed, 24 insertions, 27 deletions
diff --git a/kernel/module.c b/kernel/module.c
index ba22484a987e..77672233387f 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -822,7 +822,7 @@ SYSCALL_DEFINE2(delete_module, const char __user *, name_user,
822 mutex_lock(&module_mutex); 822 mutex_lock(&module_mutex);
823 /* Store the name of the last unloaded module for diagnostic purposes */ 823 /* Store the name of the last unloaded module for diagnostic purposes */
824 strlcpy(last_unloaded_module, mod->name, sizeof(last_unloaded_module)); 824 strlcpy(last_unloaded_module, mod->name, sizeof(last_unloaded_module));
825 unregister_dynamic_debug_module(mod->name); 825 ddebug_remove_module(mod->name);
826 free_module(mod); 826 free_module(mod);
827 827
828 out: 828 out:
@@ -1827,19 +1827,13 @@ static inline void add_kallsyms(struct module *mod,
1827} 1827}
1828#endif /* CONFIG_KALLSYMS */ 1828#endif /* CONFIG_KALLSYMS */
1829 1829
1830static void dynamic_printk_setup(struct mod_debug *debug, unsigned int num) 1830static void dynamic_debug_setup(struct _ddebug *debug, unsigned int num)
1831{ 1831{
1832#ifdef CONFIG_DYNAMIC_PRINTK_DEBUG 1832#ifdef CONFIG_DYNAMIC_DEBUG
1833 unsigned int i; 1833 if (ddebug_add_module(debug, num, debug->modname))
1834 1834 printk(KERN_ERR "dynamic debug error adding module: %s\n",
1835 for (i = 0; i < num; i++) { 1835 debug->modname);
1836 register_dynamic_debug_module(debug[i].modname, 1836#endif
1837 debug[i].type,
1838 debug[i].logical_modname,
1839 debug[i].flag_names,
1840 debug[i].hash, debug[i].hash2);
1841 }
1842#endif /* CONFIG_DYNAMIC_PRINTK_DEBUG */
1843} 1837}
1844 1838
1845static void *module_alloc_update_bounds(unsigned long size) 1839static void *module_alloc_update_bounds(unsigned long size)
@@ -2015,14 +2009,6 @@ static noinline struct module *load_module(void __user *umod,
2015 if (err < 0) 2009 if (err < 0)
2016 goto free_mod; 2010 goto free_mod;
2017 2011
2018#if defined(CONFIG_MODULE_UNLOAD) && defined(CONFIG_SMP)
2019 mod->refptr = percpu_modalloc(sizeof(local_t), __alignof__(local_t),
2020 mod->name);
2021 if (!mod->refptr) {
2022 err = -ENOMEM;
2023 goto free_mod;
2024 }
2025#endif
2026 if (pcpuindex) { 2012 if (pcpuindex) {
2027 /* We have a special allocation for this section. */ 2013 /* We have a special allocation for this section. */
2028 percpu = percpu_modalloc(sechdrs[pcpuindex].sh_size, 2014 percpu = percpu_modalloc(sechdrs[pcpuindex].sh_size,
@@ -2030,7 +2016,7 @@ static noinline struct module *load_module(void __user *umod,
2030 mod->name); 2016 mod->name);
2031 if (!percpu) { 2017 if (!percpu) {
2032 err = -ENOMEM; 2018 err = -ENOMEM;
2033 goto free_percpu; 2019 goto free_mod;
2034 } 2020 }
2035 sechdrs[pcpuindex].sh_flags &= ~(unsigned long)SHF_ALLOC; 2021 sechdrs[pcpuindex].sh_flags &= ~(unsigned long)SHF_ALLOC;
2036 mod->percpu = percpu; 2022 mod->percpu = percpu;
@@ -2082,6 +2068,14 @@ static noinline struct module *load_module(void __user *umod,
2082 /* Module has been moved. */ 2068 /* Module has been moved. */
2083 mod = (void *)sechdrs[modindex].sh_addr; 2069 mod = (void *)sechdrs[modindex].sh_addr;
2084 2070
2071#if defined(CONFIG_MODULE_UNLOAD) && defined(CONFIG_SMP)
2072 mod->refptr = percpu_modalloc(sizeof(local_t), __alignof__(local_t),
2073 mod->name);
2074 if (!mod->refptr) {
2075 err = -ENOMEM;
2076 goto free_init;
2077 }
2078#endif
2085 /* Now we've moved module, initialize linked lists, etc. */ 2079 /* Now we've moved module, initialize linked lists, etc. */
2086 module_unload_init(mod); 2080 module_unload_init(mod);
2087 2081
@@ -2213,12 +2207,13 @@ static noinline struct module *load_module(void __user *umod,
2213 add_kallsyms(mod, sechdrs, symindex, strindex, secstrings); 2207 add_kallsyms(mod, sechdrs, symindex, strindex, secstrings);
2214 2208
2215 if (!mod->taints) { 2209 if (!mod->taints) {
2216 struct mod_debug *debug; 2210 struct _ddebug *debug;
2217 unsigned int num_debug; 2211 unsigned int num_debug;
2218 2212
2219 debug = section_objs(hdr, sechdrs, secstrings, "__verbose", 2213 debug = section_objs(hdr, sechdrs, secstrings, "__verbose",
2220 sizeof(*debug), &num_debug); 2214 sizeof(*debug), &num_debug);
2221 dynamic_printk_setup(debug, num_debug); 2215 if (debug)
2216 dynamic_debug_setup(debug, num_debug);
2222 } 2217 }
2223 2218
2224 /* sechdrs[0].sh_size is always zero */ 2219 /* sechdrs[0].sh_size is always zero */
@@ -2288,15 +2283,17 @@ static noinline struct module *load_module(void __user *umod,
2288 ftrace_release(mod->module_core, mod->core_size); 2283 ftrace_release(mod->module_core, mod->core_size);
2289 free_unload: 2284 free_unload:
2290 module_unload_free(mod); 2285 module_unload_free(mod);
2286 free_init:
2287#if defined(CONFIG_MODULE_UNLOAD) && defined(CONFIG_SMP)
2288 percpu_modfree(mod->refptr);
2289#endif
2291 module_free(mod, mod->module_init); 2290 module_free(mod, mod->module_init);
2292 free_core: 2291 free_core:
2293 module_free(mod, mod->module_core); 2292 module_free(mod, mod->module_core);
2293 /* mod will be freed with core. Don't access it beyond this line! */
2294 free_percpu: 2294 free_percpu:
2295 if (percpu) 2295 if (percpu)
2296 percpu_modfree(percpu); 2296 percpu_modfree(percpu);
2297#if defined(CONFIG_MODULE_UNLOAD) && defined(CONFIG_SMP)
2298 percpu_modfree(mod->refptr);
2299#endif
2300 free_mod: 2297 free_mod:
2301 kfree(args); 2298 kfree(args);
2302 free_hdr: 2299 free_hdr: