Skip to content

Commit 31ce9ff

Browse files
committed
wifi: mt76: mt7921s: fix potential hung tasks during chip recovery
jira LE-2015 cve CVE-2024-40977 Rebuild_History Non-Buildable kernel-5.14.0-427.42.1.el9_4 commit-author Leon Yen <leon.yen@mediatek.com> commit ecf0b2b During chip recovery (e.g. chip reset), there is a possible situation that kernel worker reset_work is holding the lock and waiting for kernel thread stat_worker to be parked, while stat_worker is waiting for the release of the same lock. It causes a deadlock resulting in the dumping of hung tasks messages and possible rebooting of the device. This patch prevents the execution of stat_worker during the chip recovery. Signed-off-by: Leon Yen <leon.yen@mediatek.com> Signed-off-by: Ming Yen Hsieh <MingYen.Hsieh@mediatek.com> Signed-off-by: Felix Fietkau <nbd@nbd.name> (cherry picked from commit ecf0b2b) Signed-off-by: Jonathan Maple <jmaple@ciq.com>
1 parent e0bb0d0 commit 31ce9ff

File tree

4 files changed

+4
-5
lines changed

4 files changed

+4
-5
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -663,6 +663,7 @@ void mt7921_mac_reset_work(struct work_struct *work)
663663
int i, ret;
664664

665665
dev_dbg(dev->mt76.dev, "chip reset\n");
666+
set_bit(MT76_RESET, &dev->mphy.state);
666667
dev->hw_full_reset = true;
667668
ieee80211_stop_queues(hw);
668669

@@ -691,6 +692,7 @@ void mt7921_mac_reset_work(struct work_struct *work)
691692
}
692693

693694
dev->hw_full_reset = false;
695+
clear_bit(MT76_RESET, &dev->mphy.state);
694696
pm->suspended = false;
695697
ieee80211_wake_queues(hw);
696698
ieee80211_iterate_active_interfaces(hw,

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ int mt7921e_mac_reset(struct mt792x_dev *dev)
6464
mt76_wr(dev, dev->irq_map->host_irq_enable, 0);
6565
mt76_wr(dev, MT_PCIE_MAC_INT_ENABLE, 0x0);
6666

67-
set_bit(MT76_RESET, &dev->mphy.state);
6867
set_bit(MT76_MCU_RESET, &dev->mphy.state);
6968
wake_up(&dev->mt76.mcu.wait);
7069
skb_queue_purge(&dev->mt76.mcu.res_q);
@@ -115,7 +114,6 @@ int mt7921e_mac_reset(struct mt792x_dev *dev)
115114

116115
err = __mt7921_start(&dev->phy);
117116
out:
118-
clear_bit(MT76_RESET, &dev->mphy.state);
119117

120118
local_bh_disable();
121119
napi_enable(&dev->mt76.tx_napi);

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,6 @@ int mt7921s_mac_reset(struct mt792x_dev *dev)
9898
mt76_connac_free_pending_tx_skbs(&dev->pm, NULL);
9999
mt76_txq_schedule_all(&dev->mphy);
100100
mt76_worker_disable(&dev->mt76.tx_worker);
101-
set_bit(MT76_RESET, &dev->mphy.state);
102101
set_bit(MT76_MCU_RESET, &dev->mphy.state);
103102
wake_up(&dev->mt76.mcu.wait);
104103
skb_queue_purge(&dev->mt76.mcu.res_q);
@@ -134,7 +133,6 @@ int mt7921s_mac_reset(struct mt792x_dev *dev)
134133

135134
err = __mt7921_start(&dev->phy);
136135
out:
137-
clear_bit(MT76_RESET, &dev->mphy.state);
138136

139137
mt76_worker_enable(&dev->mt76.tx_worker);
140138

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -499,7 +499,8 @@ static void mt76s_tx_status_data(struct work_struct *work)
499499
dev = container_of(sdio, struct mt76_dev, sdio);
500500

501501
while (true) {
502-
if (test_bit(MT76_REMOVED, &dev->phy.state))
502+
if (test_bit(MT76_RESET, &dev->phy.state) ||
503+
test_bit(MT76_REMOVED, &dev->phy.state))
503504
break;
504505

505506
if (!dev->drv->tx_status_data(dev, &update))

0 commit comments

Comments
 (0)