Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mac80211: fix scheduled scan rtnl deadlock

When changing cfg80211 to use RTNL locking, this caused a
deadlock in mac80211 as it calls cfg80211_sched_scan_stopped()
from a work item that's on a workqueue that is flushed with
the RTNL held.

Fix this by simply using schedule_work(), the work only needs
to finish running before the wiphy is unregistered, no other
synchronisation (e.g. with suspend) is really required since
for suspend userspace is already blocked anyway when we flush
the workqueue so will only pick up the event after resume.

Cc: stable@vger.kernel.org
Fixes: 5fe231e87372 ("cfg80211: vastly simplify locking")
Reported-and-tested-by: Eliad Peller <eliadx.peller@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>

+2 -1
+1
net/mac80211/main.c
··· 1047 1047 1048 1048 cancel_work_sync(&local->restart_work); 1049 1049 cancel_work_sync(&local->reconfig_filter); 1050 + flush_work(&local->sched_scan_stopped_work); 1050 1051 1051 1052 ieee80211_clear_tx_pending(local); 1052 1053 rate_control_deinitialize(local);
+1 -1
net/mac80211/scan.c
··· 1088 1088 1089 1089 trace_api_sched_scan_stopped(local); 1090 1090 1091 - ieee80211_queue_work(&local->hw, &local->sched_scan_stopped_work); 1091 + schedule_work(&local->sched_scan_stopped_work); 1092 1092 } 1093 1093 EXPORT_SYMBOL(ieee80211_sched_scan_stopped);