mirror of
https://gitee.com/bianbu-linux/linux-6.6
synced 2025-04-24 14:07:52 -04:00
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
3 changed files with 33 additions and 66 deletions
|
@ -47,7 +47,7 @@ extern struct module __this_module;
|
||||||
* absolute relocations that require runtime processing on relocatable
|
* absolute relocations that require runtime processing on relocatable
|
||||||
* kernels.
|
* kernels.
|
||||||
*/
|
*/
|
||||||
#define __KSYMTAB_ENTRY_NS(sym, sec) \
|
#define __KSYMTAB_ENTRY(sym, sec) \
|
||||||
__ADDRESSABLE(sym) \
|
__ADDRESSABLE(sym) \
|
||||||
asm(" .section \"___ksymtab" sec "+" #sym "\", \"a\" \n" \
|
asm(" .section \"___ksymtab" sec "+" #sym "\", \"a\" \n" \
|
||||||
" .balign 4 \n" \
|
" .balign 4 \n" \
|
||||||
|
@ -57,33 +57,17 @@ extern struct module __this_module;
|
||||||
" .long __kstrtabns_" #sym "- . \n" \
|
" .long __kstrtabns_" #sym "- . \n" \
|
||||||
" .previous \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 {
|
struct kernel_symbol {
|
||||||
int value_offset;
|
int value_offset;
|
||||||
int name_offset;
|
int name_offset;
|
||||||
int namespace_offset;
|
int namespace_offset;
|
||||||
};
|
};
|
||||||
#else
|
#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) \
|
#define __KSYMTAB_ENTRY(sym, sec) \
|
||||||
static const struct kernel_symbol __ksymtab_##sym \
|
static const struct kernel_symbol __ksymtab_##sym \
|
||||||
__attribute__((section("___ksymtab" sec "+" #sym), used)) \
|
__attribute__((section("___ksymtab" sec "+" #sym), used)) \
|
||||||
__aligned(sizeof(void *)) \
|
__aligned(sizeof(void *)) \
|
||||||
= { (unsigned long)&sym, __kstrtab_##sym, NULL }
|
= { (unsigned long)&sym, __kstrtab_##sym, __kstrtabns_##sym }
|
||||||
|
|
||||||
struct kernel_symbol {
|
struct kernel_symbol {
|
||||||
unsigned long value;
|
unsigned long value;
|
||||||
|
@ -94,28 +78,20 @@ struct kernel_symbol {
|
||||||
|
|
||||||
#ifdef __GENKSYMS__
|
#ifdef __GENKSYMS__
|
||||||
|
|
||||||
#define ___EXPORT_SYMBOL(sym,sec) __GENKSYMS_EXPORT_SYMBOL(sym)
|
#define ___EXPORT_SYMBOL(sym, sec, ns) __GENKSYMS_EXPORT_SYMBOL(sym)
|
||||||
#define ___EXPORT_SYMBOL_NS(sym,sec,ns) __GENKSYMS_EXPORT_SYMBOL(sym)
|
|
||||||
|
|
||||||
#else
|
#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; \
|
extern typeof(sym) sym; \
|
||||||
__CRC_SYMBOL(sym, sec); \
|
__CRC_SYMBOL(sym, sec); \
|
||||||
static const char __kstrtab_##sym[] \
|
static const char __kstrtab_##sym[] \
|
||||||
__attribute__((section("__ksymtab_strings"), used, aligned(1))) \
|
__attribute__((section("__ksymtab_strings"), used, aligned(1))) \
|
||||||
= #sym \
|
= #sym; \
|
||||||
|
|
||||||
/* For every exported symbol, place a struct in the __ksymtab section */
|
|
||||||
#define ___EXPORT_SYMBOL_NS(sym, sec, ns) \
|
|
||||||
___export_symbol_common(sym, sec); \
|
|
||||||
static const char __kstrtabns_##sym[] \
|
static const char __kstrtabns_##sym[] \
|
||||||
__attribute__((section("__ksymtab_strings"), used, aligned(1))) \
|
__attribute__((section("__ksymtab_strings"), used, aligned(1))) \
|
||||||
= #ns; \
|
= ns; \
|
||||||
__KSYMTAB_ENTRY_NS(sym, sec)
|
|
||||||
|
|
||||||
#define ___EXPORT_SYMBOL(sym, sec) \
|
|
||||||
___export_symbol_common(sym, sec); \
|
|
||||||
__KSYMTAB_ENTRY(sym, sec)
|
__KSYMTAB_ENTRY(sym, sec)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -127,8 +103,7 @@ struct kernel_symbol {
|
||||||
* be reused in other execution contexts such as the UEFI stub or the
|
* be reused in other execution contexts such as the UEFI stub or the
|
||||||
* decompressor.
|
* decompressor.
|
||||||
*/
|
*/
|
||||||
#define __EXPORT_SYMBOL_NS(sym, sec, ns)
|
#define __EXPORT_SYMBOL(sym, sec, ns)
|
||||||
#define __EXPORT_SYMBOL(sym, sec)
|
|
||||||
|
|
||||||
#elif defined(CONFIG_TRIM_UNUSED_KSYMS)
|
#elif defined(CONFIG_TRIM_UNUSED_KSYMS)
|
||||||
|
|
||||||
|
@ -144,48 +119,38 @@ struct kernel_symbol {
|
||||||
#define __ksym_marker(sym) \
|
#define __ksym_marker(sym) \
|
||||||
static int __ksym_marker_##sym[0] __section(".discard.ksym") __used
|
static int __ksym_marker_##sym[0] __section(".discard.ksym") __used
|
||||||
|
|
||||||
#define __EXPORT_SYMBOL(sym, sec) \
|
#define __EXPORT_SYMBOL(sym, sec, ns) \
|
||||||
__ksym_marker(sym); \
|
__ksym_marker(sym); \
|
||||||
__cond_export_sym(sym, sec, __is_defined(__KSYM_##sym))
|
__cond_export_sym(sym, sec, ns, __is_defined(__KSYM_##sym))
|
||||||
#define __cond_export_sym(sym, sec, conf) \
|
#define __cond_export_sym(sym, sec, ns, conf) \
|
||||||
___cond_export_sym(sym, sec, conf)
|
___cond_export_sym(sym, sec, ns, conf)
|
||||||
#define ___cond_export_sym(sym, sec, enabled) \
|
#define ___cond_export_sym(sym, sec, ns, enabled) \
|
||||||
__cond_export_sym_##enabled(sym, sec)
|
__cond_export_sym_##enabled(sym, sec, ns)
|
||||||
#define __cond_export_sym_1(sym, sec) ___EXPORT_SYMBOL(sym, sec)
|
#define __cond_export_sym_1(sym, sec, ns) ___EXPORT_SYMBOL(sym, sec, ns)
|
||||||
#define __cond_export_sym_0(sym, sec) /* nothing */
|
#define __cond_export_sym_0(sym, sec, ns) /* nothing */
|
||||||
|
|
||||||
#define __EXPORT_SYMBOL_NS(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 */
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define __EXPORT_SYMBOL_NS(sym,sec,ns) ___EXPORT_SYMBOL_NS(sym,sec,ns)
|
#define __EXPORT_SYMBOL(sym, sec, ns) ___EXPORT_SYMBOL(sym, sec, ns)
|
||||||
#define __EXPORT_SYMBOL(sym,sec) ___EXPORT_SYMBOL(sym,sec)
|
|
||||||
|
|
||||||
#endif /* CONFIG_MODULES */
|
#endif /* CONFIG_MODULES */
|
||||||
|
|
||||||
#ifdef DEFAULT_SYMBOL_NAMESPACE
|
#ifdef DEFAULT_SYMBOL_NAMESPACE
|
||||||
#undef __EXPORT_SYMBOL
|
#include <linux/stringify.h>
|
||||||
#define __EXPORT_SYMBOL(sym, sec) \
|
#define _EXPORT_SYMBOL(sym, sec) __EXPORT_SYMBOL(sym, sec, __stringify(DEFAULT_SYMBOL_NAMESPACE))
|
||||||
__EXPORT_SYMBOL_NS(sym, sec, DEFAULT_SYMBOL_NAMESPACE)
|
#else
|
||||||
|
#define _EXPORT_SYMBOL(sym, sec) __EXPORT_SYMBOL(sym, sec, "")
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define EXPORT_SYMBOL(sym) __EXPORT_SYMBOL(sym, "")
|
#define EXPORT_SYMBOL(sym) _EXPORT_SYMBOL(sym, "")
|
||||||
#define EXPORT_SYMBOL_GPL(sym) __EXPORT_SYMBOL(sym, "_gpl")
|
#define EXPORT_SYMBOL_GPL(sym) _EXPORT_SYMBOL(sym, "_gpl")
|
||||||
#define EXPORT_SYMBOL_GPL_FUTURE(sym) __EXPORT_SYMBOL(sym, "_gpl_future")
|
#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(sym, ns) __EXPORT_SYMBOL(sym, "", #ns)
|
||||||
#define EXPORT_SYMBOL_NS_GPL(sym, ns) __EXPORT_SYMBOL_NS(sym, "_gpl", ns)
|
#define EXPORT_SYMBOL_NS_GPL(sym, ns) __EXPORT_SYMBOL(sym, "_gpl", #ns)
|
||||||
|
|
||||||
#ifdef CONFIG_UNUSED_SYMBOLS
|
#ifdef CONFIG_UNUSED_SYMBOLS
|
||||||
#define EXPORT_UNUSED_SYMBOL(sym) __EXPORT_SYMBOL(sym, "_unused")
|
#define EXPORT_UNUSED_SYMBOL(sym) _EXPORT_SYMBOL(sym, "_unused")
|
||||||
#define EXPORT_UNUSED_SYMBOL_GPL(sym) __EXPORT_SYMBOL(sym, "_unused_gpl")
|
#define EXPORT_UNUSED_SYMBOL_GPL(sym) _EXPORT_SYMBOL(sym, "_unused_gpl")
|
||||||
#else
|
#else
|
||||||
#define EXPORT_UNUSED_SYMBOL(sym)
|
#define EXPORT_UNUSED_SYMBOL(sym)
|
||||||
#define EXPORT_UNUSED_SYMBOL_GPL(sym)
|
#define EXPORT_UNUSED_SYMBOL_GPL(sym)
|
||||||
|
|
|
@ -100,11 +100,11 @@ struct kparam_array
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* module_param - typesafe helper for a module/cmdline parameter
|
* 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
|
* @type: the type of the parameter
|
||||||
* @perm: visibility in sysfs.
|
* @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 kernel commandline parameter. Note that - is changed to _, so
|
||||||
* the user can use "foo-bar=1" even for variable "foo_bar".
|
* 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));
|
strlcpy(last_unloaded_module, mod->name, sizeof(last_unloaded_module));
|
||||||
|
|
||||||
free_module(mod);
|
free_module(mod);
|
||||||
|
/* someone could wait for the module in add_unformed_module() */
|
||||||
|
wake_up_all(&module_wq);
|
||||||
return 0;
|
return 0;
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&module_mutex);
|
mutex_unlock(&module_mutex);
|
||||||
|
@ -1400,7 +1402,7 @@ static int verify_namespace_is_imported(const struct load_info *info,
|
||||||
char *imported_namespace;
|
char *imported_namespace;
|
||||||
|
|
||||||
namespace = kernel_symbol_namespace(sym);
|
namespace = kernel_symbol_namespace(sym);
|
||||||
if (namespace) {
|
if (namespace && namespace[0]) {
|
||||||
imported_namespace = get_modinfo(info, "import_ns");
|
imported_namespace = get_modinfo(info, "import_ns");
|
||||||
while (imported_namespace) {
|
while (imported_namespace) {
|
||||||
if (strcmp(namespace, imported_namespace) == 0)
|
if (strcmp(namespace, imported_namespace) == 0)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue