Skip to contentSkip to conversation

mac802154: tx: fix synced xmit deadlock

PATCH In review Alexander Aring 2 participants 2 messages Dec 9, 2015 – Dec 10, 2015

Subsystems (2)
lore
Share & tools
lore

Alexander Aring

author maintainer
#0 lore raw

PATCH v2 1/1 mac802154: tx: fix synced xmit deadlock

This patch reverts 6001d52 ("mac802154: tx: don't allow if down while sync tx"). This has side effects with stop callback which flush the transmit workqueue. The stop callback will wait until the workqueue is flushed and holding the rtnl lock. That means it can happen that the stop callback waits forever because it try to lock the rtnl mutex which is already hold by stop callback.

Cc Michael Hennerich <[email protected]>

---
changes since v2:
- remove ASSERT_RTNL as well in "xmit sync" driver-ops.

 net/mac802154/driver-ops.h | 3 ---
 net/mac802154/tx.c         | 9 ---------
 2 files changed, 12 deletions(-)
net/mac802154/driver-ops.h +0 -3
index 0550f33..fd9daf2 100644
@@ -18,9 +18,6 @@ drv_xmit_async(struct ieee802154_local *local, struct sk_buff *skb)
 static inline int
 drv_xmit_sync(struct ieee802154_local *local, struct sk_buff *skb)
 {
-	/* don't allow other operations while sync xmit */
-	ASSERT_RTNL();
-
 	might_sleep();
 
 	return local->ops->xmit_sync(&local->hw, skb);
net/mac802154/tx.c +0 -9
index 3827f35..7e25345 100644
@@ -38,12 +38,6 @@ void ieee802154_xmit_worker(struct work_struct *work)
 	struct net_device *dev = skb->dev;
 	int res;
 
-	rtnl_lock();
-
-	/* check if ifdown occurred while schedule */
-	if (!netif_running(dev))
-		goto err_tx;
-
 	res = drv_xmit_sync(local, skb);
 	if (res)
 		goto err_tx;
@@ -53,14 +47,11 @@ void ieee802154_xmit_worker(struct work_struct *work)
 	dev->stats.tx_packets++;
 	dev->stats.tx_bytes += skb->len;
 
-	rtnl_unlock();
-
 	return;
 
 err_tx:
 	/* Restart the netif queue on each sub_if_data object. */
 	ieee802154_wake_queue(&local->hw);
-	rtnl_unlock();
 	kfree_skb(skb);
 	netdev_dbg(dev, "transmission failed\n");
 }
Signature · 1 line
2.6.1
#1 lore raw

Hi Alex,

Quoted 9 lines

This patch reverts 6001d52 ("mac802154: tx: don't allow if down while sync tx"). This has side effects with stop callback which flush the transmit workqueue. The stop callback will wait until the workqueue is flushed and holding the rtnl lock. That means it can happen that the stop callback waits forever because it try to lock the rtnl mutex which is already hold by stop callback.

Cc Michael Hennerich <[email protected]>
Quoted 7 lines

---
changes since v2:
- remove ASSERT_RTNL as well in "xmit sync" driver-ops.

net/mac802154/driver-ops.h | 3 ---
net/mac802154/tx.c | 9 ---------

2 files changed, 12 deletions(-)

patch has been applied to bluetooth-next tree.

Regards

Marcel