Commit 6ef192f2 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'modules-for-v4.11' of git://git.kernel.org/pub/scm/linux/kernel/git/jeyu/linux

Pull modules updates from Jessica Yu:
 "Summary of modules changes for the 4.11 merge window:

   - A few small code cleanups

   - Add modules git tree url to MAINTAINERS"

* tag 'modules-for-v4.11' of git://git.kernel.org/pub/scm/linux/kernel/git/jeyu/linux:
  MAINTAINERS: add tree for modules
  module: fix memory leak on early load_module() failures
  module: Optimize search_module_extables()
  modules: mark __inittest/__exittest as __maybe_unused
  livepatch/module: print notice of TAINT_LIVEPATCH
  module: Drop redundant declaration of struct module
parents 37c85961 0d4ec784
...@@ -8364,6 +8364,7 @@ F: drivers/media/dvb-frontends/mn88473* ...@@ -8364,6 +8364,7 @@ F: drivers/media/dvb-frontends/mn88473*
MODULE SUPPORT MODULE SUPPORT
M: Jessica Yu <jeyu@redhat.com> M: Jessica Yu <jeyu@redhat.com>
M: Rusty Russell <rusty@rustcorp.com.au> M: Rusty Russell <rusty@rustcorp.com.au>
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jeyu/linux.git modules-next
S: Maintained S: Maintained
F: include/linux/module.h F: include/linux/module.h
F: kernel/module.c F: kernel/module.c
......
...@@ -126,13 +126,13 @@ extern void cleanup_module(void); ...@@ -126,13 +126,13 @@ extern void cleanup_module(void);
/* Each module must use one module_init(). */ /* Each module must use one module_init(). */
#define module_init(initfn) \ #define module_init(initfn) \
static inline initcall_t __inittest(void) \ static inline initcall_t __maybe_unused __inittest(void) \
{ return initfn; } \ { return initfn; } \
int init_module(void) __attribute__((alias(#initfn))); int init_module(void) __attribute__((alias(#initfn)));
/* This is only required if you want to be unloadable. */ /* This is only required if you want to be unloadable. */
#define module_exit(exitfn) \ #define module_exit(exitfn) \
static inline exitcall_t __exittest(void) \ static inline exitcall_t __maybe_unused __exittest(void) \
{ return exitfn; } \ { return exitfn; } \
void cleanup_module(void) __attribute__((alias(#exitfn))); void cleanup_module(void) __attribute__((alias(#exitfn)));
...@@ -281,8 +281,6 @@ enum module_state { ...@@ -281,8 +281,6 @@ enum module_state {
MODULE_STATE_UNFORMED, /* Still setting it up. */ MODULE_STATE_UNFORMED, /* Still setting it up. */
}; };
struct module;
struct mod_tree_node { struct mod_tree_node {
struct module *mod; struct module *mod;
struct latch_tree_node node; struct latch_tree_node node;
......
...@@ -2811,6 +2811,8 @@ static int check_modinfo_livepatch(struct module *mod, struct load_info *info) ...@@ -2811,6 +2811,8 @@ static int check_modinfo_livepatch(struct module *mod, struct load_info *info)
if (get_modinfo(info, "livepatch")) { if (get_modinfo(info, "livepatch")) {
mod->klp = true; mod->klp = true;
add_taint_module(mod, TAINT_LIVEPATCH, LOCKDEP_STILL_OK); add_taint_module(mod, TAINT_LIVEPATCH, LOCKDEP_STILL_OK);
pr_notice_once("%s: tainting kernel with TAINT_LIVEPATCH\n",
mod->name);
} }
return 0; return 0;
...@@ -3723,6 +3725,7 @@ static int load_module(struct load_info *info, const char __user *uargs, ...@@ -3723,6 +3725,7 @@ static int load_module(struct load_info *info, const char __user *uargs,
mod_sysfs_teardown(mod); mod_sysfs_teardown(mod);
coming_cleanup: coming_cleanup:
mod->state = MODULE_STATE_GOING; mod->state = MODULE_STATE_GOING;
destroy_params(mod->kp, mod->num_kp);
blocking_notifier_call_chain(&module_notify_list, blocking_notifier_call_chain(&module_notify_list,
MODULE_STATE_GOING, mod); MODULE_STATE_GOING, mod);
klp_module_going(mod); klp_module_going(mod);
...@@ -4169,22 +4172,23 @@ const struct exception_table_entry *search_module_extables(unsigned long addr) ...@@ -4169,22 +4172,23 @@ const struct exception_table_entry *search_module_extables(unsigned long addr)
struct module *mod; struct module *mod;
preempt_disable(); preempt_disable();
list_for_each_entry_rcu(mod, &modules, list) { mod = __module_address(addr);
if (mod->state == MODULE_STATE_UNFORMED) if (!mod)
continue; goto out;
if (mod->num_exentries == 0)
continue;
e = search_extable(mod->extable, if (!mod->num_exentries)
mod->extable + mod->num_exentries - 1, goto out;
addr);
if (e) e = search_extable(mod->extable,
break; mod->extable + mod->num_exentries - 1,
} addr);
out:
preempt_enable(); preempt_enable();
/* Now, if we found one, we are running inside it now, hence /*
we cannot unload the module, hence no refcnt needed. */ * Now, if we found one, we are running inside it now, hence
* we cannot unload the module, hence no refcnt needed.
*/
return e; return e;
} }
......
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