]> www.infradead.org Git - users/willy/pagecache.git/commitdiff
wifi: mt76: move napi_enable() from under BH
authorJakub Kicinski <kuba@kernel.org>
Fri, 24 Jan 2025 03:18:41 +0000 (19:18 -0800)
committerJakub Kicinski <kuba@kernel.org>
Mon, 27 Jan 2025 22:30:50 +0000 (14:30 -0800)
mt76 does a lot of:

  local_bh_disable();
  napi_enable(...napi);
  napi_schedule(...napi);
  local_bh_enable();

local_bh_disable() is not a real lock, its most likely taken
because napi_schedule() requires that we invoke softirqs at
some point. napi_enable() needs to take a mutex, so move it
from under the BH protection.

Fixes: 413f0271f396 ("net: protect NAPI enablement with netdev_lock()")
Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
Link: https://lore.kernel.org/dcfd56bc-de32-4b11-9e19-d8bd1543745d@stanley.mountain
Reviewed-by: Eric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20250124031841.1179756-8-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
12 files changed:
drivers/net/wireless/mediatek/mt76/mt7603/mac.c
drivers/net/wireless/mediatek/mt76/mt7615/pci.c
drivers/net/wireless/mediatek/mt76/mt7615/pci_mac.c
drivers/net/wireless/mediatek/mt76/mt76x0/pci.c
drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c
drivers/net/wireless/mediatek/mt76/mt76x2/pci.c
drivers/net/wireless/mediatek/mt76/mt7915/mac.c
drivers/net/wireless/mediatek/mt76/mt7921/pci.c
drivers/net/wireless/mediatek/mt76/mt7921/pci_mac.c
drivers/net/wireless/mediatek/mt76/mt7925/pci.c
drivers/net/wireless/mediatek/mt76/mt7925/pci_mac.c
drivers/net/wireless/mediatek/mt76/mt7996/mac.c

index a259f4dd95401c6575e017cdf7f8e46d21187907..413973d05b4319139639df01f44c374aec7e8d8f 100644 (file)
@@ -1479,14 +1479,13 @@ static void mt7603_mac_watchdog_reset(struct mt7603_dev *dev)
        tasklet_enable(&dev->mt76.pre_tbtt_tasklet);
        mt7603_beacon_set_timer(dev, -1, beacon_int);
 
-       local_bh_disable();
        napi_enable(&dev->mt76.tx_napi);
-       napi_schedule(&dev->mt76.tx_napi);
-
        napi_enable(&dev->mt76.napi[0]);
-       napi_schedule(&dev->mt76.napi[0]);
-
        napi_enable(&dev->mt76.napi[1]);
+
+       local_bh_disable();
+       napi_schedule(&dev->mt76.tx_napi);
+       napi_schedule(&dev->mt76.napi[0]);
        napi_schedule(&dev->mt76.napi[1]);
        local_bh_enable();
 
index 9a278589df4ef7129f03fb403c19c5093efba6e2..68010e27f065ee15d20c012850f29dbcca1c7e3a 100644 (file)
@@ -164,12 +164,16 @@ static int mt7615_pci_resume(struct pci_dev *pdev)
                dev_err(mdev->dev, "PDMA engine must be reinitialized\n");
 
        mt76_worker_enable(&mdev->tx_worker);
-       local_bh_disable();
+
        mt76_for_each_q_rx(mdev, i) {
                napi_enable(&mdev->napi[i]);
-               napi_schedule(&mdev->napi[i]);
        }
        napi_enable(&mdev->tx_napi);
+
+       local_bh_disable();
+       mt76_for_each_q_rx(mdev, i) {
+               napi_schedule(&mdev->napi[i]);
+       }
        napi_schedule(&mdev->tx_napi);
        local_bh_enable();
 
index a0ca3bbdfcafb3c480a64be9174fa941881ea292..c2e4e6aabd9fac6b8d79ac7fd8b4f5a1984eeece 100644 (file)
@@ -262,12 +262,14 @@ void mt7615_mac_reset_work(struct work_struct *work)
 
        mt76_worker_enable(&dev->mt76.tx_worker);
 
-       local_bh_disable();
        napi_enable(&dev->mt76.tx_napi);
-       napi_schedule(&dev->mt76.tx_napi);
-
        mt76_for_each_q_rx(&dev->mt76, i) {
                napi_enable(&dev->mt76.napi[i]);
+       }
+
+       local_bh_disable();
+       napi_schedule(&dev->mt76.tx_napi);
+       mt76_for_each_q_rx(&dev->mt76, i) {
                napi_schedule(&dev->mt76.napi[i]);
        }
        local_bh_enable();
index 1eb955f3ca130bd0a1d89d178dec097b6c53821a..b456ccd00d581ffc983bed78f7578572e203db11 100644 (file)
@@ -282,14 +282,16 @@ static int mt76x0e_resume(struct pci_dev *pdev)
 
        mt76_worker_enable(&mdev->tx_worker);
 
-       local_bh_disable();
        mt76_for_each_q_rx(mdev, i) {
                mt76_queue_rx_reset(dev, i);
                napi_enable(&mdev->napi[i]);
-               napi_schedule(&mdev->napi[i]);
        }
-
        napi_enable(&mdev->tx_napi);
+
+       local_bh_disable();
+       mt76_for_each_q_rx(mdev, i) {
+               napi_schedule(&mdev->napi[i]);
+       }
        napi_schedule(&mdev->tx_napi);
        local_bh_enable();
 
index 7d840ad4ae65e7b700a5f0b05c1c35f6d64ecaa3..a82c75ba26e660d8ca4d6cc3bc550327b62248d7 100644 (file)
@@ -504,12 +504,14 @@ static void mt76x02_watchdog_reset(struct mt76x02_dev *dev)
        mt76_worker_enable(&dev->mt76.tx_worker);
        tasklet_enable(&dev->mt76.pre_tbtt_tasklet);
 
-       local_bh_disable();
        napi_enable(&dev->mt76.tx_napi);
-       napi_schedule(&dev->mt76.tx_napi);
-
        mt76_for_each_q_rx(&dev->mt76, i) {
                napi_enable(&dev->mt76.napi[i]);
+       }
+
+       local_bh_disable();
+       napi_schedule(&dev->mt76.tx_napi);
+       mt76_for_each_q_rx(&dev->mt76, i) {
                napi_schedule(&dev->mt76.napi[i]);
        }
        local_bh_enable();
index 67c9d1caa0bd6371804e92a2cc00d80b2ce99c58..727bfdd00b40007a72e0bdbcd0f29705f11545f4 100644 (file)
@@ -151,12 +151,15 @@ mt76x2e_resume(struct pci_dev *pdev)
 
        mt76_worker_enable(&mdev->tx_worker);
 
-       local_bh_disable();
        mt76_for_each_q_rx(mdev, i) {
                napi_enable(&mdev->napi[i]);
-               napi_schedule(&mdev->napi[i]);
        }
        napi_enable(&mdev->tx_napi);
+
+       local_bh_disable();
+       mt76_for_each_q_rx(mdev, i) {
+               napi_schedule(&mdev->napi[i]);
+       }
        napi_schedule(&mdev->tx_napi);
        local_bh_enable();
 
index 13bdc0a7174c909c074c1647d27aec0e3f2f1d0f..2ba6eb3038cec498c8bb45d057eb6dda5fff038b 100644 (file)
@@ -1356,10 +1356,15 @@ mt7915_mac_restart(struct mt7915_dev *dev)
 
        mt7915_dma_reset(dev, true);
 
-       local_bh_disable();
        mt76_for_each_q_rx(mdev, i) {
                if (mdev->q_rx[i].ndesc) {
                        napi_enable(&dev->mt76.napi[i]);
+               }
+       }
+
+       local_bh_disable();
+       mt76_for_each_q_rx(mdev, i) {
+               if (mdev->q_rx[i].ndesc) {
                        napi_schedule(&dev->mt76.napi[i]);
                }
        }
@@ -1419,8 +1424,9 @@ out:
        if (phy2)
                clear_bit(MT76_RESET, &phy2->mt76->state);
 
-       local_bh_disable();
        napi_enable(&dev->mt76.tx_napi);
+
+       local_bh_disable();
        napi_schedule(&dev->mt76.tx_napi);
        local_bh_enable();
 
@@ -1570,9 +1576,12 @@ void mt7915_mac_reset_work(struct work_struct *work)
        if (phy2)
                clear_bit(MT76_RESET, &phy2->mt76->state);
 
-       local_bh_disable();
        mt76_for_each_q_rx(&dev->mt76, i) {
                napi_enable(&dev->mt76.napi[i]);
+       }
+
+       local_bh_disable();
+       mt76_for_each_q_rx(&dev->mt76, i) {
                napi_schedule(&dev->mt76.napi[i]);
        }
        local_bh_enable();
@@ -1581,8 +1590,8 @@ void mt7915_mac_reset_work(struct work_struct *work)
 
        mt76_worker_enable(&dev->mt76.tx_worker);
 
-       local_bh_disable();
        napi_enable(&dev->mt76.tx_napi);
+       local_bh_disable();
        napi_schedule(&dev->mt76.tx_napi);
        local_bh_enable();
 
index ba870e1b05fb888eeeb23bd198a36e90621b18c7..a0c9df3c2cc75c5cb612c44d77bf57706fd808c3 100644 (file)
@@ -523,12 +523,15 @@ static int mt7921_pci_resume(struct device *device)
 
        mt76_worker_enable(&mdev->tx_worker);
 
-       local_bh_disable();
        mt76_for_each_q_rx(mdev, i) {
                napi_enable(&mdev->napi[i]);
-               napi_schedule(&mdev->napi[i]);
        }
        napi_enable(&mdev->tx_napi);
+
+       local_bh_disable();
+       mt76_for_each_q_rx(mdev, i) {
+               napi_schedule(&mdev->napi[i]);
+       }
        napi_schedule(&mdev->tx_napi);
        local_bh_enable();
 
index 2452b1a2d11870437b1128c27e0a0c3c2eebfa75..881812ba03ffa256a4d02e467fdf3bc4de973086 100644 (file)
@@ -81,9 +81,12 @@ int mt7921e_mac_reset(struct mt792x_dev *dev)
 
        mt792x_wpdma_reset(dev, true);
 
-       local_bh_disable();
        mt76_for_each_q_rx(&dev->mt76, i) {
                napi_enable(&dev->mt76.napi[i]);
+       }
+
+       local_bh_disable();
+       mt76_for_each_q_rx(&dev->mt76, i) {
                napi_schedule(&dev->mt76.napi[i]);
        }
        local_bh_enable();
@@ -115,8 +118,8 @@ int mt7921e_mac_reset(struct mt792x_dev *dev)
        err = __mt7921_start(&dev->phy);
 out:
 
-       local_bh_disable();
        napi_enable(&dev->mt76.tx_napi);
+       local_bh_disable();
        napi_schedule(&dev->mt76.tx_napi);
        local_bh_enable();
 
index f36893e20c617fe8e61ebdcc844de65cb6332704..c7b5dc1dbb349597702d1822768b741dd86beda9 100644 (file)
@@ -556,12 +556,15 @@ static int mt7925_pci_resume(struct device *device)
 
        mt76_worker_enable(&mdev->tx_worker);
 
-       local_bh_disable();
        mt76_for_each_q_rx(mdev, i) {
                napi_enable(&mdev->napi[i]);
-               napi_schedule(&mdev->napi[i]);
        }
        napi_enable(&mdev->tx_napi);
+
+       local_bh_disable();
+       mt76_for_each_q_rx(mdev, i) {
+               napi_schedule(&mdev->napi[i]);
+       }
        napi_schedule(&mdev->tx_napi);
        local_bh_enable();
 
index faedbf766d1a01df5d34f4af45f10f6359a0a777..4578d16bf456af6e314424f6dd20d56db7b37b2a 100644 (file)
@@ -101,12 +101,15 @@ int mt7925e_mac_reset(struct mt792x_dev *dev)
 
        mt792x_wpdma_reset(dev, true);
 
-       local_bh_disable();
        mt76_for_each_q_rx(&dev->mt76, i) {
                napi_enable(&dev->mt76.napi[i]);
-               napi_schedule(&dev->mt76.napi[i]);
        }
        napi_enable(&dev->mt76.tx_napi);
+
+       local_bh_disable();
+       mt76_for_each_q_rx(&dev->mt76, i) {
+               napi_schedule(&dev->mt76.napi[i]);
+       }
        napi_schedule(&dev->mt76.tx_napi);
        local_bh_enable();
 
index bc8cba4dca47cf7b0c9eb448740773f1d4e1dab9..019c925ae600e872dcf212550a34ad9a88bd531b 100644 (file)
@@ -1695,7 +1695,6 @@ mt7996_mac_restart(struct mt7996_dev *dev)
 
        mt7996_dma_reset(dev, true);
 
-       local_bh_disable();
        mt76_for_each_q_rx(mdev, i) {
                if (mtk_wed_device_active(&dev->mt76.mmio.wed) &&
                    mt76_queue_is_wed_rro(&mdev->q_rx[i]))
@@ -1703,10 +1702,11 @@ mt7996_mac_restart(struct mt7996_dev *dev)
 
                if (mdev->q_rx[i].ndesc) {
                        napi_enable(&dev->mt76.napi[i]);
+                       local_bh_disable();
                        napi_schedule(&dev->mt76.napi[i]);
+                       local_bh_enable();
                }
        }
-       local_bh_enable();
        clear_bit(MT76_MCU_RESET, &dev->mphy.state);
        clear_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state);
 
@@ -1764,8 +1764,8 @@ out:
        if (phy3)
                clear_bit(MT76_RESET, &phy3->mt76->state);
 
-       local_bh_disable();
        napi_enable(&dev->mt76.tx_napi);
+       local_bh_disable();
        napi_schedule(&dev->mt76.tx_napi);
        local_bh_enable();
 
@@ -1958,23 +1958,23 @@ void mt7996_mac_reset_work(struct work_struct *work)
        if (phy3)
                clear_bit(MT76_RESET, &phy3->mt76->state);
 
-       local_bh_disable();
        mt76_for_each_q_rx(&dev->mt76, i) {
                if (mtk_wed_device_active(&dev->mt76.mmio.wed) &&
                    mt76_queue_is_wed_rro(&dev->mt76.q_rx[i]))
                        continue;
 
                napi_enable(&dev->mt76.napi[i]);
+               local_bh_disable();
                napi_schedule(&dev->mt76.napi[i]);
+               local_bh_enable();
        }
-       local_bh_enable();
 
        tasklet_schedule(&dev->mt76.irq_tasklet);
 
        mt76_worker_enable(&dev->mt76.tx_worker);
 
-       local_bh_disable();
        napi_enable(&dev->mt76.tx_napi);
+       local_bh_disable();
        napi_schedule(&dev->mt76.tx_napi);
        local_bh_enable();