Merge tag 'locking-urgent-2020-12-27' of git://git.kernel.org/pub/scm/linux/kernel...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sun, 27 Dec 2020 17:06:10 +0000 (09:06 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sun, 27 Dec 2020 17:06:10 +0000 (09:06 -0800)
Pull locking fixes from Ingo Molnar:
 "Misc fixes/updates:

   - Fix static keys usage in module __init sections

   - Add separate MAINTAINERS entry for static branches/calls

   - Fix lockdep splat with CONFIG_PREEMPTIRQ_EVENTS=y tracing"

* tag 'locking-urgent-2020-12-27' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  softirq: Avoid bad tracing / lockdep interaction
  jump_label/static_call: Add MAINTAINERS
  jump_label: Fix usage in module __init

MAINTAINERS
kernel/jump_label.c
kernel/softirq.c

index 154c870..546aa66 100644 (file)
@@ -16917,6 +16917,22 @@ M:     Ion Badulescu <ionut@badula.org>
 S:     Odd Fixes
 F:     drivers/net/ethernet/adaptec/starfire*
 
+STATIC BRANCH/CALL
+M:     Peter Zijlstra <peterz@infradead.org>
+M:     Josh Poimboeuf <jpoimboe@redhat.com>
+M:     Jason Baron <jbaron@akamai.com>
+R:     Steven Rostedt <rostedt@goodmis.org>
+R:     Ard Biesheuvel <ardb@kernel.org>
+S:     Supported
+F:     arch/*/include/asm/jump_label*.h
+F:     arch/*/include/asm/static_call*.h
+F:     arch/*/kernel/jump_label.c
+F:     arch/*/kernel/static_call.c
+F:     include/linux/jump_label*.h
+F:     include/linux/static_call*.h
+F:     kernel/jump_label.c
+F:     kernel/static_call.c
+
 STEC S1220 SKD DRIVER
 M:     Damien Le Moal <Damien.LeMoal@wdc.com>
 L:     linux-block@vger.kernel.org
index 015ef90..c6a39d6 100644 (file)
@@ -793,6 +793,7 @@ int jump_label_text_reserved(void *start, void *end)
 static void jump_label_update(struct static_key *key)
 {
        struct jump_entry *stop = __stop___jump_table;
+       bool init = system_state < SYSTEM_RUNNING;
        struct jump_entry *entry;
 #ifdef CONFIG_MODULES
        struct module *mod;
@@ -804,15 +805,16 @@ static void jump_label_update(struct static_key *key)
 
        preempt_disable();
        mod = __module_address((unsigned long)key);
-       if (mod)
+       if (mod) {
                stop = mod->jump_entries + mod->num_jump_entries;
+               init = mod->state == MODULE_STATE_COMING;
+       }
        preempt_enable();
 #endif
        entry = static_key_entries(key);
        /* if there are no users, entry can be NULL */
        if (entry)
-               __jump_label_update(key, entry, stop,
-                                   system_state < SYSTEM_RUNNING);
+               __jump_label_update(key, entry, stop, init);
 }
 
 #ifdef CONFIG_STATIC_KEYS_SELFTEST
index d5bfd5e..9d71046 100644 (file)
@@ -186,7 +186,7 @@ void __local_bh_enable_ip(unsigned long ip, unsigned int cnt)
         * Keep preemption disabled until we are done with
         * softirq processing:
         */
-       preempt_count_sub(cnt - 1);
+       __preempt_count_sub(cnt - 1);
 
        if (unlikely(!in_interrupt() && local_softirq_pending())) {
                /*