Skip to content

Commit a605586

Browse files
committed
wifi: mt76: move napi_enable() from under BH
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: 413f027 ("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>
1 parent 09a9394 commit a605586

File tree

12 files changed

+69
-36
lines changed

12 files changed

+69
-36
lines changed

drivers/net/wireless/mediatek/mt76/mt7603/mac.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1479,14 +1479,13 @@ static void mt7603_mac_watchdog_reset(struct mt7603_dev *dev)
14791479
tasklet_enable(&dev->mt76.pre_tbtt_tasklet);
14801480
mt7603_beacon_set_timer(dev, -1, beacon_int);
14811481

1482-
local_bh_disable();
14831482
napi_enable(&dev->mt76.tx_napi);
1484-
napi_schedule(&dev->mt76.tx_napi);
1485-
14861483
napi_enable(&dev->mt76.napi[0]);
1487-
napi_schedule(&dev->mt76.napi[0]);
1488-
14891484
napi_enable(&dev->mt76.napi[1]);
1485+
1486+
local_bh_disable();
1487+
napi_schedule(&dev->mt76.tx_napi);
1488+
napi_schedule(&dev->mt76.napi[0]);
14901489
napi_schedule(&dev->mt76.napi[1]);
14911490
local_bh_enable();
14921491

drivers/net/wireless/mediatek/mt76/mt7615/pci.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,12 +164,16 @@ static int mt7615_pci_resume(struct pci_dev *pdev)
164164
dev_err(mdev->dev, "PDMA engine must be reinitialized\n");
165165

166166
mt76_worker_enable(&mdev->tx_worker);
167-
local_bh_disable();
167+
168168
mt76_for_each_q_rx(mdev, i) {
169169
napi_enable(&mdev->napi[i]);
170-
napi_schedule(&mdev->napi[i]);
171170
}
172171
napi_enable(&mdev->tx_napi);
172+
173+
local_bh_disable();
174+
mt76_for_each_q_rx(mdev, i) {
175+
napi_schedule(&mdev->napi[i]);
176+
}
173177
napi_schedule(&mdev->tx_napi);
174178
local_bh_enable();
175179

drivers/net/wireless/mediatek/mt76/mt7615/pci_mac.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -262,12 +262,14 @@ void mt7615_mac_reset_work(struct work_struct *work)
262262

263263
mt76_worker_enable(&dev->mt76.tx_worker);
264264

265-
local_bh_disable();
266265
napi_enable(&dev->mt76.tx_napi);
267-
napi_schedule(&dev->mt76.tx_napi);
268-
269266
mt76_for_each_q_rx(&dev->mt76, i) {
270267
napi_enable(&dev->mt76.napi[i]);
268+
}
269+
270+
local_bh_disable();
271+
napi_schedule(&dev->mt76.tx_napi);
272+
mt76_for_each_q_rx(&dev->mt76, i) {
271273
napi_schedule(&dev->mt76.napi[i]);
272274
}
273275
local_bh_enable();

drivers/net/wireless/mediatek/mt76/mt76x0/pci.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -282,14 +282,16 @@ static int mt76x0e_resume(struct pci_dev *pdev)
282282

283283
mt76_worker_enable(&mdev->tx_worker);
284284

285-
local_bh_disable();
286285
mt76_for_each_q_rx(mdev, i) {
287286
mt76_queue_rx_reset(dev, i);
288287
napi_enable(&mdev->napi[i]);
289-
napi_schedule(&mdev->napi[i]);
290288
}
291-
292289
napi_enable(&mdev->tx_napi);
290+
291+
local_bh_disable();
292+
mt76_for_each_q_rx(mdev, i) {
293+
napi_schedule(&mdev->napi[i]);
294+
}
293295
napi_schedule(&mdev->tx_napi);
294296
local_bh_enable();
295297

drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -504,12 +504,14 @@ static void mt76x02_watchdog_reset(struct mt76x02_dev *dev)
504504
mt76_worker_enable(&dev->mt76.tx_worker);
505505
tasklet_enable(&dev->mt76.pre_tbtt_tasklet);
506506

507-
local_bh_disable();
508507
napi_enable(&dev->mt76.tx_napi);
509-
napi_schedule(&dev->mt76.tx_napi);
510-
511508
mt76_for_each_q_rx(&dev->mt76, i) {
512509
napi_enable(&dev->mt76.napi[i]);
510+
}
511+
512+
local_bh_disable();
513+
napi_schedule(&dev->mt76.tx_napi);
514+
mt76_for_each_q_rx(&dev->mt76, i) {
513515
napi_schedule(&dev->mt76.napi[i]);
514516
}
515517
local_bh_enable();

drivers/net/wireless/mediatek/mt76/mt76x2/pci.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,12 +151,15 @@ mt76x2e_resume(struct pci_dev *pdev)
151151

152152
mt76_worker_enable(&mdev->tx_worker);
153153

154-
local_bh_disable();
155154
mt76_for_each_q_rx(mdev, i) {
156155
napi_enable(&mdev->napi[i]);
157-
napi_schedule(&mdev->napi[i]);
158156
}
159157
napi_enable(&mdev->tx_napi);
158+
159+
local_bh_disable();
160+
mt76_for_each_q_rx(mdev, i) {
161+
napi_schedule(&mdev->napi[i]);
162+
}
160163
napi_schedule(&mdev->tx_napi);
161164
local_bh_enable();
162165

drivers/net/wireless/mediatek/mt76/mt7915/mac.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1356,10 +1356,15 @@ mt7915_mac_restart(struct mt7915_dev *dev)
13561356

13571357
mt7915_dma_reset(dev, true);
13581358

1359-
local_bh_disable();
13601359
mt76_for_each_q_rx(mdev, i) {
13611360
if (mdev->q_rx[i].ndesc) {
13621361
napi_enable(&dev->mt76.napi[i]);
1362+
}
1363+
}
1364+
1365+
local_bh_disable();
1366+
mt76_for_each_q_rx(mdev, i) {
1367+
if (mdev->q_rx[i].ndesc) {
13631368
napi_schedule(&dev->mt76.napi[i]);
13641369
}
13651370
}
@@ -1419,8 +1424,9 @@ mt7915_mac_restart(struct mt7915_dev *dev)
14191424
if (phy2)
14201425
clear_bit(MT76_RESET, &phy2->mt76->state);
14211426

1422-
local_bh_disable();
14231427
napi_enable(&dev->mt76.tx_napi);
1428+
1429+
local_bh_disable();
14241430
napi_schedule(&dev->mt76.tx_napi);
14251431
local_bh_enable();
14261432

@@ -1570,9 +1576,12 @@ void mt7915_mac_reset_work(struct work_struct *work)
15701576
if (phy2)
15711577
clear_bit(MT76_RESET, &phy2->mt76->state);
15721578

1573-
local_bh_disable();
15741579
mt76_for_each_q_rx(&dev->mt76, i) {
15751580
napi_enable(&dev->mt76.napi[i]);
1581+
}
1582+
1583+
local_bh_disable();
1584+
mt76_for_each_q_rx(&dev->mt76, i) {
15761585
napi_schedule(&dev->mt76.napi[i]);
15771586
}
15781587
local_bh_enable();
@@ -1581,8 +1590,8 @@ void mt7915_mac_reset_work(struct work_struct *work)
15811590

15821591
mt76_worker_enable(&dev->mt76.tx_worker);
15831592

1584-
local_bh_disable();
15851593
napi_enable(&dev->mt76.tx_napi);
1594+
local_bh_disable();
15861595
napi_schedule(&dev->mt76.tx_napi);
15871596
local_bh_enable();
15881597

drivers/net/wireless/mediatek/mt76/mt7921/pci.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -523,12 +523,15 @@ static int mt7921_pci_resume(struct device *device)
523523

524524
mt76_worker_enable(&mdev->tx_worker);
525525

526-
local_bh_disable();
527526
mt76_for_each_q_rx(mdev, i) {
528527
napi_enable(&mdev->napi[i]);
529-
napi_schedule(&mdev->napi[i]);
530528
}
531529
napi_enable(&mdev->tx_napi);
530+
531+
local_bh_disable();
532+
mt76_for_each_q_rx(mdev, i) {
533+
napi_schedule(&mdev->napi[i]);
534+
}
532535
napi_schedule(&mdev->tx_napi);
533536
local_bh_enable();
534537

drivers/net/wireless/mediatek/mt76/mt7921/pci_mac.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,12 @@ int mt7921e_mac_reset(struct mt792x_dev *dev)
8181

8282
mt792x_wpdma_reset(dev, true);
8383

84-
local_bh_disable();
8584
mt76_for_each_q_rx(&dev->mt76, i) {
8685
napi_enable(&dev->mt76.napi[i]);
86+
}
87+
88+
local_bh_disable();
89+
mt76_for_each_q_rx(&dev->mt76, i) {
8790
napi_schedule(&dev->mt76.napi[i]);
8891
}
8992
local_bh_enable();
@@ -115,8 +118,8 @@ int mt7921e_mac_reset(struct mt792x_dev *dev)
115118
err = __mt7921_start(&dev->phy);
116119
out:
117120

118-
local_bh_disable();
119121
napi_enable(&dev->mt76.tx_napi);
122+
local_bh_disable();
120123
napi_schedule(&dev->mt76.tx_napi);
121124
local_bh_enable();
122125

drivers/net/wireless/mediatek/mt76/mt7925/pci.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -556,12 +556,15 @@ static int mt7925_pci_resume(struct device *device)
556556

557557
mt76_worker_enable(&mdev->tx_worker);
558558

559-
local_bh_disable();
560559
mt76_for_each_q_rx(mdev, i) {
561560
napi_enable(&mdev->napi[i]);
562-
napi_schedule(&mdev->napi[i]);
563561
}
564562
napi_enable(&mdev->tx_napi);
563+
564+
local_bh_disable();
565+
mt76_for_each_q_rx(mdev, i) {
566+
napi_schedule(&mdev->napi[i]);
567+
}
565568
napi_schedule(&mdev->tx_napi);
566569
local_bh_enable();
567570

0 commit comments

Comments
 (0)