All of lore.kernel.org
 help / color / mirror / Atom feed
* possible circular locking dependency backtrace seen when enabling PREEMPT_RT
@ 2025-02-12 15:56 Guenter Roeck
  2025-02-12 16:45 ` Steven Rostedt
  2025-02-12 16:56 ` Sebastian Andrzej Siewior
  0 siblings, 2 replies; 16+ messages in thread
From: Guenter Roeck @ 2025-02-12 15:56 UTC (permalink / raw)
  To: Sebastian Andrzej Siewior; +Cc: Clark Williams, linux-rt-devel, Steven Rostedt

Hi,

when enabling PREEMPT_RT together with lock debugging, I see the attached
"possible circular locking dependency" warning when instantiating the pcnet32
Ethernet adapter with qemu.

Note: This is with

lockdep: Remove disable_irq_lockdep().
lockdep: Don't disable interrupts on RT in disable_irq_nosync_lockdep.*()

applied on the top of the mainline kernel.

Thanks,
Guenter

---
Build reference: v6.14-rc2-3-g59b1a66735ce
Compiler version: x86_64-linux-gcc (GCC) 13.3.0
Qemu version: 9.1.2 (v9.1.2-51-g94825e22f3)
...
Starting network: [   26.638045] pcnet32 0000:00:02.0 eth0: link up
[   26.639386] 
[   26.639429] ======================================================
[   26.639435] WARNING: possible circular locking dependency detected
[   26.639595] 6.14.0-rc2-00003-g59b1a66735ce #1 Tainted: G                 N
[   26.639609] ------------------------------------------------------
[   26.639616] irq/22-eth0/2680 is trying to acquire lock:
[   26.639648] ffff9cb0438dae30 (&lp->lock){+.+.}-{3:3}, at: pcnet32_interrupt+0x2e/0x1e0
[   26.639853] 
[   26.639853] but task is already holding lock:
[   26.639858] ffff9cb0bdc1c818 ((softirq_ctrl.lock)){+.+.}-{3:3}, at: __local_bh_disable_ip+0x94/0x180
[   26.639877] 
[   26.639877] which lock already depends on the new lock.
[   26.639877] 
[   26.639882] 
[   26.639882] the existing dependency chain (in reverse order) is:
[   26.639898] 
[   26.639898] -> #1 ((softirq_ctrl.lock)){+.+.}-{3:3}:
[   26.639950]        rt_spin_lock+0x39/0x170
[   26.639985]        __local_bh_disable_ip+0x94/0x180
[   26.639991]        __netdev_alloc_skb+0x139/0x1c0
[   26.639998]        pcnet32_init_ring+0x18b/0x310
[   26.640003]        pcnet32_open+0x477/0x820
[   26.640008]        __dev_open+0x100/0x200
[   26.640014]        __dev_change_flags+0x217/0x2b0
[   26.640018]        dev_change_flags+0x21/0x60
[   26.640022]        do_setlink.isra.0+0x31b/0x1250
[   26.640027]        rtnl_newlink+0x7eb/0xb10
[   26.640031]        rtnetlink_rcv_msg+0x414/0x670
[   26.640036]        netlink_rcv_skb+0x56/0x100
[   26.640041]        netlink_unicast+0x1a3/0x290
[   26.640046]        netlink_sendmsg+0x203/0x450
[   26.640050]        ____sys_sendmsg+0x301/0x330
[   26.640060]        ___sys_sendmsg+0x95/0xe0
[   26.640066]        __sys_sendmsg+0x88/0xe0
[   26.640070]        do_syscall_64+0xbb/0x1d0
[   26.640076]        entry_SYSCALL_64_after_hwframe+0x77/0x7f
[   26.640094] 
[   26.640094] -> #0 (&lp->lock){+.+.}-{3:3}:
[   26.640102]        __lock_acquire+0x11ef/0x1940
[   26.640109]        lock_acquire.part.0+0x9a/0x220
[   26.640114]        rt_spin_lock+0x39/0x170
[   26.640118]        pcnet32_interrupt+0x2e/0x1e0
[   26.640123]        irq_thread_fn+0x1e/0x60
[   26.640129]        irq_forced_thread_fn+0x2d/0x50
[   26.640134]        irq_thread+0x15d/0x220
[   26.640138]        kthread+0xfe/0x220
[   26.640144]        ret_from_fork+0x2f/0x50
[   26.640151]        ret_from_fork_asm+0x1a/0x30
[   26.640162] 
[   26.640162] other info that might help us debug this:
[   26.640162] 
[   26.640188]  Possible unsafe locking scenario:
[   26.640188] 
[   26.640192]        CPU0                    CPU1
[   26.640196]        ----                    ----
[   26.640203]   lock((softirq_ctrl.lock));
[   26.640217]                                lock(&lp->lock);
[   26.640232]                                lock((softirq_ctrl.lock));
[   26.640251]   lock(&lp->lock);
[   26.640264] 
[   26.640264]  *** DEADLOCK ***
[   26.640264] 
[   26.640285] 3 locks held by irq/22-eth0/2680:
[   26.640302]  #0: ffff9cb0bdc1c818 ((softirq_ctrl.lock)){+.+.}-{3:3}, at: __local_bh_disable_ip+0x94/0x180
[   26.640327]  #1: ffffffff97406f20 (rcu_read_lock){....}-{1:3}, at: rt_spin_lock+0xdf/0x170
[   26.640351]  #2: ffffffff97406f20 (rcu_read_lock){....}-{1:3}, at: __local_bh_disable_ip+0xab/0x180
[   26.640370] 
[   26.640370] stack backtrace:
[   26.640464] CPU: 0 UID: 0 PID: 2680 Comm: irq/22-eth0 Tainted: G                 N 6.14.0-rc2-00003-g59b1a66735ce #1
[   26.640507] Tainted: [N]=TEST
[   26.640516] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org 04/01/2014
[   26.640599] Call Trace:
[   26.640640]  <TASK>
[   26.640691]  dump_stack_lvl+0x78/0xe0
[   26.640743]  print_circular_bug+0x26e/0x350
[   26.640752]  check_noncircular+0x169/0x180
[   26.640764]  __lock_acquire+0x11ef/0x1940
[   26.640776]  lock_acquire.part.0+0x9a/0x220
[   26.640787]  ? pcnet32_interrupt+0x2e/0x1e0
[   26.640795]  ? trace_lock_acquire+0x83/0xb0
[   26.640800]  ? lock_acquire+0x33/0x80
[   26.640805]  ? pcnet32_interrupt+0x2e/0x1e0
[   26.640813]  rt_spin_lock+0x39/0x170
[   26.640818]  ? pcnet32_interrupt+0x2e/0x1e0
[   26.640823]  ? trace_lock_acquire+0x83/0xb0
[   26.640829]  pcnet32_interrupt+0x2e/0x1e0
[   26.640835]  ? irq_forced_thread_fn+0x1a/0x50
[   26.640841]  irq_thread_fn+0x1e/0x60
[   26.640846]  ? irq_forced_thread_fn+0x1a/0x50
[   26.640850]  irq_forced_thread_fn+0x2d/0x50
[   26.640855]  ? irq_thread+0xad/0x220
[   26.640859]  irq_thread+0x15d/0x220
[   26.640864]  ? __pfx_irq_forced_thread_fn+0x10/0x10
[   26.640869]  ? __pfx_irq_thread_dtor+0x10/0x10
[   26.640876]  ? __pfx_irq_thread+0x10/0x10
[   26.640881]  kthread+0xfe/0x220
[   26.640889]  ? __pfx_kthread+0x10/0x10
[   26.640896]  ret_from_fork+0x2f/0x50
[   26.640902]  ? __pfx_kthread+0x10/0x10
[   26.640908]  ret_from_fork_asm+0x1a/0x30
[   26.640935]  </TASK>

Stack decode:

[   26.639435] WARNING: possible circular locking dependency detected
[   26.639595] 6.14.0-rc2-00003-g59b1a66735ce #1 Tainted: G                 N
[   26.639609] ------------------------------------------------------
[   26.639616] irq/22-eth0/2680 is trying to acquire lock:
[   26.639648] ffff9cb0438dae30 (&lp->lock){+.+.}-{3:3}, at: pcnet32_interrupt (drivers/net/ethernet/amd/pcnet32.c:2572) 
[   26.639853]
[   26.639853] but task is already holding lock:
[   26.639858] ffff9cb0bdc1c818 ((softirq_ctrl.lock)){+.+.}-{3:3}, at: __local_bh_disable_ip (include/linux/rcupdate.h:847 kernel/softirq.c:156) 
[   26.639877]
[   26.639877] which lock already depends on the new lock.
[   26.639877]
[   26.639882]
[   26.639882] the existing dependency chain (in reverse order) is:
[   26.639898]
[   26.639898] -> #1 ((softirq_ctrl.lock)){+.+.}-{3:3}:
[   26.639950] rt_spin_lock (arch/x86/include/asm/current.h:47 kernel/locking/spinlock_rt.c:48 kernel/locking/spinlock_rt.c:57) 
[   26.639985] __local_bh_disable_ip (include/linux/rcupdate.h:847 kernel/softirq.c:156) 
[   26.639991] __netdev_alloc_skb (net/core/skbuff.c:759) 
[   26.639998] pcnet32_init_ring (drivers/net/ethernet/amd/pcnet32.c:2376 (discriminator 1)) 
[   26.640003] pcnet32_open (drivers/net/ethernet/amd/pcnet32.c:2269) 
[   26.640008] __dev_open (net/core/dev.c:1606) 
[   26.640014] __dev_change_flags (net/core/dev.c:9172) 
[   26.640018] dev_change_flags (net/core/dev.c:9244) 
[   26.640022] do_setlink.isra.0 (net/core/rtnetlink.c:3118 (discriminator 1)) 
[   26.640027] rtnl_newlink (net/core/rtnetlink.c:3732 net/core/rtnetlink.c:3884 net/core/rtnetlink.c:4021) 
[   26.640031] rtnetlink_rcv_msg (net/core/rtnetlink.c:6911) 
[   26.640036] netlink_rcv_skb (net/netlink/af_netlink.c:2543) 
[   26.640041] netlink_unicast (net/netlink/af_netlink.c:1323 net/netlink/af_netlink.c:1348) 
[   26.640046] netlink_sendmsg (net/netlink/af_netlink.c:1892) 
[   26.640050] ____sys_sendmsg (net/socket.c:718 (discriminator 1) net/socket.c:733 (discriminator 1) net/socket.c:2573 (discriminator 1)) 
[   26.640060] ___sys_sendmsg (net/socket.c:2629) 
[   26.640066] __sys_sendmsg (net/socket.c:2659 (discriminator 1)) 
[   26.640070] do_syscall_64 (arch/x86/entry/common.c:52 (discriminator 1) arch/x86/entry/common.c:83 (discriminator 1)) 
[   26.640076] entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:130) 
[   26.640094]
[   26.640094] -> #0 (&lp->lock){+.+.}-{3:3}:
[   26.640102] __lock_acquire (kernel/locking/lockdep.c:3164 (discriminator 1) kernel/locking/lockdep.c:3282 (discriminator 1) kernel/locking/lockdep.c:3906 (discriminator 1) kernel/locking/lockdep.c:5228 (discriminator 1)) 
[   26.640109] lock_acquire.part.0 (kernel/locking/lockdep.c:469 (discriminator 4) kernel/locking/lockdep.c:5853 (discriminator 4)) 
[   26.640114] rt_spin_lock (arch/x86/include/asm/current.h:47 kernel/locking/spinlock_rt.c:48 kernel/locking/spinlock_rt.c:57) 
[   26.640118] pcnet32_interrupt (drivers/net/ethernet/amd/pcnet32.c:2572) 
[   26.640123] irq_thread_fn (kernel/irq/manage.c:1191) 
[   26.640129] irq_forced_thread_fn (include/linux/bottom_half.h:33 (discriminator 1) kernel/irq/manage.c:1216 (discriminator 1)) 
[   26.640134] irq_thread (kernel/irq/manage.c:1318) 
[   26.640138] kthread (kernel/kthread.c:464) 
[   26.640144] ret_from_fork (arch/x86/kernel/process.c:154) 
[   26.640151] ret_from_fork_asm (arch/x86/entry/entry_64.S:257) 
[   26.640162]
[   26.640162] other info that might help us debug this:
[   26.640162]
[   26.640188]  Possible unsafe locking scenario:
[   26.640188]
[   26.640192]        CPU0                    CPU1
[   26.640196]        ----                    ----
[   26.640203]   lock((softirq_ctrl.lock));
[   26.640217]                                lock(&lp->lock);
[   26.640232]                                lock((softirq_ctrl.lock));
[   26.640251]   lock(&lp->lock);
[   26.640264]
[   26.640264]  *** DEADLOCK ***
[   26.640264]
[   26.640285] 3 locks held by irq/22-eth0/2680:
[   26.640302] #0: ffff9cb0bdc1c818 ((softirq_ctrl.lock)){+.+.}-{3:3}, at: __local_bh_disable_ip (include/linux/rcupdate.h:847 kernel/softirq.c:156) 
[   26.640327] #1: ffffffff97406f20 (rcu_read_lock){....}-{1:3}, at: rt_spin_lock (include/linux/rcupdate.h:337 (discriminator 1) include/linux/rcupdate.h:849 (discriminator 1) kernel/locking/spinlock_rt.c:50 (discriminator 1) kernel/locking/spinlock_rt.c:57 (discriminator 1)) 
[   26.640351] #2: ffffffff97406f20 (rcu_read_lock){....}-{1:3}, at: __local_bh_disable_ip (include/linux/rcupdate.h:337 (discriminator 1) include/linux/rcupdate.h:849 (discriminator 1) kernel/softirq.c:156 (discriminator 1)) 
[   26.640370]
[   26.640370] stack backtrace:
[   26.640464] CPU: 0 UID: 0 PID: 2680 Comm: irq/22-eth0 Tainted: G                 N 6.14.0-rc2-00003-g59b1a66735ce #1
[   26.640507] Tainted: [N]=TEST
[   26.640516] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org 04/01/2014
[   26.640599] Call Trace:
[   26.640640]  <TASK>
[   26.640691] dump_stack_lvl (lib/dump_stack.c:123) 
[   26.640743] print_circular_bug (kernel/locking/lockdep.c:2079) 
[   26.640752] check_noncircular (kernel/locking/lockdep.c:2211) 
[   26.640764] __lock_acquire (kernel/locking/lockdep.c:3164 (discriminator 1) kernel/locking/lockdep.c:3282 (discriminator 1) kernel/locking/lockdep.c:3906 (discriminator 1) kernel/locking/lockdep.c:5228 (discriminator 1)) 
[   26.640776] lock_acquire.part.0 (kernel/locking/lockdep.c:469 (discriminator 4) kernel/locking/lockdep.c:5853 (discriminator 4)) 
[   26.640787] ? pcnet32_interrupt (drivers/net/ethernet/amd/pcnet32.c:2572) 
[   26.640795] ? trace_lock_acquire (include/trace/events/lock.h:24 (discriminator 2)) 
[   26.640800] ? lock_acquire (kernel/locking/lockdep.c:5824) 
[   26.640805] ? pcnet32_interrupt (drivers/net/ethernet/amd/pcnet32.c:2572) 
[   26.640813] rt_spin_lock (arch/x86/include/asm/current.h:47 kernel/locking/spinlock_rt.c:48 kernel/locking/spinlock_rt.c:57) 
[   26.640818] ? pcnet32_interrupt (drivers/net/ethernet/amd/pcnet32.c:2572) 
[   26.640823] ? trace_lock_acquire (include/trace/events/lock.h:24 (discriminator 2)) 
[   26.640829] pcnet32_interrupt (drivers/net/ethernet/amd/pcnet32.c:2572) 
[   26.640835] ? irq_forced_thread_fn (include/linux/bottom_half.h:20 (discriminator 1) kernel/irq/manage.c:1210 (discriminator 1)) 
[   26.640841] irq_thread_fn (kernel/irq/manage.c:1191) 
[   26.640846] ? irq_forced_thread_fn (include/linux/bottom_half.h:20 (discriminator 1) kernel/irq/manage.c:1210 (discriminator 1)) 
[   26.640850] irq_forced_thread_fn (include/linux/bottom_half.h:33 (discriminator 1) kernel/irq/manage.c:1216 (discriminator 1)) 
[   26.640855] ? irq_thread (kernel/irq/manage.c:1307) 
[   26.640859] irq_thread (kernel/irq/manage.c:1318) 
[   26.640864] ? __pfx_irq_forced_thread_fn (kernel/irq/manage.c:1207) 
[   26.640869] ? __pfx_irq_thread_dtor (kernel/irq/manage.c:1227) 
[   26.640876] ? __pfx_irq_thread (kernel/irq/manage.c:1294) 
[   26.640881] kthread (kernel/kthread.c:464) 
[   26.640889] ? __pfx_kthread (kernel/kthread.c:413) 
[   26.640896] ret_from_fork (arch/x86/kernel/process.c:154) 
[   26.640902] ? __pfx_kthread (kernel/kthread.c:413) 
[   26.640908] ret_from_fork_asm (arch/x86/entry/entry_64.S:257) 
[   26.640935]  </TASK>

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: possible circular locking dependency backtrace seen when enabling PREEMPT_RT
  2025-02-12 15:56 possible circular locking dependency backtrace seen when enabling PREEMPT_RT Guenter Roeck
@ 2025-02-12 16:45 ` Steven Rostedt
  2025-02-12 16:59   ` Sebastian Andrzej Siewior
  2025-02-12 17:54   ` Guenter Roeck
  2025-02-12 16:56 ` Sebastian Andrzej Siewior
  1 sibling, 2 replies; 16+ messages in thread
From: Steven Rostedt @ 2025-02-12 16:45 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: Sebastian Andrzej Siewior, Clark Williams, linux-rt-devel,
	Thomas Gleixner, Peter Zijlstra

On Wed, 12 Feb 2025 07:56:44 -0800
Guenter Roeck <linux@roeck-us.net> wrote:

> Hi,
> 
> when enabling PREEMPT_RT together with lock debugging, I see the attached
> "possible circular locking dependency" warning when instantiating the pcnet32
> Ethernet adapter with qemu.
> 
> Note: This is with
> 
> lockdep: Remove disable_irq_lockdep().
> lockdep: Don't disable interrupts on RT in disable_irq_nosync_lockdep.*()
> 
> applied on the top of the mainline kernel.

Thanks for the report.

> 
> Thanks,
> Guenter
> 
> ---
> Build reference: v6.14-rc2-3-g59b1a66735ce
> Compiler version: x86_64-linux-gcc (GCC) 13.3.0
> Qemu version: 9.1.2 (v9.1.2-51-g94825e22f3)
> ...
> Starting network: [   26.638045] pcnet32 0000:00:02.0 eth0: link up
> [   26.639386] 
> [   26.639429] ======================================================
> [   26.639435] WARNING: possible circular locking dependency detected
> [   26.639595] 6.14.0-rc2-00003-g59b1a66735ce #1 Tainted: G                 N
> [   26.639609] ------------------------------------------------------
> [   26.639616] irq/22-eth0/2680 is trying to acquire lock:
> [   26.639648] ffff9cb0438dae30 (&lp->lock){+.+.}-{3:3}, at: pcnet32_interrupt+0x2e/0x1e0

So the spin_lock(lp->lock) is being taken from the interrupt handler (now a
thread), while it already holds the softirq_ctrl.lock from the
local_bh_disable() in the irq_thread_fn().

> [   26.639853] 
> [   26.639853] but task is already holding lock:
> [   26.639858] ffff9cb0bdc1c818 ((softirq_ctrl.lock)){+.+.}-{3:3}, at: __local_bh_disable_ip+0x94/0x180
> [   26.639877] 
> [   26.639877] which lock already depends on the new lock.
> [   26.639877] 
> [   26.639882] 
> [   26.639882] the existing dependency chain (in reverse order) is:
> [   26.639898] 
> [   26.639898] -> #1 ((softirq_ctrl.lock)){+.+.}-{3:3}:
> [   26.639950]        rt_spin_lock+0x39/0x170
> [   26.639985]        __local_bh_disable_ip+0x94/0x180
> [   26.639991]        __netdev_alloc_skb+0x139/0x1c0

The __netdev_alloc_skb() calls local_bh_disable() (which takes the
softirq_ctrl.lock in PREEMPT_RT).

> [   26.639998]        pcnet32_init_ring+0x18b/0x310
> [   26.640003]        pcnet32_open+0x477/0x820

But here it already acquired the lp->lock via a spin_lock_irqsave().

Now, local_bh_disable() in non PREEMPT_RT disables preemption as well as
softirqs. But in PREEMPT_RT it does not disable preemption and has the
following code from __local_bh_disable_ip() in softirq.c:

	/* First entry of a task into a BH disabled section? */
	if (!current->softirq_disable_cnt) {
		if (preemptible()) {
			local_lock(&softirq_ctrl.lock);
			/* Required to meet the RCU bottomhalf requirements. */
			rcu_read_lock();
		} else {
			DEBUG_LOCKS_WARN_ON(this_cpu_read(softirq_ctrl.cnt));
		}
	}

Where that local_lock() disables preemption and prevents softirqs from
executing on this CPU.

But in non PREEMPT_RT, spin_lock_irqsave() (as well as spin_lock_irq())
disables preemption and because it also disables interrupts will disable
softirqs too.

Shouldn't the spin_lock_irq*() variants for PREEMPT_RT also disable local_bh?

Like this patch (untested):

diff --git a/include/linux/spinlock_rt.h b/include/linux/spinlock_rt.h
index f6499c37157d..50ad0fab66b6 100644
--- a/include/linux/spinlock_rt.h
+++ b/include/linux/spinlock_rt.h
@@ -90,6 +90,7 @@ static __always_inline void spin_lock_bh(spinlock_t *lock)
 
 static __always_inline void spin_lock_irq(spinlock_t *lock)
 {
+	local_bh_disable();
 	rt_spin_lock(lock);
 }
 
@@ -97,12 +98,14 @@ static __always_inline void spin_lock_irq(spinlock_t *lock)
 	do {						 \
 		typecheck(unsigned long, flags);	 \
 		flags = 0;				 \
+		local_bh_disable();			 \
 		spin_lock(lock);			 \
 	} while (0)
 
 static __always_inline void spin_unlock(spinlock_t *lock)
 {
 	rt_spin_unlock(lock);
+	local_bh_enable();
 }
 
 static __always_inline void spin_unlock_bh(spinlock_t *lock)
@@ -114,6 +117,7 @@ static __always_inline void spin_unlock_bh(spinlock_t *lock)
 static __always_inline void spin_unlock_irq(spinlock_t *lock)
 {
 	rt_spin_unlock(lock);
+	local_bh_enable();
 }
 
 static __always_inline void spin_unlock_irqrestore(spinlock_t *lock,


We could probably consolidate the spin_lock_bh() with spin_lock_irq()
variants.

Guenter,

Can you test that patch to see if it stops this lockdep splat?

Thanks,

-- Steve


> [   26.640008]        __dev_open+0x100/0x200
> [   26.640014]        __dev_change_flags+0x217/0x2b0
> [   26.640018]        dev_change_flags+0x21/0x60
> [   26.640022]        do_setlink.isra.0+0x31b/0x1250
> [   26.640027]        rtnl_newlink+0x7eb/0xb10
> [   26.640031]        rtnetlink_rcv_msg+0x414/0x670
> [   26.640036]        netlink_rcv_skb+0x56/0x100
> [   26.640041]        netlink_unicast+0x1a3/0x290
> [   26.640046]        netlink_sendmsg+0x203/0x450
> [   26.640050]        ____sys_sendmsg+0x301/0x330
> [   26.640060]        ___sys_sendmsg+0x95/0xe0
> [   26.640066]        __sys_sendmsg+0x88/0xe0
> [   26.640070]        do_syscall_64+0xbb/0x1d0
> [   26.640076]        entry_SYSCALL_64_after_hwframe+0x77/0x7f
> [   26.640094] 
> [   26.640094] -> #0 (&lp->lock){+.+.}-{3:3}:
> [   26.640102]        __lock_acquire+0x11ef/0x1940
> [   26.640109]        lock_acquire.part.0+0x9a/0x220
> [   26.640114]        rt_spin_lock+0x39/0x170
> [   26.640118]        pcnet32_interrupt+0x2e/0x1e0
> [   26.640123]        irq_thread_fn+0x1e/0x60
> [   26.640129]        irq_forced_thread_fn+0x2d/0x50
> [   26.640134]        irq_thread+0x15d/0x220
> [   26.640138]        kthread+0xfe/0x220
> [   26.640144]        ret_from_fork+0x2f/0x50
> [   26.640151]        ret_from_fork_asm+0x1a/0x30
> [   26.640162] 
> [   26.640162] other info that might help us debug this:
> [   26.640162] 
> [   26.640188]  Possible unsafe locking scenario:
> [   26.640188] 
> [   26.640192]        CPU0                    CPU1
> [   26.640196]        ----                    ----
> [   26.640203]   lock((softirq_ctrl.lock));
> [   26.640217]                                lock(&lp->lock);
> [   26.640232]                                lock((softirq_ctrl.lock));
> [   26.640251]   lock(&lp->lock);
> [   26.640264] 
> [   26.640264]  *** DEADLOCK ***
> [   26.640264] 
> [   26.640285] 3 locks held by irq/22-eth0/2680:
> [   26.640302]  #0: ffff9cb0bdc1c818 ((softirq_ctrl.lock)){+.+.}-{3:3}, at: __local_bh_disable_ip+0x94/0x180
> [   26.640327]  #1: ffffffff97406f20 (rcu_read_lock){....}-{1:3}, at: rt_spin_lock+0xdf/0x170
> [   26.640351]  #2: ffffffff97406f20 (rcu_read_lock){....}-{1:3}, at: __local_bh_disable_ip+0xab/0x180
> [   26.640370] 
> [   26.640370] stack backtrace:
> [   26.640464] CPU: 0 UID: 0 PID: 2680 Comm: irq/22-eth0 Tainted: G                 N 6.14.0-rc2-00003-g59b1a66735ce #1
> [   26.640507] Tainted: [N]=TEST
> [   26.640516] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org 04/01/2014
> [   26.640599] Call Trace:
> [   26.640640]  <TASK>
> [   26.640691]  dump_stack_lvl+0x78/0xe0
> [   26.640743]  print_circular_bug+0x26e/0x350
> [   26.640752]  check_noncircular+0x169/0x180
> [   26.640764]  __lock_acquire+0x11ef/0x1940
> [   26.640776]  lock_acquire.part.0+0x9a/0x220
> [   26.640787]  ? pcnet32_interrupt+0x2e/0x1e0
> [   26.640795]  ? trace_lock_acquire+0x83/0xb0
> [   26.640800]  ? lock_acquire+0x33/0x80
> [   26.640805]  ? pcnet32_interrupt+0x2e/0x1e0
> [   26.640813]  rt_spin_lock+0x39/0x170
> [   26.640818]  ? pcnet32_interrupt+0x2e/0x1e0
> [   26.640823]  ? trace_lock_acquire+0x83/0xb0
> [   26.640829]  pcnet32_interrupt+0x2e/0x1e0
> [   26.640835]  ? irq_forced_thread_fn+0x1a/0x50
> [   26.640841]  irq_thread_fn+0x1e/0x60
> [   26.640846]  ? irq_forced_thread_fn+0x1a/0x50
> [   26.640850]  irq_forced_thread_fn+0x2d/0x50
> [   26.640855]  ? irq_thread+0xad/0x220
> [   26.640859]  irq_thread+0x15d/0x220
> [   26.640864]  ? __pfx_irq_forced_thread_fn+0x10/0x10
> [   26.640869]  ? __pfx_irq_thread_dtor+0x10/0x10
> [   26.640876]  ? __pfx_irq_thread+0x10/0x10
> [   26.640881]  kthread+0xfe/0x220
> [   26.640889]  ? __pfx_kthread+0x10/0x10
> [   26.640896]  ret_from_fork+0x2f/0x50
> [   26.640902]  ? __pfx_kthread+0x10/0x10
> [   26.640908]  ret_from_fork_asm+0x1a/0x30
> [   26.640935]  </TASK>
> 
> Stack decode:
> 
> [   26.639435] WARNING: possible circular locking dependency detected
> [   26.639595] 6.14.0-rc2-00003-g59b1a66735ce #1 Tainted: G                 N
> [   26.639609] ------------------------------------------------------
> [   26.639616] irq/22-eth0/2680 is trying to acquire lock:
> [   26.639648] ffff9cb0438dae30 (&lp->lock){+.+.}-{3:3}, at: pcnet32_interrupt (drivers/net/ethernet/amd/pcnet32.c:2572) 
> [   26.639853]
> [   26.639853] but task is already holding lock:
> [   26.639858] ffff9cb0bdc1c818 ((softirq_ctrl.lock)){+.+.}-{3:3}, at: __local_bh_disable_ip (include/linux/rcupdate.h:847 kernel/softirq.c:156) 
> [   26.639877]
> [   26.639877] which lock already depends on the new lock.
> [   26.639877]
> [   26.639882]
> [   26.639882] the existing dependency chain (in reverse order) is:
> [   26.639898]
> [   26.639898] -> #1 ((softirq_ctrl.lock)){+.+.}-{3:3}:
> [   26.639950] rt_spin_lock (arch/x86/include/asm/current.h:47 kernel/locking/spinlock_rt.c:48 kernel/locking/spinlock_rt.c:57) 
> [   26.639985] __local_bh_disable_ip (include/linux/rcupdate.h:847 kernel/softirq.c:156) 
> [   26.639991] __netdev_alloc_skb (net/core/skbuff.c:759) 
> [   26.639998] pcnet32_init_ring (drivers/net/ethernet/amd/pcnet32.c:2376 (discriminator 1)) 
> [   26.640003] pcnet32_open (drivers/net/ethernet/amd/pcnet32.c:2269) 
> [   26.640008] __dev_open (net/core/dev.c:1606) 
> [   26.640014] __dev_change_flags (net/core/dev.c:9172) 
> [   26.640018] dev_change_flags (net/core/dev.c:9244) 
> [   26.640022] do_setlink.isra.0 (net/core/rtnetlink.c:3118 (discriminator 1)) 
> [   26.640027] rtnl_newlink (net/core/rtnetlink.c:3732 net/core/rtnetlink.c:3884 net/core/rtnetlink.c:4021) 
> [   26.640031] rtnetlink_rcv_msg (net/core/rtnetlink.c:6911) 
> [   26.640036] netlink_rcv_skb (net/netlink/af_netlink.c:2543) 
> [   26.640041] netlink_unicast (net/netlink/af_netlink.c:1323 net/netlink/af_netlink.c:1348) 
> [   26.640046] netlink_sendmsg (net/netlink/af_netlink.c:1892) 
> [   26.640050] ____sys_sendmsg (net/socket.c:718 (discriminator 1) net/socket.c:733 (discriminator 1) net/socket.c:2573 (discriminator 1)) 
> [   26.640060] ___sys_sendmsg (net/socket.c:2629) 
> [   26.640066] __sys_sendmsg (net/socket.c:2659 (discriminator 1)) 
> [   26.640070] do_syscall_64 (arch/x86/entry/common.c:52 (discriminator 1) arch/x86/entry/common.c:83 (discriminator 1)) 
> [   26.640076] entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:130) 
> [   26.640094]
> [   26.640094] -> #0 (&lp->lock){+.+.}-{3:3}:
> [   26.640102] __lock_acquire (kernel/locking/lockdep.c:3164 (discriminator 1) kernel/locking/lockdep.c:3282 (discriminator 1) kernel/locking/lockdep.c:3906 (discriminator 1) kernel/locking/lockdep.c:5228 (discriminator 1)) 
> [   26.640109] lock_acquire.part.0 (kernel/locking/lockdep.c:469 (discriminator 4) kernel/locking/lockdep.c:5853 (discriminator 4)) 
> [   26.640114] rt_spin_lock (arch/x86/include/asm/current.h:47 kernel/locking/spinlock_rt.c:48 kernel/locking/spinlock_rt.c:57) 
> [   26.640118] pcnet32_interrupt (drivers/net/ethernet/amd/pcnet32.c:2572) 
> [   26.640123] irq_thread_fn (kernel/irq/manage.c:1191) 
> [   26.640129] irq_forced_thread_fn (include/linux/bottom_half.h:33 (discriminator 1) kernel/irq/manage.c:1216 (discriminator 1)) 
> [   26.640134] irq_thread (kernel/irq/manage.c:1318) 
> [   26.640138] kthread (kernel/kthread.c:464) 
> [   26.640144] ret_from_fork (arch/x86/kernel/process.c:154) 
> [   26.640151] ret_from_fork_asm (arch/x86/entry/entry_64.S:257) 
> [   26.640162]
> [   26.640162] other info that might help us debug this:
> [   26.640162]
> [   26.640188]  Possible unsafe locking scenario:
> [   26.640188]
> [   26.640192]        CPU0                    CPU1
> [   26.640196]        ----                    ----
> [   26.640203]   lock((softirq_ctrl.lock));
> [   26.640217]                                lock(&lp->lock);
> [   26.640232]                                lock((softirq_ctrl.lock));
> [   26.640251]   lock(&lp->lock);
> [   26.640264]
> [   26.640264]  *** DEADLOCK ***
> [   26.640264]
> [   26.640285] 3 locks held by irq/22-eth0/2680:
> [   26.640302] #0: ffff9cb0bdc1c818 ((softirq_ctrl.lock)){+.+.}-{3:3}, at: __local_bh_disable_ip (include/linux/rcupdate.h:847 kernel/softirq.c:156) 
> [   26.640327] #1: ffffffff97406f20 (rcu_read_lock){....}-{1:3}, at: rt_spin_lock (include/linux/rcupdate.h:337 (discriminator 1) include/linux/rcupdate.h:849 (discriminator 1) kernel/locking/spinlock_rt.c:50 (discriminator 1) kernel/locking/spinlock_rt.c:57 (discriminator 1)) 
> [   26.640351] #2: ffffffff97406f20 (rcu_read_lock){....}-{1:3}, at: __local_bh_disable_ip (include/linux/rcupdate.h:337 (discriminator 1) include/linux/rcupdate.h:849 (discriminator 1) kernel/softirq.c:156 (discriminator 1)) 
> [   26.640370]
> [   26.640370] stack backtrace:
> [   26.640464] CPU: 0 UID: 0 PID: 2680 Comm: irq/22-eth0 Tainted: G                 N 6.14.0-rc2-00003-g59b1a66735ce #1
> [   26.640507] Tainted: [N]=TEST
> [   26.640516] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org 04/01/2014
> [   26.640599] Call Trace:
> [   26.640640]  <TASK>
> [   26.640691] dump_stack_lvl (lib/dump_stack.c:123) 
> [   26.640743] print_circular_bug (kernel/locking/lockdep.c:2079) 
> [   26.640752] check_noncircular (kernel/locking/lockdep.c:2211) 
> [   26.640764] __lock_acquire (kernel/locking/lockdep.c:3164 (discriminator 1) kernel/locking/lockdep.c:3282 (discriminator 1) kernel/locking/lockdep.c:3906 (discriminator 1) kernel/locking/lockdep.c:5228 (discriminator 1)) 
> [   26.640776] lock_acquire.part.0 (kernel/locking/lockdep.c:469 (discriminator 4) kernel/locking/lockdep.c:5853 (discriminator 4)) 
> [   26.640787] ? pcnet32_interrupt (drivers/net/ethernet/amd/pcnet32.c:2572) 
> [   26.640795] ? trace_lock_acquire (include/trace/events/lock.h:24 (discriminator 2)) 
> [   26.640800] ? lock_acquire (kernel/locking/lockdep.c:5824) 
> [   26.640805] ? pcnet32_interrupt (drivers/net/ethernet/amd/pcnet32.c:2572) 
> [   26.640813] rt_spin_lock (arch/x86/include/asm/current.h:47 kernel/locking/spinlock_rt.c:48 kernel/locking/spinlock_rt.c:57) 
> [   26.640818] ? pcnet32_interrupt (drivers/net/ethernet/amd/pcnet32.c:2572) 
> [   26.640823] ? trace_lock_acquire (include/trace/events/lock.h:24 (discriminator 2)) 
> [   26.640829] pcnet32_interrupt (drivers/net/ethernet/amd/pcnet32.c:2572) 
> [   26.640835] ? irq_forced_thread_fn (include/linux/bottom_half.h:20 (discriminator 1) kernel/irq/manage.c:1210 (discriminator 1)) 
> [   26.640841] irq_thread_fn (kernel/irq/manage.c:1191) 
> [   26.640846] ? irq_forced_thread_fn (include/linux/bottom_half.h:20 (discriminator 1) kernel/irq/manage.c:1210 (discriminator 1)) 
> [   26.640850] irq_forced_thread_fn (include/linux/bottom_half.h:33 (discriminator 1) kernel/irq/manage.c:1216 (discriminator 1)) 
> [   26.640855] ? irq_thread (kernel/irq/manage.c:1307) 
> [   26.640859] irq_thread (kernel/irq/manage.c:1318) 
> [   26.640864] ? __pfx_irq_forced_thread_fn (kernel/irq/manage.c:1207) 
> [   26.640869] ? __pfx_irq_thread_dtor (kernel/irq/manage.c:1227) 
> [   26.640876] ? __pfx_irq_thread (kernel/irq/manage.c:1294) 
> [   26.640881] kthread (kernel/kthread.c:464) 
> [   26.640889] ? __pfx_kthread (kernel/kthread.c:413) 
> [   26.640896] ret_from_fork (arch/x86/kernel/process.c:154) 
> [   26.640902] ? __pfx_kthread (kernel/kthread.c:413) 
> [   26.640908] ret_from_fork_asm (arch/x86/entry/entry_64.S:257) 
> [   26.640935]  </TASK>


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: possible circular locking dependency backtrace seen when enabling PREEMPT_RT
  2025-02-12 15:56 possible circular locking dependency backtrace seen when enabling PREEMPT_RT Guenter Roeck
  2025-02-12 16:45 ` Steven Rostedt
@ 2025-02-12 16:56 ` Sebastian Andrzej Siewior
  2025-02-12 18:36   ` Guenter Roeck
  1 sibling, 1 reply; 16+ messages in thread
From: Sebastian Andrzej Siewior @ 2025-02-12 16:56 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: Clark Williams, linux-rt-devel, Steven Rostedt

On 2025-02-12 07:56:44 [-0800], Guenter Roeck wrote:
> Hi,
Hi,

> when enabling PREEMPT_RT together with lock debugging, I see the attached
> "possible circular locking dependency" warning when instantiating the pcnet32
> Ethernet adapter with qemu.

I may buy you a virtio adapter :)

What about this in the meantime:

diff --git a/drivers/net/ethernet/amd/pcnet32.c b/drivers/net/ethernet/amd/pcnet32.c
index c6bd803f5b0c1..c7648045917a6 100644
--- a/drivers/net/ethernet/amd/pcnet32.c
+++ b/drivers/net/ethernet/amd/pcnet32.c
@@ -754,6 +754,7 @@ static int pcnet32_set_link_ksettings(struct net_device *dev,
 	int r = -EOPNOTSUPP;
 	int suspended, bcr2, bcr9, csr15;
 
+	local_bh_disable();
 	spin_lock_irqsave(&lp->lock, flags);
 	if (lp->mii) {
 		r = mii_ethtool_set_link_ksettings(&lp->mii_if, cmd);
@@ -789,6 +790,7 @@ static int pcnet32_set_link_ksettings(struct net_device *dev,
 		r = 0;
 	}
 	spin_unlock_irqrestore(&lp->lock, flags);
+	local_bh_enable();
 	return r;
 }
 
@@ -890,6 +892,7 @@ static int pcnet32_set_ringparam(struct net_device *dev,
 		pcnet32_netif_stop(dev);
 
 	netdev_lock(dev);
+	local_bh_disable();
 	spin_lock_irqsave(&lp->lock, flags);
 	lp->a->write_csr(ioaddr, CSR0, CSR0_STOP);	/* stop the chip */
 
@@ -921,6 +924,7 @@ static int pcnet32_set_ringparam(struct net_device *dev,
 	}
 
 	spin_unlock_irqrestore(&lp->lock, flags);
+	local_bh_enable();
 	netdev_unlock(dev);
 
 	netif_info(lp, drv, dev, "Ring Param Settings: RX: %d, TX: %d\n",
@@ -988,6 +992,7 @@ static int pcnet32_loopback_test(struct net_device *dev, uint64_t * data1)
 		pcnet32_netif_stop(dev);
 
 	netdev_lock(dev);
+	local_bh_disable();
 	spin_lock_irqsave(&lp->lock, flags);
 	lp->a->write_csr(ioaddr, CSR0, CSR0_STOP);	/* stop the chip */
 
@@ -1065,7 +1070,9 @@ static int pcnet32_loopback_test(struct net_device *dev, uint64_t * data1)
 		rmb();
 		while ((lp->rx_ring[x].status & teststatus) && (ticks < 200)) {
 			spin_unlock_irqrestore(&lp->lock, flags);
+			local_bh_enable();
 			msleep(1);
+			local_bh_disable();
 			spin_lock_irqsave(&lp->lock, flags);
 			rmb();
 			ticks++;
@@ -1125,6 +1132,7 @@ static int pcnet32_loopback_test(struct net_device *dev, uint64_t * data1)
 		lp->a->write_bcr(ioaddr, 20, 4);	/* return to 16bit mode */
 	}
 	spin_unlock_irqrestore(&lp->lock, flags);
+	local_bh_enable();
 	netdev_unlock(dev);
 
 	return rc;
@@ -2106,6 +2114,7 @@ static int pcnet32_open(struct net_device *dev)
 	}
 
 	netdev_lock(dev);
+	local_bh_disable();
 	spin_lock_irqsave(&lp->lock, flags);
 	/* Check for a valid station address */
 	if (!is_valid_ether_addr(dev->dev_addr)) {
@@ -2305,6 +2314,7 @@ static int pcnet32_open(struct net_device *dev)
 		     lp->a->read_csr(ioaddr, CSR0));
 
 	spin_unlock_irqrestore(&lp->lock, flags);
+	local_bh_enable();
 	netdev_unlock(dev);
 
 	return 0;		/* Always succeed */
@@ -2321,6 +2331,7 @@ static int pcnet32_open(struct net_device *dev)
 
 err_free_irq:
 	spin_unlock_irqrestore(&lp->lock, flags);
+	local_bh_enable();
 	netdev_unlock(dev);
 	free_irq(dev->irq, dev);
 	return rc;

Sebastian

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: possible circular locking dependency backtrace seen when enabling PREEMPT_RT
  2025-02-12 16:45 ` Steven Rostedt
@ 2025-02-12 16:59   ` Sebastian Andrzej Siewior
  2025-02-12 17:03     ` Steven Rostedt
  2025-02-12 17:54   ` Guenter Roeck
  1 sibling, 1 reply; 16+ messages in thread
From: Sebastian Andrzej Siewior @ 2025-02-12 16:59 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Guenter Roeck, Clark Williams, linux-rt-devel, Thomas Gleixner,
	Peter Zijlstra

On 2025-02-12 11:45:31 [-0500], Steven Rostedt wrote:
> 
> Shouldn't the spin_lock_irq*() variants for PREEMPT_RT also disable local_bh?

Better not. The consequences sure wouldn't be funny.

Sebastian

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: possible circular locking dependency backtrace seen when enabling PREEMPT_RT
  2025-02-12 16:59   ` Sebastian Andrzej Siewior
@ 2025-02-12 17:03     ` Steven Rostedt
  2025-02-12 17:07       ` Steven Rostedt
  2025-02-12 17:09       ` Sebastian Andrzej Siewior
  0 siblings, 2 replies; 16+ messages in thread
From: Steven Rostedt @ 2025-02-12 17:03 UTC (permalink / raw)
  To: Sebastian Andrzej Siewior
  Cc: Guenter Roeck, Clark Williams, linux-rt-devel, Thomas Gleixner,
	Peter Zijlstra

On Wed, 12 Feb 2025 17:59:08 +0100
Sebastian Andrzej Siewior <bigeasy@linutronix.de> wrote:

> On 2025-02-12 11:45:31 [-0500], Steven Rostedt wrote:
> > 
> > Shouldn't the spin_lock_irq*() variants for PREEMPT_RT also disable local_bh?  
> 
> Better not. The consequences sure wouldn't be funny.
> 

Why not? It keeps the same paradigm as non PREEMPT_RT. Do we really want to
litter local_bh_disable around all these cases that spin_lock_irq*() is
used to disable bh?

-- Steve

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: possible circular locking dependency backtrace seen when enabling PREEMPT_RT
  2025-02-12 17:03     ` Steven Rostedt
@ 2025-02-12 17:07       ` Steven Rostedt
  2025-02-12 17:21         ` Sebastian Andrzej Siewior
  2025-02-12 17:09       ` Sebastian Andrzej Siewior
  1 sibling, 1 reply; 16+ messages in thread
From: Steven Rostedt @ 2025-02-12 17:07 UTC (permalink / raw)
  To: Sebastian Andrzej Siewior
  Cc: Guenter Roeck, Clark Williams, linux-rt-devel, Thomas Gleixner,
	Peter Zijlstra

On Wed, 12 Feb 2025 12:03:28 -0500
Steven Rostedt <rostedt@goodmis.org> wrote:

> On Wed, 12 Feb 2025 17:59:08 +0100
> Sebastian Andrzej Siewior <bigeasy@linutronix.de> wrote:
> 
> > On 2025-02-12 11:45:31 [-0500], Steven Rostedt wrote:  
> > > 
> > > Shouldn't the spin_lock_irq*() variants for PREEMPT_RT also disable local_bh?    
> > 
> > Better not. The consequences sure wouldn't be funny.
> >   
> 
> Why not? It keeps the same paradigm as non PREEMPT_RT. Do we really want to
> litter local_bh_disable around all these cases that spin_lock_irq*() is
> used to disable bh?
> 

Expanding on my argument. Why does it work for non-PREEMPT_RT but not for
PREEMPT_RT?

-- Steve

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: possible circular locking dependency backtrace seen when enabling PREEMPT_RT
  2025-02-12 17:03     ` Steven Rostedt
  2025-02-12 17:07       ` Steven Rostedt
@ 2025-02-12 17:09       ` Sebastian Andrzej Siewior
  2025-02-12 17:18         ` Steven Rostedt
  1 sibling, 1 reply; 16+ messages in thread
From: Sebastian Andrzej Siewior @ 2025-02-12 17:09 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Guenter Roeck, Clark Williams, linux-rt-devel, Thomas Gleixner,
	Peter Zijlstra

On 2025-02-12 12:03:28 [-0500], Steven Rostedt wrote:
> On Wed, 12 Feb 2025 17:59:08 +0100
> Sebastian Andrzej Siewior <bigeasy@linutronix.de> wrote:
> 
> > On 2025-02-12 11:45:31 [-0500], Steven Rostedt wrote:
> > > 
> > > Shouldn't the spin_lock_irq*() variants for PREEMPT_RT also disable local_bh?  
> > 
> > Better not. The consequences sure wouldn't be funny.
> > 
> 
> Why not? It keeps the same paradigm as non PREEMPT_RT. Do we really want to
> litter local_bh_disable around all these cases that spin_lock_irq*() is
> used to disable bh?

Yes.

> -- Steve

Sebastian

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: possible circular locking dependency backtrace seen when enabling PREEMPT_RT
  2025-02-12 17:09       ` Sebastian Andrzej Siewior
@ 2025-02-12 17:18         ` Steven Rostedt
  2025-02-12 17:24           ` Sebastian Andrzej Siewior
  0 siblings, 1 reply; 16+ messages in thread
From: Steven Rostedt @ 2025-02-12 17:18 UTC (permalink / raw)
  To: Sebastian Andrzej Siewior
  Cc: Guenter Roeck, Clark Williams, linux-rt-devel, Thomas Gleixner,
	Peter Zijlstra

On Wed, 12 Feb 2025 18:09:55 +0100
Sebastian Andrzej Siewior <bigeasy@linutronix.de> wrote:

> > Why not? It keeps the same paradigm as non PREEMPT_RT. Do we really want to
> > litter local_bh_disable around all these cases that spin_lock_irq*() is
> > used to disable bh?  
> 
> Yes.

OK, after testing that patch I see the issue. The local_bh_disable() makes
it look like we are in a softirq, and that triggers a bunch of
BUG(in_interrupt()) that are around the kernel.

Couldn't we make the spin_lock_irq*() also disable softirqs without making
softirq_count() return true?

That would keep the same paradigm between non-PREEMPT_RT as well as
PREEMPT_RT without having to litter these all over the place.

-- Steve

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: possible circular locking dependency backtrace seen when enabling PREEMPT_RT
  2025-02-12 17:07       ` Steven Rostedt
@ 2025-02-12 17:21         ` Sebastian Andrzej Siewior
  0 siblings, 0 replies; 16+ messages in thread
From: Sebastian Andrzej Siewior @ 2025-02-12 17:21 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Guenter Roeck, Clark Williams, linux-rt-devel, Thomas Gleixner,
	Peter Zijlstra

On 2025-02-12 12:07:06 [-0500], Steven Rostedt wrote:
> 
> Expanding on my argument. Why does it work for non-PREEMPT_RT but not for
> PREEMPT_RT?

The semantics are different. It is not a race on !RT but *might* happen
on RT.
The other alternative would be to add additional locking into
pcnet32_access() and avoid having the lock in the ISR.
But this driver/ hardware is old and probably hardly used outside of
qemu. We did not have any reports about this recently. We had a few
reports within the net stack but this is gone now.

So. Adding your suggestion into the core code just to satisfy one driver
is not something I had in mind.

> -- Steve

Sebastian

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: possible circular locking dependency backtrace seen when enabling PREEMPT_RT
  2025-02-12 17:18         ` Steven Rostedt
@ 2025-02-12 17:24           ` Sebastian Andrzej Siewior
  2025-02-12 17:33             ` Steven Rostedt
  0 siblings, 1 reply; 16+ messages in thread
From: Sebastian Andrzej Siewior @ 2025-02-12 17:24 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Guenter Roeck, Clark Williams, linux-rt-devel, Thomas Gleixner,
	Peter Zijlstra

On 2025-02-12 12:18:37 [-0500], Steven Rostedt wrote:
> On Wed, 12 Feb 2025 18:09:55 +0100
> Sebastian Andrzej Siewior <bigeasy@linutronix.de> wrote:
> 
> > > Why not? It keeps the same paradigm as non PREEMPT_RT. Do we really want to
> > > litter local_bh_disable around all these cases that spin_lock_irq*() is
> > > used to disable bh?  
> > 
> > Yes.
> 
> OK, after testing that patch I see the issue. The local_bh_disable() makes
> it look like we are in a softirq, and that triggers a bunch of
> BUG(in_interrupt()) that are around the kernel.
> 
> Couldn't we make the spin_lock_irq*() also disable softirqs without making
> softirq_count() return true?

Maybe. But I don't see the advantage. See my other reply.

> That would keep the same paradigm between non-PREEMPT_RT as well as
> PREEMPT_RT without having to litter these all over the place.

I am working on getting rid of the lock in local_bh_disable(). Guess
what happens then in terms of "same paradigm".

> -- Steve

Sebastian

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: possible circular locking dependency backtrace seen when enabling PREEMPT_RT
  2025-02-12 17:24           ` Sebastian Andrzej Siewior
@ 2025-02-12 17:33             ` Steven Rostedt
  2025-02-13  8:38               ` Sebastian Andrzej Siewior
  0 siblings, 1 reply; 16+ messages in thread
From: Steven Rostedt @ 2025-02-12 17:33 UTC (permalink / raw)
  To: Sebastian Andrzej Siewior
  Cc: Guenter Roeck, Clark Williams, linux-rt-devel, Thomas Gleixner,
	Peter Zijlstra

On Wed, 12 Feb 2025 18:24:17 +0100
Sebastian Andrzej Siewior <bigeasy@linutronix.de> wrote:

> > That would keep the same paradigm between non-PREEMPT_RT as well as
> > PREEMPT_RT without having to litter these all over the place.  
> 
> I am working on getting rid of the lock in local_bh_disable(). Guess
> what happens then in terms of "same paradigm".

No idea.

When you disable interrupts in non PREEMPT_RT, it also disables the softirqs for
that CPU. Thus a spin_lock_irq*() by definition will disable the softirqs too.

I guess it also comes down to how many places this happens. If it's not
that common, then perhaps this is the simplest solution. I just don't want
this to become the new cond_resched(), where we have to sprinkle
local_bh_disable() around to solve issues that are reported here and there.

-- Steve

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: possible circular locking dependency backtrace seen when enabling PREEMPT_RT
  2025-02-12 16:45 ` Steven Rostedt
  2025-02-12 16:59   ` Sebastian Andrzej Siewior
@ 2025-02-12 17:54   ` Guenter Roeck
  2025-02-12 18:17     ` Steven Rostedt
  1 sibling, 1 reply; 16+ messages in thread
From: Guenter Roeck @ 2025-02-12 17:54 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Sebastian Andrzej Siewior, Clark Williams, linux-rt-devel,
	Thomas Gleixner, Peter Zijlstra

On 2/12/25 08:45, Steven Rostedt wrote:
> On Wed, 12 Feb 2025 07:56:44 -0800
> Guenter Roeck <linux@roeck-us.net> wrote:
> 
>> Hi,
>>
>> when enabling PREEMPT_RT together with lock debugging, I see the attached
>> "possible circular locking dependency" warning when instantiating the pcnet32
>> Ethernet adapter with qemu.
>>
>> Note: This is with
>>
>> lockdep: Remove disable_irq_lockdep().
>> lockdep: Don't disable interrupts on RT in disable_irq_nosync_lockdep.*()
>>
>> applied on the top of the mainline kernel.
> 
> Thanks for the report.
> 
>>
>> Thanks,
>> Guenter
>>
>> ---
>> Build reference: v6.14-rc2-3-g59b1a66735ce
>> Compiler version: x86_64-linux-gcc (GCC) 13.3.0
>> Qemu version: 9.1.2 (v9.1.2-51-g94825e22f3)
>> ...
>> Starting network: [   26.638045] pcnet32 0000:00:02.0 eth0: link up
>> [   26.639386]
>> [   26.639429] ======================================================
>> [   26.639435] WARNING: possible circular locking dependency detected
>> [   26.639595] 6.14.0-rc2-00003-g59b1a66735ce #1 Tainted: G                 N
>> [   26.639609] ------------------------------------------------------
>> [   26.639616] irq/22-eth0/2680 is trying to acquire lock:
>> [   26.639648] ffff9cb0438dae30 (&lp->lock){+.+.}-{3:3}, at: pcnet32_interrupt+0x2e/0x1e0
> 
> So the spin_lock(lp->lock) is being taken from the interrupt handler (now a
> thread), while it already holds the softirq_ctrl.lock from the
> local_bh_disable() in the irq_thread_fn().
> 
>> [   26.639853]
>> [   26.639853] but task is already holding lock:
>> [   26.639858] ffff9cb0bdc1c818 ((softirq_ctrl.lock)){+.+.}-{3:3}, at: __local_bh_disable_ip+0x94/0x180
>> [   26.639877]
>> [   26.639877] which lock already depends on the new lock.
>> [   26.639877]
>> [   26.639882]
>> [   26.639882] the existing dependency chain (in reverse order) is:
>> [   26.639898]
>> [   26.639898] -> #1 ((softirq_ctrl.lock)){+.+.}-{3:3}:
>> [   26.639950]        rt_spin_lock+0x39/0x170
>> [   26.639985]        __local_bh_disable_ip+0x94/0x180
>> [   26.639991]        __netdev_alloc_skb+0x139/0x1c0
> 
> The __netdev_alloc_skb() calls local_bh_disable() (which takes the
> softirq_ctrl.lock in PREEMPT_RT).
> 
>> [   26.639998]        pcnet32_init_ring+0x18b/0x310
>> [   26.640003]        pcnet32_open+0x477/0x820
> 
> But here it already acquired the lp->lock via a spin_lock_irqsave().
> 
> Now, local_bh_disable() in non PREEMPT_RT disables preemption as well as
> softirqs. But in PREEMPT_RT it does not disable preemption and has the
> following code from __local_bh_disable_ip() in softirq.c:
> 
> 	/* First entry of a task into a BH disabled section? */
> 	if (!current->softirq_disable_cnt) {
> 		if (preemptible()) {
> 			local_lock(&softirq_ctrl.lock);
> 			/* Required to meet the RCU bottomhalf requirements. */
> 			rcu_read_lock();
> 		} else {
> 			DEBUG_LOCKS_WARN_ON(this_cpu_read(softirq_ctrl.cnt));
> 		}
> 	}
> 
> Where that local_lock() disables preemption and prevents softirqs from
> executing on this CPU.
> 
> But in non PREEMPT_RT, spin_lock_irqsave() (as well as spin_lock_irq())
> disables preemption and because it also disables interrupts will disable
> softirqs too.
> 
> Shouldn't the spin_lock_irq*() variants for PREEMPT_RT also disable local_bh?
> 
> Like this patch (untested):
> 
> diff --git a/include/linux/spinlock_rt.h b/include/linux/spinlock_rt.h
> index f6499c37157d..50ad0fab66b6 100644
> --- a/include/linux/spinlock_rt.h
> +++ b/include/linux/spinlock_rt.h
> @@ -90,6 +90,7 @@ static __always_inline void spin_lock_bh(spinlock_t *lock)
>   
>   static __always_inline void spin_lock_irq(spinlock_t *lock)
>   {
> +	local_bh_disable();
>   	rt_spin_lock(lock);
>   }
>   
> @@ -97,12 +98,14 @@ static __always_inline void spin_lock_irq(spinlock_t *lock)
>   	do {						 \
>   		typecheck(unsigned long, flags);	 \
>   		flags = 0;				 \
> +		local_bh_disable();			 \
>   		spin_lock(lock);			 \
>   	} while (0)
>   
>   static __always_inline void spin_unlock(spinlock_t *lock)
>   {
>   	rt_spin_unlock(lock);
> +	local_bh_enable();
>   }
>   
>   static __always_inline void spin_unlock_bh(spinlock_t *lock)
> @@ -114,6 +117,7 @@ static __always_inline void spin_unlock_bh(spinlock_t *lock)
>   static __always_inline void spin_unlock_irq(spinlock_t *lock)
>   {
>   	rt_spin_unlock(lock);
> +	local_bh_enable();
>   }
>   
>   static __always_inline void spin_unlock_irqrestore(spinlock_t *lock,
> 
> 
> We could probably consolidate the spin_lock_bh() with spin_lock_irq()
> variants.
> 
> Guenter,
> 
> Can you test that patch to see if it stops this lockdep splat?
> 

That results in a variety of interesting warning backtraces and crashes :-).

[    0.013997] WARNING: CPU: 0 PID: 0 at kernel/softirq.c:212 __local_bh_enable_ip+0xe2/0x160
...
[    0.014890] Call Trace:
[    0.014975]  <TASK>
[    0.015082]  ? __warn+0x8c/0x190
[    0.015115]  ? __local_bh_enable_ip+0xe2/0x160
[    0.015127]  ? report_bug+0x164/0x190
[    0.015144]  ? early_fixup_exception+0xa4/0xc0
[    0.015158]  ? early_idt_handler_common+0x2f/0x40
[    0.015184]  ? update_page_count+0x3c/0x50
[    0.015192]  ? __local_bh_enable_ip+0xe2/0x160
[    0.015206]  ? phys_pte_init+0xaa/0x1c0
[    0.015225]  ? phys_pmd_init+0x242/0x3d0
[    0.015248]  ? phys_pud_init+0xb4/0x3d0
[    0.015261]  ? phys_pud_init+0x52/0x3d0
[    0.015276]  ? __kernel_physical_mapping_init+0x171/0x380
[    0.015298]  ? init_memory_mapping+0x14e/0x3d0
[    0.015335]  ? init_mem_mapping+0xed/0x450
[    0.015350]  ? setup_arch+0x757/0xd60
[    0.015371]  ? start_kernel+0x6b/0x810
[    0.015391]  ? x86_64_start_reservations+0x18/0x30
[    0.015397]  ? x86_64_start_kernel+0xc5/0xe0
[    0.015406]  ? common_startup_64+0x12c/0x138
[    0.015447]  </TASK>
...
[    0.246710] ------------[ cut here ]------------
[    0.246720] kernel BUG at mm/vmalloc.c:3118!
[    0.247070] Oops: invalid opcode: 0000 [#1] PREEMPT_RT SMP PTI
[    0.247152] CPU: 0 UID: 0 PID: 0 Comm: swapper/0 Tainted: G        W          6.14.0-rc2-00004-g7c65c4480e19 #1
[    0.247175] Tainted: [W]=WARN
[    0.247180] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org 04/01/2014
[    0.247185] RIP: 0010:__get_vm_area_node+0x124/0x140
[    0.247204] Code: ff ff ff 48 0f bd ca ba 0c 00 00 00 83 c1 01 39 d1 0f 4c ca ba 1e 00 00 00 39 d1 0f 4f ca 48 d3 e0 49 89 c6 e9 4a ff ff f
f 90 <0f> 0b 48 89 ef e8 e2 5f 01 00 31 ed eb b0 66 66 2e 0f 1f 84 00 00
[    0.247210] RSP: 0000:ffffffffbdc03df8 EFLAGS: 00010006
[    0.247221] RAX: 000000000000a200 RBX: 0000000000000004 RCX: 0000000000000004
[    0.247225] RDX: 0000000000000000 RSI: 000000000000000c RDI: 0000000000004000
[    0.247227] RBP: 0000000000004000 R08: ffffac1540000000 R09: ffffcc153fffffff
[    0.247230] R10: ffff9459010577c0 R11: 0000000000000000 R12: 0000000000000004
[    0.247233] R13: ffffffffbdc03e88 R14: 0000000000000001 R15: 0000000000014770
[    0.247236] FS:  0000000000000000(0000) GS:ffff94590f800000(0000) knlGS:0000000000000000
[    0.247240] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[    0.247243] CR2: ffff94590f001000 CR3: 000000000d2f6000 CR4: 00000000000000b0
[    0.247247] Call Trace:
[    0.247278]  <TASK>
[    0.247295]  ? die+0x31/0x80
[    0.247304]  ? do_trap+0xd8/0x100
[    0.247312]  ? __get_vm_area_node+0x124/0x140
[    0.247320]  ? __get_vm_area_node+0x124/0x140
[    0.247326]  ? do_error_trap+0x78/0x100
[    0.247333]  ? __get_vm_area_node+0x124/0x140
[    0.247342]  ? exc_invalid_op+0x51/0x70
[    0.247348]  ? __get_vm_area_node+0x124/0x140
[    0.247354]  ? asm_exc_invalid_op+0x1a/0x20
[    0.247374]  ? __get_vm_area_node+0x124/0x140
[    0.247389]  get_vm_area_caller+0x39/0x50
[    0.247406]  ? irq_init_percpu_irqstack+0xe8/0x120
[    0.247414]  vmap+0x64/0xe0
[    0.247423]  irq_init_percpu_irqstack+0xe8/0x120
[    0.247435]  init_IRQ+0x56/0x70
[    0.247446]  start_kernel+0x366/0x810
[    0.247456]  x86_64_start_reservations+0x18/0x30
[    0.247463]  x86_64_start_kernel+0xc5/0xe0
[    0.247470]  common_startup_64+0x12c/0x138
[    0.247489]  </TASK>


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: possible circular locking dependency backtrace seen when enabling PREEMPT_RT
  2025-02-12 17:54   ` Guenter Roeck
@ 2025-02-12 18:17     ` Steven Rostedt
  0 siblings, 0 replies; 16+ messages in thread
From: Steven Rostedt @ 2025-02-12 18:17 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: Sebastian Andrzej Siewior, Clark Williams, linux-rt-devel,
	Thomas Gleixner, Peter Zijlstra

On Wed, 12 Feb 2025 09:54:20 -0800
Guenter Roeck <linux@roeck-us.net> wrote:

> > Can you test that patch to see if it stops this lockdep splat?
> >   
> 
> That results in a variety of interesting warning backtraces and crashes :-).

I said I didn't test it ;-) It also had a bug where I put the
local_bh_enable() in the wrong function. But that doesn't matter, there's
other issues with it.

Could you try Sebastian's version instead.

Thanks,

-- Steve

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: possible circular locking dependency backtrace seen when enabling PREEMPT_RT
  2025-02-12 16:56 ` Sebastian Andrzej Siewior
@ 2025-02-12 18:36   ` Guenter Roeck
  2025-02-13  8:28     ` Sebastian Andrzej Siewior
  0 siblings, 1 reply; 16+ messages in thread
From: Guenter Roeck @ 2025-02-12 18:36 UTC (permalink / raw)
  To: Sebastian Andrzej Siewior; +Cc: Clark Williams, linux-rt-devel, Steven Rostedt

On 2/12/25 08:56, Sebastian Andrzej Siewior wrote:
> On 2025-02-12 07:56:44 [-0800], Guenter Roeck wrote:
>> Hi,
> Hi,
> 
>> when enabling PREEMPT_RT together with lock debugging, I see the attached
>> "possible circular locking dependency" warning when instantiating the pcnet32
>> Ethernet adapter with qemu.
> 
> I may buy you a virtio adapter :)
> 

The whole point of my testing is to execute as much code as possible.
I _do_ test various virtio devices, but to limit testing to virtio
would defeat the purpose.

> What about this in the meantime:

Yes, that passes my tests (with and without rt enabled).

Tested-by: Guenter Roeck <linux@roeck-us.net>

Thanks,
Guenter

> 
> diff --git a/drivers/net/ethernet/amd/pcnet32.c b/drivers/net/ethernet/amd/pcnet32.c
> index c6bd803f5b0c1..c7648045917a6 100644
> --- a/drivers/net/ethernet/amd/pcnet32.c
> +++ b/drivers/net/ethernet/amd/pcnet32.c
> @@ -754,6 +754,7 @@ static int pcnet32_set_link_ksettings(struct net_device *dev,
>   	int r = -EOPNOTSUPP;
>   	int suspended, bcr2, bcr9, csr15;
>   
> +	local_bh_disable();
>   	spin_lock_irqsave(&lp->lock, flags);
>   	if (lp->mii) {
>   		r = mii_ethtool_set_link_ksettings(&lp->mii_if, cmd);
> @@ -789,6 +790,7 @@ static int pcnet32_set_link_ksettings(struct net_device *dev,
>   		r = 0;
>   	}
>   	spin_unlock_irqrestore(&lp->lock, flags);
> +	local_bh_enable();
>   	return r;
>   }
>   
> @@ -890,6 +892,7 @@ static int pcnet32_set_ringparam(struct net_device *dev,
>   		pcnet32_netif_stop(dev);
>   
>   	netdev_lock(dev);
> +	local_bh_disable();
>   	spin_lock_irqsave(&lp->lock, flags);
>   	lp->a->write_csr(ioaddr, CSR0, CSR0_STOP);	/* stop the chip */
>   
> @@ -921,6 +924,7 @@ static int pcnet32_set_ringparam(struct net_device *dev,
>   	}
>   
>   	spin_unlock_irqrestore(&lp->lock, flags);
> +	local_bh_enable();
>   	netdev_unlock(dev);
>   
>   	netif_info(lp, drv, dev, "Ring Param Settings: RX: %d, TX: %d\n",
> @@ -988,6 +992,7 @@ static int pcnet32_loopback_test(struct net_device *dev, uint64_t * data1)
>   		pcnet32_netif_stop(dev);
>   
>   	netdev_lock(dev);
> +	local_bh_disable();
>   	spin_lock_irqsave(&lp->lock, flags);
>   	lp->a->write_csr(ioaddr, CSR0, CSR0_STOP);	/* stop the chip */
>   
> @@ -1065,7 +1070,9 @@ static int pcnet32_loopback_test(struct net_device *dev, uint64_t * data1)
>   		rmb();
>   		while ((lp->rx_ring[x].status & teststatus) && (ticks < 200)) {
>   			spin_unlock_irqrestore(&lp->lock, flags);
> +			local_bh_enable();
>   			msleep(1);
> +			local_bh_disable();
>   			spin_lock_irqsave(&lp->lock, flags);
>   			rmb();
>   			ticks++;
> @@ -1125,6 +1132,7 @@ static int pcnet32_loopback_test(struct net_device *dev, uint64_t * data1)
>   		lp->a->write_bcr(ioaddr, 20, 4);	/* return to 16bit mode */
>   	}
>   	spin_unlock_irqrestore(&lp->lock, flags);
> +	local_bh_enable();
>   	netdev_unlock(dev);
>   
>   	return rc;
> @@ -2106,6 +2114,7 @@ static int pcnet32_open(struct net_device *dev)
>   	}
>   
>   	netdev_lock(dev);
> +	local_bh_disable();
>   	spin_lock_irqsave(&lp->lock, flags);
>   	/* Check for a valid station address */
>   	if (!is_valid_ether_addr(dev->dev_addr)) {
> @@ -2305,6 +2314,7 @@ static int pcnet32_open(struct net_device *dev)
>   		     lp->a->read_csr(ioaddr, CSR0));
>   
>   	spin_unlock_irqrestore(&lp->lock, flags);
> +	local_bh_enable();
>   	netdev_unlock(dev);
>   
>   	return 0;		/* Always succeed */
> @@ -2321,6 +2331,7 @@ static int pcnet32_open(struct net_device *dev)
>   
>   err_free_irq:
>   	spin_unlock_irqrestore(&lp->lock, flags);
> +	local_bh_enable();
>   	netdev_unlock(dev);
>   	free_irq(dev->irq, dev);
>   	return rc;
> 
> Sebastian


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: possible circular locking dependency backtrace seen when enabling PREEMPT_RT
  2025-02-12 18:36   ` Guenter Roeck
@ 2025-02-13  8:28     ` Sebastian Andrzej Siewior
  0 siblings, 0 replies; 16+ messages in thread
From: Sebastian Andrzej Siewior @ 2025-02-13  8:28 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: Clark Williams, linux-rt-devel, Steven Rostedt

On 2025-02-12 10:36:06 [-0800], Guenter Roeck wrote:
> > I may buy you a virtio adapter :)
> 
> The whole point of my testing is to execute as much code as possible.
> I _do_ test various virtio devices, but to limit testing to virtio
> would defeat the purpose.

I understand.

> > What about this in the meantime:
> 
> Yes, that passes my tests (with and without rt enabled).
> 
> Tested-by: Guenter Roeck <linux@roeck-us.net>

Thank you. Let me think what I do here…

> Thanks,
> Guenter

Sebastian

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: possible circular locking dependency backtrace seen when enabling PREEMPT_RT
  2025-02-12 17:33             ` Steven Rostedt
@ 2025-02-13  8:38               ` Sebastian Andrzej Siewior
  0 siblings, 0 replies; 16+ messages in thread
From: Sebastian Andrzej Siewior @ 2025-02-13  8:38 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Guenter Roeck, Clark Williams, linux-rt-devel, Thomas Gleixner,
	Peter Zijlstra

On 2025-02-12 12:33:02 [-0500], Steven Rostedt wrote:
> I guess it also comes down to how many places this happens. If it's not
> that common, then perhaps this is the simplest solution. I just don't want
> this to become the new cond_resched(), where we have to sprinkle
> local_bh_disable() around to solve issues that are reported here and there.

Don't worry about that. Both, the ne2k and the pcnet driver are _old_. I
had the ne2k as ISA a while ago. Maybe even a PCI later on.
Converting the ne2k to proper NAPI would avoid the problem.
Adding a bus-lock to the pcnet driver would avoid the problem by in the
driver by not having to disable interrupts for the entire NAPI routine.

> -- Steve

Sebastian

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2025-02-13  8:38 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-12 15:56 possible circular locking dependency backtrace seen when enabling PREEMPT_RT Guenter Roeck
2025-02-12 16:45 ` Steven Rostedt
2025-02-12 16:59   ` Sebastian Andrzej Siewior
2025-02-12 17:03     ` Steven Rostedt
2025-02-12 17:07       ` Steven Rostedt
2025-02-12 17:21         ` Sebastian Andrzej Siewior
2025-02-12 17:09       ` Sebastian Andrzej Siewior
2025-02-12 17:18         ` Steven Rostedt
2025-02-12 17:24           ` Sebastian Andrzej Siewior
2025-02-12 17:33             ` Steven Rostedt
2025-02-13  8:38               ` Sebastian Andrzej Siewior
2025-02-12 17:54   ` Guenter Roeck
2025-02-12 18:17     ` Steven Rostedt
2025-02-12 16:56 ` Sebastian Andrzej Siewior
2025-02-12 18:36   ` Guenter Roeck
2025-02-13  8:28     ` Sebastian Andrzej Siewior

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.