You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
netdev: Fix lockdep warnings in multiqueue configurations.
When support for multiple TX queues were added, the netif_tx_lock() routines we converted to iterate over all TX queues and grab each queue's spinlock. This causes heartburn for lockdep and it's not a healthy thing to do with lots of TX queues anyways. So modify this to use a top-level lock and a "frozen" state for the individual TX queues. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
+7
-5
@@ -69,18 +69,20 @@ static void ri_tasklet(unsigned long dev)
|
||||
struct net_device *_dev = (struct net_device *)dev;
|
||||
struct ifb_private *dp = netdev_priv(_dev);
|
||||
struct net_device_stats *stats = &_dev->stats;
|
||||
struct netdev_queue *txq;
|
||||
struct sk_buff *skb;
|
||||
|
||||
txq = netdev_get_tx_queue(_dev, 0);
|
||||
dp->st_task_enter++;
|
||||
if ((skb = skb_peek(&dp->tq)) == NULL) {
|
||||
dp->st_txq_refl_try++;
|
||||
if (netif_tx_trylock(_dev)) {
|
||||
if (__netif_tx_trylock(txq)) {
|
||||
dp->st_rxq_enter++;
|
||||
while ((skb = skb_dequeue(&dp->rq)) != NULL) {
|
||||
skb_queue_tail(&dp->tq, skb);
|
||||
dp->st_rx2tx_tran++;
|
||||
}
|
||||
netif_tx_unlock(_dev);
|
||||
__netif_tx_unlock(txq);
|
||||
} else {
|
||||
/* reschedule */
|
||||
dp->st_rxq_notenter++;
|
||||
@@ -115,7 +117,7 @@ static void ri_tasklet(unsigned long dev)
|
||||
BUG();
|
||||
}
|
||||
|
||||
if (netif_tx_trylock(_dev)) {
|
||||
if (__netif_tx_trylock(txq)) {
|
||||
dp->st_rxq_check++;
|
||||
if ((skb = skb_peek(&dp->rq)) == NULL) {
|
||||
dp->tasklet_pending = 0;
|
||||
@@ -123,10 +125,10 @@ static void ri_tasklet(unsigned long dev)
|
||||
netif_wake_queue(_dev);
|
||||
} else {
|
||||
dp->st_rxq_rsch++;
|
||||
netif_tx_unlock(_dev);
|
||||
__netif_tx_unlock(txq);
|
||||
goto resched;
|
||||
}
|
||||
netif_tx_unlock(_dev);
|
||||
__netif_tx_unlock(txq);
|
||||
} else {
|
||||
resched:
|
||||
dp->tasklet_pending = 1;
|
||||
|
||||
Reference in New Issue
Block a user