jump_label: disable preemption around __module_text_address().
authorRusty Russell <rusty@rustcorp.com.au>
Wed, 27 Jul 2016 02:47:35 +0000 (12:17 +0930)
committerRusty Russell <rusty@rustcorp.com.au>
Thu, 4 Aug 2016 00:46:54 +0000 (10:16 +0930)
Steven reported a warning caused by not holding module_mutex or
rcu_read_lock_sched: his backtrace was corrupted but a quick audit
found this possible cause.  It's wrong anyway...

Reported-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
kernel/jump_label.c

index 0dbea887d6258522e7c2c10692f24ced83b51b8c..0eef93962a91b7a4518f3a36f4abd190db4a50f5 100644 (file)
@@ -284,11 +284,14 @@ static int __jump_label_mod_text_reserved(void *start, void *end)
 {
        struct module *mod;
 
+       preempt_disable();
        mod = __module_text_address((unsigned long)start);
+       WARN_ON_ONCE(__module_text_address((unsigned long)end) != mod);
+       preempt_enable();
+
        if (!mod)
                return 0;
 
-       WARN_ON_ONCE(__module_text_address((unsigned long)end) != mod);
 
        return __jump_label_text_reserved(mod->jump_entries,
                                mod->jump_entries + mod->num_jump_entries,