forked from Minki/linux
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