[RFC] issues with locks

Holger Schurig hs4233 at mail.mn-solutions.de
Fri Jan 25 08:24:36 EST 2008


Hi Dan and others !

I recently notices that I have issues with locks. I enabled a
bunch of debugging options in my kernel:

------------------
CONFIG_SMP=y
CONFIG_SUSPEND_SMP_POSSIBLE=y
CONFIG_DEBUG_SHIRQ=y
CONFIG_DETECT_SOFTLOCKUP=y
CONFIG_DEBUG_PREEMPT=y
CONFIG_DEBUG_RT_MUTEXES=y
CONFIG_DEBUG_PI_LIST=y
CONFIG_DEBUG_SPINLOCK=y
CONFIG_DEBUG_MUTEXES=y
CONFIG_DEBUG_LOCK_ALLOC=y
CONFIG_PROVE_LOCKING=y
CONFIG_LOCKDEP=y
CONFIG_DEBUG_LOCKDEP=y
CONFIG_TRACE_IRQFLAGS=y
CONFIG_DEBUG_SPINLOCK_SLEEP=y
CONFIG_DEBUG_BUGVERBOSE=y
CONFIG_DEBUG_LIST=y
CONFIG_DEBUG_STACKOVERFLOW=y
CONFIG_DEBUG_STACK_USAGE=y
CONFIG_DEBUG_PAGEALLOC=y
CONFIG_DEBUG_RODATA=y
CONFIG_DOUBLEFAULT=y
------------------

and then I started to make simple tests with CF and USB. One
result of this is the recently posted "libertas: fix interrupt
while removing driver" patch.

However, I have problems in the area of locking where I don't
have enought knowledge to find out what's going on.

Let's start with the easy thing. I think the right fix for this:

------------------
[ INFO: possible recursive locking detected ]
2.6.24-rc8 #15

lbs_main/3782 is trying to acquire lock:
 (&priv->driver_lock){+...}, at: [<f88fb2dc>] if_cs_get_int_status+0x29f/0x487 [libertas_cs

but task is already holding lock:
 (&priv->driver_lock){+...}, at: [<f89174b5>] lbs_thread+0x332/0x7ea [libertas]
------------------

is this patch:




Subject: [PATCH] libertas: fix recursive locking

This fixes the "INFO: possible recursive locking detected" detected by
CONFIG_PROVE_LOCKING. The only caller to sbi_get_int_status_exit already did
take priv->driver_lock, so don't do it again.

Signed-off-by: Holger Schurig <hs4233 at mail.mn-solutions.de>

Index: wireless-2.6/drivers/net/wireless/libertas/if_cs.c
===================================================================
--- wireless-2.6.orig/drivers/net/wireless/libertas/if_cs.c	2008-01-25 13:50:20.000000000 +0100
+++ wireless-2.6/drivers/net/wireless/libertas/if_cs.c	2008-01-25 13:50:56.000000000 +0100
@@ -677,9 +677,7 @@ sbi_get_int_status_exit:
 
 	/* Card has a command result for us */
 	if (*ireg & IF_CS_C_S_CMD_UPLD_RDY) {
-		spin_lock(&priv->driver_lock);
 		ret = if_cs_receive_cmdres(priv, priv->upld_buf, &priv->upld_len);
-		spin_unlock(&priv->driver_lock);
 		if (ret < 0)
 			lbs_pr_err("could not receive cmd from card\n");
 	}


However, after this I still have another problem:

[ INFO: inconsistent lock state ]
2.6.24-rc8 #17

inconsistent {in-hardirq-W} -> {hardirq-on-W} usage.
lbs_main/2468 [HC0[0]:SC1[1]:HE1:SE0] takes:
 (&priv->driver_lock){+...}, at: [<f8af64c0>] lbs_thread+0x336/0x7f0 [libertas]
{in-hardirq-W} state was registered at:
  [<c013acc8>] __lock_acquire+0x3fd/0xbfc
  [<c013b538>] lock_acquire+0x71/0x8b
  [<c0348907>] _spin_lock+0x35/0x42
  [<f88fafb6>] if_cs_interrupt+0xa9/0xcc [libertas_cs]
  [<c0144432>] handle_IRQ_event+0x1a/0x46
  [<c014594f>] handle_level_irq+0x7f/0xc8
  [<c0106922>] do_IRQ+0x7c/0x96
  [<c01049f2>] common_interrupt+0x2e/0x34
  [<c020d64b>] acpi_idle_enter_bm+0xb3/0x2d6
  [<c02b760d>] cpuidle_idle_call+0x5b/0x7e
  [<c0102535>] cpu_idle+0x7a/0xab
  [<c03461d5>] rest_init+0x5d/0x5f
  [<c0473bdf>] start_kernel+0x2c8/0x2d0
  [<00000000>] 0x0
  [<ffffffff>] 0xffffffff
irq event stamp: 819
hardirqs last  enabled at (817): [<c0348e75>] _spin_unlock_irqrestore+0x36/0x59
hardirqs last disabled at (818): [<c0348ac4>] _spin_lock_irq+0xf/0x48
softirqs last  enabled at (0): [<c011ca10>] copy_process+0x4f4/0x119d
softirqs last disabled at (819): [<c01228b9>] do_softirq+0x39/0x55

other info that might help us debug this:
1 lock held by lbs_main/2468:
 #0:  (&priv->driver_lock){+...}, at: [<f8af64c0>] lbs_thread+0x336/0x7f0 [libertas]

stack backtrace:
Pid: 2468, comm: lbs_main Not tainted 2.6.24-rc8 #17
 [<c0104fe0>] show_trace_log_lvl+0x1a/0x2f
 [<c0105a04>] show_trace+0x12/0x14
 [<c010615c>] dump_stack+0x6c/0x72
 [<c0139622>] print_usage_bug+0x140/0x14a
 [<c013a012>] mark_lock+0x210/0x45b
 [<c013a29e>] mark_held_locks+0x41/0x5c
 [<c013a478>] trace_hardirqs_on+0x10b/0x14c
 [<c01227f6>] __do_softirq+0x5b/0xe5
 [<c01228b9>] do_softirq+0x39/0x55
 [<c02f1fa1>] netif_rx_ni+0x35/0x58
 [<f8afbd17>] lbs_process_rxed_packet+0x7b7/0x838 [libertas]
 [<f88fb251>] if_cs_get_int_status+0x278/0x46f [libertas_cs]
 [<f8af64de>] lbs_thread+0x354/0x7f0 [libertas]
 [<c012eed8>] kthread+0x3b/0x63
 [<c0104c2f>] kernel_thread_helper+0x7/0x10
 =======================

What should say this to me?



More information about the libertas-dev mailing list