Modules updates for v5.5
Summary of modules changes for the 5.5 merge window:
 
 - Refactor include/linux/export.h and remove code duplication between
   EXPORT_SYMBOL and EXPORT_SYMBOL_NS to make it more readable. The most
   notable change is that no namespace is represented by an empty string ""
   rather than NULL.
 
 - Fix a module load/unload race where waiter(s) trying to load the same
   module weren't being woken up when a module finally goes away.
 
 Signed-off-by: Jessica Yu <jeyu@kernel.org>
 -----BEGIN PGP SIGNATURE-----
 
 iQIcBAABCgAGBQJd6V3yAAoJEMBFfjjOO8FyeGEP/0Ue4uNehrDYQ6wHaLJOeSA3
 GEcraILbsT4v/9HqVbIaMH2idwwCI5xY6XlyDADaimYkEvs3jLOSsVEpjTvnjt0s
 DnNFR2vm+JsWVmS4jsmij2T6RgVfZq062RWJA1HvxtCsZWHFOttQe3gh9s/ycFAv
 UwGk0FUr4E78pUYNj+zQ35j4/L/C3Va2vC3VwSV4ND0kVTBrqcVHV6g3K409vgb8
 /ZD8/cFwVvOvGSK47M4r+Xt2X/57A/Cb0RgjvKHRfvONfyranKv9WlqM6Y6DXlZ0
 Su7eIo5kAH40/LUR2ludTSHLNcr/PWM4W2q8q81+gqF4h3KitYXXARWjKSLDwo/8
 nEq/rxJzEDX0bIgnSyU3t+ZqK2JonAF0a1D53otPPaSvTMPe1Gz48//cD6TGc3np
 xxLDZEPne/vbNUy3z2K1tXoWbxdThAhtCb8qOilVZBitPtnQpmUt2eyn1/2snoBR
 uerB/S8B48YI1TGxuK6Ksy5QIuJk9DG2o33nD5PPHe5dKEZQPAmSJDEwVaLzpW9b
 t9JoHo+H6BefKj0Sexf+1jlK9WKJEwGpqhZqfRkosACelxJJ3Ap3nuMsdNuZY+6U
 rAG8N322HV5x50weIId+t8AP8cdS+vRfh8PgvpvHY8YYXXeagOK49+snkJLAMgw0
 9Px3j20sNSmFfYloNUzW
 =XDci
 -----END PGP SIGNATURE-----
Merge tag 'modules-for-v5.5' of git://git.kernel.org/pub/scm/linux/kernel/git/jeyu/linux
Pull modules updates from Jessica Yu:
 "Summary of modules changes for the 5.5 merge window:
   - Refactor include/linux/export.h and remove code duplication between
     EXPORT_SYMBOL and EXPORT_SYMBOL_NS to make it more readable.
     The most notable change is that no namespace is represented by an
     empty string "" rather than NULL.
   - Fix a module load/unload race where waiter(s) trying to load the
     same module weren't being woken up when a module finally goes away"
* tag 'modules-for-v5.5' of git://git.kernel.org/pub/scm/linux/kernel/git/jeyu/linux:
  kernel/module.c: wakeup processes in module_wq on module unload
  moduleparam: fix parameter description mismatch
  export: avoid code duplication in include/linux/export.h
			
			
This commit is contained in:
		
						commit
						0f13741624
					
				| @ -47,7 +47,7 @@ extern struct module __this_module; | ||||
|  * absolute relocations that require runtime processing on relocatable | ||||
|  * kernels. | ||||
|  */ | ||||
| #define __KSYMTAB_ENTRY_NS(sym, sec)					\ | ||||
| #define __KSYMTAB_ENTRY(sym, sec)					\ | ||||
| 	__ADDRESSABLE(sym)						\ | ||||
| 	asm("	.section \"___ksymtab" sec "+" #sym "\", \"a\"	\n"	\ | ||||
| 	    "	.balign	4					\n"	\ | ||||
| @ -57,33 +57,17 @@ extern struct module __this_module; | ||||
| 	    "	.long	__kstrtabns_" #sym "- .			\n"	\ | ||||
| 	    "	.previous					\n") | ||||
| 
 | ||||
| #define __KSYMTAB_ENTRY(sym, sec)					\ | ||||
| 	__ADDRESSABLE(sym)						\ | ||||
| 	asm("	.section \"___ksymtab" sec "+" #sym "\", \"a\"	\n"	\ | ||||
| 	    "	.balign 4					\n"	\ | ||||
| 	    "__ksymtab_" #sym ":				\n"	\ | ||||
| 	    "	.long	" #sym "- .				\n"	\ | ||||
| 	    "	.long	__kstrtab_" #sym "- .			\n"	\ | ||||
| 	    "	.long	0					\n"	\ | ||||
| 	    "	.previous					\n") | ||||
| 
 | ||||
| struct kernel_symbol { | ||||
| 	int value_offset; | ||||
| 	int name_offset; | ||||
| 	int namespace_offset; | ||||
| }; | ||||
| #else | ||||
| #define __KSYMTAB_ENTRY_NS(sym, sec)					\ | ||||
| 	static const struct kernel_symbol __ksymtab_##sym		\ | ||||
| 	__attribute__((section("___ksymtab" sec "+" #sym), used))	\ | ||||
| 	__aligned(sizeof(void *))					\ | ||||
| 	= { (unsigned long)&sym, __kstrtab_##sym, __kstrtabns_##sym } | ||||
| 
 | ||||
| #define __KSYMTAB_ENTRY(sym, sec)					\ | ||||
| 	static const struct kernel_symbol __ksymtab_##sym		\ | ||||
| 	__attribute__((section("___ksymtab" sec "+" #sym), used))	\ | ||||
| 	__aligned(sizeof(void *))					\ | ||||
| 	= { (unsigned long)&sym, __kstrtab_##sym, NULL } | ||||
| 	= { (unsigned long)&sym, __kstrtab_##sym, __kstrtabns_##sym } | ||||
| 
 | ||||
| struct kernel_symbol { | ||||
| 	unsigned long value; | ||||
| @ -94,28 +78,20 @@ struct kernel_symbol { | ||||
| 
 | ||||
| #ifdef __GENKSYMS__ | ||||
| 
 | ||||
| #define ___EXPORT_SYMBOL(sym,sec)	__GENKSYMS_EXPORT_SYMBOL(sym) | ||||
| #define ___EXPORT_SYMBOL_NS(sym,sec,ns)	__GENKSYMS_EXPORT_SYMBOL(sym) | ||||
| #define ___EXPORT_SYMBOL(sym, sec, ns)	__GENKSYMS_EXPORT_SYMBOL(sym) | ||||
| 
 | ||||
| #else | ||||
| 
 | ||||
| #define ___export_symbol_common(sym, sec)				\ | ||||
| /* For every exported symbol, place a struct in the __ksymtab section */ | ||||
| #define ___EXPORT_SYMBOL(sym, sec, ns)					\ | ||||
| 	extern typeof(sym) sym;						\ | ||||
| 	__CRC_SYMBOL(sym, sec);						\ | ||||
| 	static const char __kstrtab_##sym[]				\ | ||||
| 	__attribute__((section("__ksymtab_strings"), used, aligned(1)))	\ | ||||
| 	= #sym								\ | ||||
| 
 | ||||
| /* For every exported symbol, place a struct in the __ksymtab section */ | ||||
| #define ___EXPORT_SYMBOL_NS(sym, sec, ns)				\ | ||||
| 	___export_symbol_common(sym, sec);				\ | ||||
| 	= #sym;								\ | ||||
| 	static const char __kstrtabns_##sym[]				\ | ||||
| 	__attribute__((section("__ksymtab_strings"), used, aligned(1)))	\ | ||||
| 	= #ns;								\ | ||||
| 	__KSYMTAB_ENTRY_NS(sym, sec) | ||||
| 
 | ||||
| #define ___EXPORT_SYMBOL(sym, sec)					\ | ||||
| 	___export_symbol_common(sym, sec);				\ | ||||
| 	= ns;								\ | ||||
| 	__KSYMTAB_ENTRY(sym, sec) | ||||
| 
 | ||||
| #endif | ||||
| @ -127,8 +103,7 @@ struct kernel_symbol { | ||||
|  * be reused in other execution contexts such as the UEFI stub or the | ||||
|  * decompressor. | ||||
|  */ | ||||
| #define __EXPORT_SYMBOL_NS(sym, sec, ns) | ||||
| #define __EXPORT_SYMBOL(sym, sec) | ||||
| #define __EXPORT_SYMBOL(sym, sec, ns) | ||||
| 
 | ||||
| #elif defined(CONFIG_TRIM_UNUSED_KSYMS) | ||||
| 
 | ||||
| @ -144,48 +119,38 @@ struct kernel_symbol { | ||||
| #define __ksym_marker(sym)	\ | ||||
| 	static int __ksym_marker_##sym[0] __section(".discard.ksym") __used | ||||
| 
 | ||||
| #define __EXPORT_SYMBOL(sym, sec)				\ | ||||
| 	__ksym_marker(sym);					\ | ||||
| 	__cond_export_sym(sym, sec, __is_defined(__KSYM_##sym)) | ||||
| #define __cond_export_sym(sym, sec, conf)			\ | ||||
| 	___cond_export_sym(sym, sec, conf) | ||||
| #define ___cond_export_sym(sym, sec, enabled)			\ | ||||
| 	__cond_export_sym_##enabled(sym, sec) | ||||
| #define __cond_export_sym_1(sym, sec) ___EXPORT_SYMBOL(sym, sec) | ||||
| #define __cond_export_sym_0(sym, sec) /* nothing */ | ||||
| 
 | ||||
| #define __EXPORT_SYMBOL_NS(sym, sec, ns)				\ | ||||
| #define __EXPORT_SYMBOL(sym, sec, ns)					\ | ||||
| 	__ksym_marker(sym);						\ | ||||
| 	__cond_export_ns_sym(sym, sec, ns, __is_defined(__KSYM_##sym)) | ||||
| #define __cond_export_ns_sym(sym, sec, ns, conf)			\ | ||||
| 	___cond_export_ns_sym(sym, sec, ns, conf) | ||||
| #define ___cond_export_ns_sym(sym, sec, ns, enabled)			\ | ||||
| 	__cond_export_ns_sym_##enabled(sym, sec, ns) | ||||
| #define __cond_export_ns_sym_1(sym, sec, ns) ___EXPORT_SYMBOL_NS(sym, sec, ns) | ||||
| #define __cond_export_ns_sym_0(sym, sec, ns) /* nothing */ | ||||
| 	__cond_export_sym(sym, sec, ns, __is_defined(__KSYM_##sym)) | ||||
| #define __cond_export_sym(sym, sec, ns, conf)				\ | ||||
| 	___cond_export_sym(sym, sec, ns, conf) | ||||
| #define ___cond_export_sym(sym, sec, ns, enabled)			\ | ||||
| 	__cond_export_sym_##enabled(sym, sec, ns) | ||||
| #define __cond_export_sym_1(sym, sec, ns) ___EXPORT_SYMBOL(sym, sec, ns) | ||||
| #define __cond_export_sym_0(sym, sec, ns) /* nothing */ | ||||
| 
 | ||||
| #else | ||||
| 
 | ||||
| #define __EXPORT_SYMBOL_NS(sym,sec,ns)	___EXPORT_SYMBOL_NS(sym,sec,ns) | ||||
| #define __EXPORT_SYMBOL(sym,sec)	___EXPORT_SYMBOL(sym,sec) | ||||
| #define __EXPORT_SYMBOL(sym, sec, ns)	___EXPORT_SYMBOL(sym, sec, ns) | ||||
| 
 | ||||
| #endif /* CONFIG_MODULES */ | ||||
| 
 | ||||
| #ifdef DEFAULT_SYMBOL_NAMESPACE | ||||
| #undef __EXPORT_SYMBOL | ||||
| #define __EXPORT_SYMBOL(sym, sec)				\ | ||||
| 	__EXPORT_SYMBOL_NS(sym, sec, DEFAULT_SYMBOL_NAMESPACE) | ||||
| #include <linux/stringify.h> | ||||
| #define _EXPORT_SYMBOL(sym, sec)	__EXPORT_SYMBOL(sym, sec, __stringify(DEFAULT_SYMBOL_NAMESPACE)) | ||||
| #else | ||||
| #define _EXPORT_SYMBOL(sym, sec)	__EXPORT_SYMBOL(sym, sec, "") | ||||
| #endif | ||||
| 
 | ||||
| #define EXPORT_SYMBOL(sym)		__EXPORT_SYMBOL(sym, "") | ||||
| #define EXPORT_SYMBOL_GPL(sym)		__EXPORT_SYMBOL(sym, "_gpl") | ||||
| #define EXPORT_SYMBOL_GPL_FUTURE(sym)	__EXPORT_SYMBOL(sym, "_gpl_future") | ||||
| #define EXPORT_SYMBOL_NS(sym, ns)	__EXPORT_SYMBOL_NS(sym, "", ns) | ||||
| #define EXPORT_SYMBOL_NS_GPL(sym, ns)	__EXPORT_SYMBOL_NS(sym, "_gpl", ns) | ||||
| #define EXPORT_SYMBOL(sym)		_EXPORT_SYMBOL(sym, "") | ||||
| #define EXPORT_SYMBOL_GPL(sym)		_EXPORT_SYMBOL(sym, "_gpl") | ||||
| #define EXPORT_SYMBOL_GPL_FUTURE(sym)	_EXPORT_SYMBOL(sym, "_gpl_future") | ||||
| #define EXPORT_SYMBOL_NS(sym, ns)	__EXPORT_SYMBOL(sym, "", #ns) | ||||
| #define EXPORT_SYMBOL_NS_GPL(sym, ns)	__EXPORT_SYMBOL(sym, "_gpl", #ns) | ||||
| 
 | ||||
| #ifdef CONFIG_UNUSED_SYMBOLS | ||||
| #define EXPORT_UNUSED_SYMBOL(sym)	__EXPORT_SYMBOL(sym, "_unused") | ||||
| #define EXPORT_UNUSED_SYMBOL_GPL(sym)	__EXPORT_SYMBOL(sym, "_unused_gpl") | ||||
| #define EXPORT_UNUSED_SYMBOL(sym)	_EXPORT_SYMBOL(sym, "_unused") | ||||
| #define EXPORT_UNUSED_SYMBOL_GPL(sym)	_EXPORT_SYMBOL(sym, "_unused_gpl") | ||||
| #else | ||||
| #define EXPORT_UNUSED_SYMBOL(sym) | ||||
| #define EXPORT_UNUSED_SYMBOL_GPL(sym) | ||||
|  | ||||
| @ -100,11 +100,11 @@ struct kparam_array | ||||
| 
 | ||||
| /**
 | ||||
|  * module_param - typesafe helper for a module/cmdline parameter | ||||
|  * @value: the variable to alter, and exposed parameter name. | ||||
|  * @name: the variable to alter, and exposed parameter name. | ||||
|  * @type: the type of the parameter | ||||
|  * @perm: visibility in sysfs. | ||||
|  * | ||||
|  * @value becomes the module parameter, or (prefixed by KBUILD_MODNAME and a | ||||
|  * @name becomes the module parameter, or (prefixed by KBUILD_MODNAME and a | ||||
|  * ".") the kernel commandline parameter.  Note that - is changed to _, so | ||||
|  * the user can use "foo-bar=1" even for variable "foo_bar". | ||||
|  * | ||||
|  | ||||
| @ -1033,6 +1033,8 @@ SYSCALL_DEFINE2(delete_module, const char __user *, name_user, | ||||
| 	strlcpy(last_unloaded_module, mod->name, sizeof(last_unloaded_module)); | ||||
| 
 | ||||
| 	free_module(mod); | ||||
| 	/* someone could wait for the module in add_unformed_module() */ | ||||
| 	wake_up_all(&module_wq); | ||||
| 	return 0; | ||||
| out: | ||||
| 	mutex_unlock(&module_mutex); | ||||
| @ -1400,7 +1402,7 @@ static int verify_namespace_is_imported(const struct load_info *info, | ||||
| 	char *imported_namespace; | ||||
| 
 | ||||
| 	namespace = kernel_symbol_namespace(sym); | ||||
| 	if (namespace) { | ||||
| 	if (namespace && namespace[0]) { | ||||
| 		imported_namespace = get_modinfo(info, "import_ns"); | ||||
| 		while (imported_namespace) { | ||||
| 			if (strcmp(namespace, imported_namespace) == 0) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user