Search Linux Wireless

Re: hwtkip hangs on b43

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 01/23/2010 02:46 AM, kecsa@xxxxxxxxxxxxxxxx wrote:
Hi,

when I load b43 with hwtkip=1 system hangs after
' b43-phy0 debug: Using hardware based encryption for keyidx: 0, mac:...'
throwing the below BUG.

This is a non-SMP non-preemtive kernel.  It looks like we are entering
b43_op_update_tkip_key() already holding the wl->mutex. We lock mutex in
b43_interrupt_thread_handler().

This problem is present in stable and also in compat-wireless-2010-01-22
shapshot if I haven't missed something. As a quick and dirty fix I have
removed wl->mutex lock/unlock from b43_op_update_tkip_key(). Box survived
one day (until now) and a ~3GB file transfer over WLAN using hwtkip in
this way.

Your analysis seem to be correct. I tested with the following patch, which tests to see if the mutex is locked on entry. If not, it logs a message, locks the mutex and sets a flag to indicate that the mutex should be unlocked on exit. This patch is not SMP-safe, but is merely for testing. The printk statement has not triggered after about 1 hour of testing. I'll give it a bit more testing before a final patch is submitted.

Index: wireless-testing/drivers/net/wireless/b43/main.c
===================================================================
--- wireless-testing.orig/drivers/net/wireless/b43/main.c
+++ wireless-testing/drivers/net/wireless/b43/main.c
@@ -850,11 +850,16 @@ static void b43_op_update_tkip_key(struc
 	struct b43_wl *wl = hw_to_b43_wl(hw);
 	struct b43_wldev *dev;
 	int index = keyconf->hw_key_idx;
+	bool locked_here = 0;

 	if (B43_WARN_ON(!modparam_hwtkip))
 		return;

-	mutex_lock(&wl->mutex);
+	if (!mutex_is_locked(&wl->mutex)) {
+		printk(KERN_DEBUG "b43: mutex not locked in %s\n", __func__);
+		mutex_lock(&wl->mutex);
+		locked_here = 1;
+	}

 	dev = wl->current_dev;
 	if (!dev || b43_status(dev) < B43_STAT_INITIALIZED)
@@ -866,7 +871,8 @@ static void b43_op_update_tkip_key(struc
 	keymac_write(dev, index, addr);

 out_unlock:
-	mutex_unlock(&wl->mutex);
+	if (locked_here)
+		mutex_unlock(&wl->mutex);
 }

 static void do_key_write(struct b43_wldev *dev,

==================================================


Larry


--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux