Commit 0f137416 authored by Linus Torvalds's avatar Linus Torvalds

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
parents 25cfb0c7 5d603311
...@@ -47,7 +47,7 @@ extern struct module __this_module; ...@@ -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; ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 ...@@ -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, ...@@ -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, ...@@ -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)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment