summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSalvatore Bonaccorso <carnil@debian.org>2022-11-03 12:33:46 +0100
committerSalvatore Bonaccorso <carnil@debian.org>2022-11-03 12:34:25 +0100
commit26ae8fa30cfab9aeea14cc9bce0210f67c09cfc7 (patch)
treea73c7fca102949edc01c346a14a647f5d82e11bb
parentf55dd613442f49b544ea51c4d44138097aafa8bb (diff)
downloadlinux-debian-26ae8fa30cfab9aeea14cc9bce0210f67c09cfc7.tar.gz
wifi: ath11k: avoid deadlock during regulatory update in ath11k_regd_update()
Closes: #1023329
-rw-r--r--debian/changelog7
-rw-r--r--debian/patches/bugfix/all/wifi-ath11k-avoid-deadlock-during-regulatory-update-.patch96
-rw-r--r--debian/patches/series1
3 files changed, 104 insertions, 0 deletions
diff --git a/debian/changelog b/debian/changelog
index 0e56ead70..427facadc 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+linux (6.0.6-3) UNRELEASED; urgency=medium
+
+ * wifi: ath11k: avoid deadlock during regulatory update in
+ ath11k_regd_update() (Closes: #1023329)
+
+ -- Salvatore Bonaccorso <carnil@debian.org> Thu, 03 Nov 2022 12:34:11 +0100
+
linux (6.0.6-2) unstable; urgency=medium
* Ignore ABI changes for ahci_fill_cmd_slot, phylink_create and
diff --git a/debian/patches/bugfix/all/wifi-ath11k-avoid-deadlock-during-regulatory-update-.patch b/debian/patches/bugfix/all/wifi-ath11k-avoid-deadlock-during-regulatory-update-.patch
new file mode 100644
index 000000000..b6ed4396d
--- /dev/null
+++ b/debian/patches/bugfix/all/wifi-ath11k-avoid-deadlock-during-regulatory-update-.patch
@@ -0,0 +1,96 @@
+From: Wen Gong <quic_wgong@quicinc.com>
+Date: Wed, 2 Nov 2022 13:48:03 +0200
+Subject: wifi: ath11k: avoid deadlock during regulatory update in
+ ath11k_regd_update()
+Origin: https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git/commit/?id=f45cb6b29cd36514e13f7519770873d8c0457008
+Bug-Debian: https://bugs.debian.org/1023329
+
+(cherry picked from commit d99884ad9e3673a12879bc2830f6e5a66cccbd78 in ath-next
+as users are seeing this bug more now, also cc stable)
+
+Running this test in a loop it is easy to reproduce an rtnl deadlock:
+
+iw reg set FI
+ifconfig wlan0 down
+
+What happens is that thread A (workqueue) tries to update the regulatory:
+
+ try to acquire the rtnl_lock of ar->regd_update_work
+
+ rtnl_lock+0x17/0x20
+ ath11k_regd_update+0x15a/0x260 [ath11k]
+ ath11k_regd_update_work+0x15/0x20 [ath11k]
+ process_one_work+0x228/0x670
+ worker_thread+0x4d/0x440
+ kthread+0x16d/0x1b0
+ ret_from_fork+0x22/0x30
+
+And thread B (ifconfig) tries to stop the interface:
+
+ try to cancel_work_sync(&ar->regd_update_work) in ath11k_mac_op_stop().
+ ifconfig 3109 [003] 2414.232506: probe:
+
+ ath11k_mac_op_stop: (ffffffffc14187a0)
+ drv_stop+0x30 ([mac80211])
+ ieee80211_do_stop+0x5d2 ([mac80211])
+ ieee80211_stop+0x3e ([mac80211])
+ __dev_close_many+0x9e ([kernel.kallsyms])
+ __dev_change_flags+0xbe ([kernel.kallsyms])
+ dev_change_flags+0x23 ([kernel.kallsyms])
+ devinet_ioctl+0x5e3 ([kernel.kallsyms])
+ inet_ioctl+0x197 ([kernel.kallsyms])
+ sock_do_ioctl+0x4d ([kernel.kallsyms])
+ sock_ioctl+0x264 ([kernel.kallsyms])
+ __x64_sys_ioctl+0x92 ([kernel.kallsyms])
+ do_syscall_64+0x3a ([kernel.kallsyms])
+ entry_SYSCALL_64_after_hwframe+0x63 ([kernel.kallsyms])
+ __GI___ioctl+0x7 (/lib/x86_64-linux-gnu/libc-2.23.so)
+
+The sequence of deadlock is:
+
+1. Thread B calls rtnl_lock().
+
+2. Thread A starts to run and calls rtnl_lock() from within
+ ath11k_regd_update_work(), then enters wait state because the lock is owned by
+ thread B.
+
+3. Thread B continues to run and tries to call
+ cancel_work_sync(&ar->regd_update_work), but thread A is in
+ ath11k_regd_update_work() waiting for rtnl_lock(). So cancel_work_sync()
+ forever waits for ath11k_regd_update_work() to finish and we have a deadlock.
+
+Fix this by switching from using regulatory_set_wiphy_regd_sync() to
+regulatory_set_wiphy_regd(). Now cfg80211 will schedule another workqueue which
+handles the locking on it's own. So the ath11k workqueue can simply exit without
+taking any locks, avoiding the deadlock.
+
+Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3
+
+Cc: <stable@vger.kernel.org>
+Signed-off-by: Wen Gong <quic_wgong@quicinc.com>
+[kvalo: improve commit log]
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+---
+ drivers/net/wireless/ath/ath11k/reg.c | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+diff --git a/drivers/net/wireless/ath/ath11k/reg.c b/drivers/net/wireless/ath/ath11k/reg.c
+index 7ee3ff69dfc8..6fae4e61ede7 100644
+--- a/drivers/net/wireless/ath/ath11k/reg.c
++++ b/drivers/net/wireless/ath/ath11k/reg.c
+@@ -287,11 +287,7 @@ int ath11k_regd_update(struct ath11k *ar)
+ goto err;
+ }
+
+- rtnl_lock();
+- wiphy_lock(ar->hw->wiphy);
+- ret = regulatory_set_wiphy_regd_sync(ar->hw->wiphy, regd_copy);
+- wiphy_unlock(ar->hw->wiphy);
+- rtnl_unlock();
++ ret = regulatory_set_wiphy_regd(ar->hw->wiphy, regd_copy);
+
+ kfree(regd_copy);
+
+--
+2.38.1
+
diff --git a/debian/patches/series b/debian/patches/series
index 0429a634a..d3ca53839 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -80,6 +80,7 @@ features/arm64/arm64-compat-Implement-misalignment-fixups-for-multi.patch
# Miscellaneous bug fixes
bugfix/all/disable-some-marvell-phys.patch
bugfix/all/fs-add-module_softdep-declarations-for-hard-coded-cr.patch
+bugfix/all/wifi-ath11k-avoid-deadlock-during-regulatory-update-.patch
# Miscellaneous features