• Davide Caratti's avatar
    net/sched: fix false lockdep warning on qdisc root lock · af0cb3fa
    Davide Caratti authored
    Xiumei and Christoph reported the following lockdep splat, complaining of
    the qdisc root lock being taken twice:
    
     ============================================
     WARNING: possible recursive locking detected
     6.7.0-rc3+ #598 Not tainted
     --------------------------------------------
     swapper/2/0 is trying to acquire lock:
     ffff888177190110 (&sch->q.lock){+.-.}-{2:2}, at: __dev_queue_xmit+0x1560/0x2e70
    
     but task is already holding lock:
     ffff88811995a110 (&sch->q.lock){+.-.}-{2:2}, at: __dev_queue_xmit+0x1560/0x2e70
    
     other info that might help us debug this:
      Possible unsafe locking scenario:
    
            CPU0
            ----
       lock(&sch->q.lock);
       lock(&sch->q.lock);
    
      *** DEADLOCK ***
    
      May be due to missing lock nesting notation
    
     5 locks held by swapper/2/0:
      #0: ffff888135a09d98 ((&in_dev->mr_ifc_timer)){+.-.}-{0:0}, at: call_timer_fn+0x11a/0x510
      #1: ffffffffaaee5260 (rcu_read_lock){....}-{1:2}, at: ip_finish_output2+0x2c0/0x1ed0
      #2: ffffffffaaee5200 (rcu_read_lock_bh){....}-{1:2}, at: __dev_queue_xmit+0x209/0x2e70
      #3: ffff88811995a110 (&sch->q.lock){+.-.}-{2:2}, at: __dev_queue_xmit+0x1560/0x2e70
      #4: ffffffffaaee5200 (rcu_read_lock_bh){....}-{1:2}, at: __dev_queue_xmit+0x209/0x2e70
    
     stack backtrace:
     CPU: 2 PID: 0 Comm: swapper/2 Not tainted 6.7.0-rc3+ #598
     Hardware name: Red Hat KVM, BIOS 1.13.0-2.module+el8.3.0+7353+9de0a3cc 04/01/2014
     Call Trace:
      <IRQ>
      dump_stack_lvl+0x4a/0x80
      __lock_acquire+0xfdd/0x3150
      lock_acquire+0x1ca/0x540
      _raw_spin_lock+0x34/0x80
      __dev_queue_xmit+0x1560/0x2e70
      tcf_mirred_act+0x82e/0x1260 [act_mirred]
      tcf_action_exec+0x161/0x480
      tcf_classify+0x689/0x1170
      prio_enqueue+0x316/0x660 [sch_prio]
      dev_qdisc_enqueue+0x46/0x220
      __dev_queue_xmit+0x1615/0x2e70
      ip_finish_output2+0x1218/0x1ed0
      __ip_finish_output+0x8b3/0x1350
      ip_output+0x163/0x4e0
      igmp_ifc_timer_expire+0x44b/0x930
      call_timer_fn+0x1a2/0x510
      run_timer_softirq+0x54d/0x11a0
      __do_softirq+0x1b3/0x88f
      irq_exit_rcu+0x18f/0x1e0
      sysvec_apic_timer_interrupt+0x6f/0x90
      </IRQ>
    
    This happens when TC does a mirred egress redirect from the root qdisc of
    device A to the root qdisc of device B. As long as these two locks aren't
    protecting the same qdisc, they can be acquired in chain: add a per-qdisc
    lockdep key to silence false warnings.
    This dynamic key should safely replace the static key we have in sch_htb:
    it was added to allow enqueueing to the device "direct qdisc" while still
    holding the qdisc root lock.
    
    v2: don't use static keys anymore in HTB direct qdiscs (thanks Eric Dumazet)
    
    CC: Maxim Mikityanskiy <maxim@isovalent.com>
    CC: Xiumei Mu <xmu@redhat.com>
    Reported-by: default avatarChristoph Paasch <cpaasch@apple.com>
    Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/451Signed-off-by: default avatarDavide Caratti <dcaratti@redhat.com>
    Link: https://lore.kernel.org/r/7dc06d6158f72053cf877a82e2a7a5bd23692faa.1713448007.git.dcaratti@redhat.comSigned-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
    af0cb3fa
sch_htb.c 56.1 KB