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:
@@ -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); \
|
|
||||||
__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) \
|
|
||||||
__ksym_marker(sym); \
|
__ksym_marker(sym); \
|
||||||
__cond_export_ns_sym(sym, sec, ns, __is_defined(__KSYM_##sym))
|
__cond_export_sym(sym, sec, ns, __is_defined(__KSYM_##sym))
|
||||||
#define __cond_export_ns_sym(sym, sec, ns, conf) \
|
#define __cond_export_sym(sym, sec, ns, conf) \
|
||||||
___cond_export_ns_sym(sym, sec, ns, conf)
|
___cond_export_sym(sym, sec, ns, conf)
|
||||||
#define ___cond_export_ns_sym(sym, sec, ns, enabled) \
|
#define ___cond_export_sym(sym, sec, ns, enabled) \
|
||||||
__cond_export_ns_sym_##enabled(sym, sec, ns)
|
__cond_export_sym_##enabled(sym, sec, ns)
|
||||||
#define __cond_export_ns_sym_1(sym, sec, ns) ___EXPORT_SYMBOL_NS(sym, sec, ns)
|
#define __cond_export_sym_1(sym, sec, ns) ___EXPORT_SYMBOL(sym, sec, ns)
|
||||||
#define __cond_export_ns_sym_0(sym, sec, ns) /* nothing */
|
#define __cond_export_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)
|
||||||
|
Reference in New Issue
Block a user