diff options
Diffstat (limited to 'kernel/module.c')
| -rw-r--r-- | kernel/module.c | 33 | 
1 files changed, 10 insertions, 23 deletions
diff --git a/kernel/module.c b/kernel/module.c index f47cce910f2..496dcb57b60 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -43,7 +43,6 @@  #include <linux/device.h>  #include <linux/string.h>  #include <linux/mutex.h> -#include <linux/unwind.h>  #include <linux/rculist.h>  #include <asm/uaccess.h>  #include <asm/cacheflush.h> @@ -1449,8 +1448,6 @@ static void free_module(struct module *mod)  	remove_sect_attrs(mod);  	mod_kobject_remove(mod); -	unwind_remove_table(mod->unwind_info, 0); -  	/* Arch-specific cleanup. */  	module_arch_cleanup(mod); @@ -1867,7 +1864,6 @@ static noinline struct module *load_module(void __user *umod,  	unsigned int symindex = 0;  	unsigned int strindex = 0;  	unsigned int modindex, versindex, infoindex, pcpuindex; -	unsigned int unwindex = 0;  	unsigned int num_kp, num_mcount;  	struct kernel_param *kp;  	struct module *mod; @@ -1957,9 +1953,6 @@ static noinline struct module *load_module(void __user *umod,  	versindex = find_sec(hdr, sechdrs, secstrings, "__versions");  	infoindex = find_sec(hdr, sechdrs, secstrings, ".modinfo");  	pcpuindex = find_pcpusec(hdr, sechdrs, secstrings); -#ifdef ARCH_UNWIND_SECTION_NAME -	unwindex = find_sec(hdr, sechdrs, secstrings, ARCH_UNWIND_SECTION_NAME); -#endif  	/* Don't keep modinfo and version sections. */  	sechdrs[infoindex].sh_flags &= ~(unsigned long)SHF_ALLOC; @@ -1969,8 +1962,6 @@ static noinline struct module *load_module(void __user *umod,  	sechdrs[symindex].sh_flags |= SHF_ALLOC;  	sechdrs[strindex].sh_flags |= SHF_ALLOC;  #endif -	if (unwindex) -		sechdrs[unwindex].sh_flags |= SHF_ALLOC;  	/* Check module struct version now, before we try to use module. */  	if (!check_modstruct_version(sechdrs, versindex, mod)) { @@ -2267,11 +2258,6 @@ static noinline struct module *load_module(void __user *umod,  	add_sect_attrs(mod, hdr->e_shnum, secstrings, sechdrs);  	add_notes_attrs(mod, hdr->e_shnum, secstrings, sechdrs); -	/* Size of section 0 is 0, so this works well if no unwind info. */ -	mod->unwind_info = unwind_add_table(mod, -					    (void *)sechdrs[unwindex].sh_addr, -					    sechdrs[unwindex].sh_size); -  	/* Get rid of temporary copy */  	vfree(hdr); @@ -2366,11 +2352,12 @@ sys_init_module(void __user *umod,  	/* Now it's a first class citizen!  Wake up anyone waiting for it. */  	mod->state = MODULE_STATE_LIVE;  	wake_up(&module_wq); +	blocking_notifier_call_chain(&module_notify_list, +				     MODULE_STATE_LIVE, mod);  	mutex_lock(&module_mutex);  	/* Drop initial reference. */  	module_put(mod); -	unwind_remove_table(mod->unwind_info, 1);  	module_free(mod, mod->module_init);  	mod->module_init = NULL;  	mod->init_size = 0; @@ -2405,7 +2392,7 @@ static const char *get_ksymbol(struct module *mod,  	unsigned long nextval;  	/* At worse, next value is at end of module */ -	if (within(addr, mod->module_init, mod->init_size)) +	if (within_module_init(addr, mod))  		nextval = (unsigned long)mod->module_init+mod->init_text_size;  	else  		nextval = (unsigned long)mod->module_core+mod->core_text_size; @@ -2453,8 +2440,8 @@ const char *module_address_lookup(unsigned long addr,  	preempt_disable();  	list_for_each_entry_rcu(mod, &modules, list) { -		if (within(addr, mod->module_init, mod->init_size) -		    || within(addr, mod->module_core, mod->core_size)) { +		if (within_module_init(addr, mod) || +		    within_module_core(addr, mod)) {  			if (modname)  				*modname = mod->name;  			ret = get_ksymbol(mod, addr, size, offset); @@ -2476,8 +2463,8 @@ int lookup_module_symbol_name(unsigned long addr, char *symname)  	preempt_disable();  	list_for_each_entry_rcu(mod, &modules, list) { -		if (within(addr, mod->module_init, mod->init_size) || -		    within(addr, mod->module_core, mod->core_size)) { +		if (within_module_init(addr, mod) || +		    within_module_core(addr, mod)) {  			const char *sym;  			sym = get_ksymbol(mod, addr, NULL, NULL); @@ -2500,8 +2487,8 @@ int lookup_module_symbol_attrs(unsigned long addr, unsigned long *size,  	preempt_disable();  	list_for_each_entry_rcu(mod, &modules, list) { -		if (within(addr, mod->module_init, mod->init_size) || -		    within(addr, mod->module_core, mod->core_size)) { +		if (within_module_init(addr, mod) || +		    within_module_core(addr, mod)) {  			const char *sym;  			sym = get_ksymbol(mod, addr, size, offset); @@ -2720,7 +2707,7 @@ int is_module_address(unsigned long addr)  	preempt_disable();  	list_for_each_entry_rcu(mod, &modules, list) { -		if (within(addr, mod->module_core, mod->core_size)) { +		if (within_module_core(addr, mod)) {  			preempt_enable();  			return 1;  		}  | 
