diff options
author | Felix Fietkau <nbd@nbd.name> | 2019-03-01 14:54:31 +0100 |
---|---|---|
committer | Felix Fietkau <nbd@nbd.name> | 2019-03-07 18:08:09 +0100 |
commit | 85cb473f9381cbca4b6bd537582e0f785284f2d9 (patch) | |
tree | 41461d0701f5b5de772e02135b2669225f54efff /package | |
parent | 08db9397c9ac522941775d5f7ff209188e4babda (diff) | |
download | upstream-85cb473f9381cbca4b6bd537582e0f785284f2d9.tar.gz upstream-85cb473f9381cbca4b6bd537582e0f785284f2d9.tar.bz2 upstream-85cb473f9381cbca4b6bd537582e0f785284f2d9.zip |
mac80211: add a fix to prevent unsafe queue wake calls during restart
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Diffstat (limited to 'package')
-rw-r--r-- | package/kernel/mac80211/patches/399-mac80211-do-not-call-driver-wake_tx_queue-op-during-.patch | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/399-mac80211-do-not-call-driver-wake_tx_queue-op-during-.patch b/package/kernel/mac80211/patches/399-mac80211-do-not-call-driver-wake_tx_queue-op-during-.patch new file mode 100644 index 0000000000..302646066d --- /dev/null +++ b/package/kernel/mac80211/patches/399-mac80211-do-not-call-driver-wake_tx_queue-op-during-.patch @@ -0,0 +1,33 @@ +From: Felix Fietkau <nbd@nbd.name> +Date: Fri, 1 Mar 2019 14:42:56 +0100 +Subject: [PATCH] mac80211: do not call driver wake_tx_queue op during reconfig + +There are several scenarios in which mac80211 can call drv_wake_tx_queue +after ieee80211_restart_hw has been called and has not yet completed. +Driver private structs are considered uninitialized until mac80211 has +uploaded the vifs, stations and keys again, so using private tx queue +data during that time is not safe. + +The driver can also not rely on drv_reconfig_complete to figure out when +it is safe to accept drv_wake_tx_queue calls again, because it is only +called after all tx queues are woken again. + +To fix this, bail out early in drv_wake_tx_queue if local->in_reconfig +is set. + +Cc: stable@vger.kernel.org +Signed-off-by: Felix Fietkau <nbd@nbd.name> +--- + +--- a/net/mac80211/driver-ops.h ++++ b/net/mac80211/driver-ops.h +@@ -1162,6 +1162,9 @@ static inline void drv_wake_tx_queue(str + { + struct ieee80211_sub_if_data *sdata = vif_to_sdata(txq->txq.vif); + ++ if (local->in_reconfig) ++ return; ++ + if (!check_sdata_in_driver(sdata)) + return; + |