aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorSteven Rostedt <rostedt@goodmis.org>2010-11-29 13:15:42 -0500
committerSteven Rostedt <rostedt@goodmis.org>2010-12-23 09:56:00 -0500
commit94462ad3b14739d158a1ab87bb30008c1e5a6bc1 (patch)
tree8000c108bdd4e8d298bce6b5acd2660e96edd6aa /kernel
parent26e20a108caca6231c6a5ec659f815a866904751 (diff)
module: Move RO/NX module protection to after ftrace module update
The commit: 84e1c6bb38eb318e456558b610396d9f1afaabf0 x86: Add RO/NX protection for loadable kernel modules Broke the function tracer with this output: ------------[ cut here ]------------ WARNING: at kernel/trace/ftrace.c:1014 ftrace_bug+0x114/0x171() Hardware name: Precision WorkStation 470 Modules linked in: i2c_core(+) Pid: 86, comm: modprobe Not tainted 2.6.37-rc2+ #68 Call Trace: [<ffffffff8104e957>] warn_slowpath_common+0x85/0x9d [<ffffffffa00026db>] ? __process_new_adapter+0x7/0x34 [i2c_core] [<ffffffffa00026db>] ? __process_new_adapter+0x7/0x34 [i2c_core] [<ffffffff8104e989>] warn_slowpath_null+0x1a/0x1c [<ffffffff810a9dfe>] ftrace_bug+0x114/0x171 [<ffffffffa00026db>] ? __process_new_adapter+0x7/0x34 [i2c_core] [<ffffffff810aa0db>] ftrace_process_locs+0x1ae/0x274 [<ffffffffa00026db>] ? __process_new_adapter+0x7/0x34 [i2c_core] [<ffffffff810aa29e>] ftrace_module_notify+0x39/0x44 [<ffffffff814405cf>] notifier_call_chain+0x37/0x63 [<ffffffff8106e054>] __blocking_notifier_call_chain+0x46/0x5b [<ffffffff8106e07d>] blocking_notifier_call_chain+0x14/0x16 [<ffffffff8107ffde>] sys_init_module+0x73/0x1f3 [<ffffffff8100acf2>] system_call_fastpath+0x16/0x1b ---[ end trace 2aff4f4ca53ec746 ]--- ftrace faulted on writing [<ffffffffa00026db>] __process_new_adapter+0x7/0x34 [i2c_core] The cause was that the module text was set to read only before ftrace could convert the calls to mcount to nops. Thus, the conversions failed due to not being able to write to the text locations. The simple fix is to move setting the module to read only after the module notifiers are called (where ftrace sets the module mcounts to nops). Reported-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Acked-by: Rusty Russell <rusty@rustcorp.com.au> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/module.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/kernel/module.c b/kernel/module.c
index 562f665c721f..34e00b708fad 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -2816,18 +2816,6 @@ static struct module *load_module(void __user *umod,
2816 kfree(info.strmap); 2816 kfree(info.strmap);
2817 free_copy(&info); 2817 free_copy(&info);
2818 2818
2819 /* Set RO and NX regions for core */
2820 set_section_ro_nx(mod->module_core,
2821 mod->core_text_size,
2822 mod->core_ro_size,
2823 mod->core_size);
2824
2825 /* Set RO and NX regions for init */
2826 set_section_ro_nx(mod->module_init,
2827 mod->init_text_size,
2828 mod->init_ro_size,
2829 mod->init_size);
2830
2831 /* Done! */ 2819 /* Done! */
2832 trace_module_load(mod); 2820 trace_module_load(mod);
2833 return mod; 2821 return mod;
@@ -2888,6 +2876,18 @@ SYSCALL_DEFINE3(init_module, void __user *, umod,
2888 blocking_notifier_call_chain(&module_notify_list, 2876 blocking_notifier_call_chain(&module_notify_list,
2889 MODULE_STATE_COMING, mod); 2877 MODULE_STATE_COMING, mod);
2890 2878
2879 /* Set RO and NX regions for core */
2880 set_section_ro_nx(mod->module_core,
2881 mod->core_text_size,
2882 mod->core_ro_size,
2883 mod->core_size);
2884
2885 /* Set RO and NX regions for init */
2886 set_section_ro_nx(mod->module_init,
2887 mod->init_text_size,
2888 mod->init_ro_size,
2889 mod->init_size);
2890
2891 do_mod_ctors(mod); 2891 do_mod_ctors(mod);
2892 /* Start the module */ 2892 /* Start the module */
2893 if (mod->init != NULL) 2893 if (mod->init != NULL)