• Daniel Wagner's avatar
    rcu: Do not call rcu_nocb_gp_cleanup() while holding rnp->lock · 065bb78c
    Daniel Wagner authored
    rcu_nocb_gp_cleanup() is called while holding rnp->lock. Currently,
    this is okay because the wake_up_all() in rcu_nocb_gp_cleanup() will
    not enable the IRQs. lockdep is happy.
    
    By switching over using swait this is not true anymore. swake_up_all()
    enables the IRQs while processing the waiters. __do_softirq() can now
    run and will eventually call rcu_process_callbacks() which wants to
    grap nrp->lock.
    
    Let's move the rcu_nocb_gp_cleanup() call outside the lock before we
    switch over to swait.
    
    If we would hold the rnp->lock and use swait, lockdep reports
    following:
    
     =================================
     [ INFO: inconsistent lock state ]
     4.2.0-rc5-00025-g9a73ba0 #136 Not tainted
     ---------------------------------
     inconsistent {IN-SOFTIRQ-W} -> {SOFTIRQ-ON-W} usage.
     rcu_preempt/8 [HC0[0]:SC0[0]:HE1:SE1] takes:
      (rcu_node_1){+.?...}, at: [<ffffffff811387c7>] rcu_gp_kthread+0xb97/0xeb0
     {IN-SOFTIRQ-W} state was registered at:
       [<ffffffff81109b9f>] __lock_acquire+0xd5f/0x21e0
       [<ffffffff8110be0f>] lock_acquire+0xdf/0x2b0
       [<ffffffff81841cc9>] _raw_spin_lock_irqsave+0x59/0xa0
       [<ffffffff81136991>] rcu_process_callbacks+0x141/0x3c0
       [<ffffffff810b1a9d>] __do_softirq+0x14d/0x670
       [<ffffffff810b2214>] irq_exit+0x104/0x110
       [<ffffffff81844e96>] smp_apic_timer_interrupt+0x46/0x60
       [<ffffffff81842e70>] apic_timer_interrupt+0x70/0x80
       [<ffffffff810dba66>] rq_attach_root+0xa6/0x100
       [<ffffffff810dbc2d>] cpu_attach_domain+0x16d/0x650
       [<ffffffff810e4b42>] build_sched_domains+0x942/0xb00
       [<ffffffff821777c2>] sched_init_smp+0x509/0x5c1
       [<ffffffff821551e3>] kernel_init_freeable+0x172/0x28f
       [<ffffffff8182cdce>] kernel_init+0xe/0xe0
       [<ffffffff8184231f>] ret_from_fork+0x3f/0x70
     irq event stamp: 76
     hardirqs last  enabled at (75): [<ffffffff81841330>] _raw_spin_unlock_irq+0x30/0x60
     hardirqs last disabled at (76): [<ffffffff8184116f>] _raw_spin_lock_irq+0x1f/0x90
     softirqs last  enabled at (0): [<ffffffff810a8df2>] copy_process.part.26+0x602/0x1cf0
     softirqs last disabled at (0): [<          (null)>]           (null)
     other info that might help us debug this:
      Possible unsafe locking scenario:
            CPU0
            ----
       lock(rcu_node_1);
       <Interrupt>
         lock(rcu_node_1);
      *** DEADLOCK ***
     1 lock held by rcu_preempt/8:
      #0:  (rcu_node_1){+.?...}, at: [<ffffffff811387c7>] rcu_gp_kthread+0xb97/0xeb0
     stack backtrace:
     CPU: 0 PID: 8 Comm: rcu_preempt Not tainted 4.2.0-rc5-00025-g9a73ba0 #136
     Hardware name: Dell Inc. PowerEdge R820/066N7P, BIOS 2.0.20 01/16/2014
      0000000000000000 000000006d7e67d8 ffff881fb081fbd8 ffffffff818379e0
      0000000000000000 ffff881fb0812a00 ffff881fb081fc38 ffffffff8110813b
      0000000000000000 0000000000000001 ffff881f00000001 ffffffff8102fa4f
     Call Trace:
      [<ffffffff818379e0>] dump_stack+0x4f/0x7b
      [<ffffffff8110813b>] print_usage_bug+0x1db/0x1e0
      [<ffffffff8102fa4f>] ? save_stack_trace+0x2f/0x50
      [<ffffffff811087ad>] mark_lock+0x66d/0x6e0
      [<ffffffff81107790>] ? check_usage_forwards+0x150/0x150
      [<ffffffff81108898>] mark_held_locks+0x78/0xa0
      [<ffffffff81841330>] ? _raw_spin_unlock_irq+0x30/0x60
      [<ffffffff81108a28>] trace_hardirqs_on_caller+0x168/0x220
      [<ffffffff81108aed>] trace_hardirqs_on+0xd/0x10
      [<ffffffff81841330>] _raw_spin_unlock_irq+0x30/0x60
      [<ffffffff810fd1c7>] swake_up_all+0xb7/0xe0
      [<ffffffff811386e1>] rcu_gp_kthread+0xab1/0xeb0
      [<ffffffff811089bf>] ? trace_hardirqs_on_caller+0xff/0x220
      [<ffffffff81841341>] ? _raw_spin_unlock_irq+0x41/0x60
      [<ffffffff81137c30>] ? rcu_barrier+0x20/0x20
      [<ffffffff810d2014>] kthread+0x104/0x120
      [<ffffffff81841330>] ? _raw_spin_unlock_irq+0x30/0x60
      [<ffffffff810d1f10>] ? kthread_create_on_node+0x260/0x260
      [<ffffffff8184231f>] ret_from_fork+0x3f/0x70
      [<ffffffff810d1f10>] ? kthread_create_on_node+0x260/0x260
    Signed-off-by: default avatarDaniel Wagner <daniel.wagner@bmw-carit.de>
    Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: linux-rt-users@vger.kernel.org
    Cc: Boqun Feng <boqun.feng@gmail.com>
    Cc: Marcelo Tosatti <mtosatti@redhat.com>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
    Cc: Paolo Bonzini <pbonzini@redhat.com>
    Cc: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
    Link: http://lkml.kernel.org/r/1455871601-27484-5-git-send-email-wagi@monom.orgSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    065bb78c
tree.h 28.3 KB