From: Sasha Levin <Alexander.Levin@microsoft.com>
To: "stable@vger.kernel.org" <stable@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Cc: Emmanuel Grumbach <emmanuel.grumbach@intel.com>,
Luca Coelho <luciano.coelho@intel.com>,
Johannes Berg <johannes.berg@intel.com>,
Sasha Levin <Alexander.Levin@microsoft.com>
Subject: [PATCH AUTOSEL 4.9 18/23] mac80211: fix a race between restart and CSA flows
Date: Mon, 24 Sep 2018 14:49:33 +0000 [thread overview]
Message-ID: <20180924144919.164617-18-alexander.levin@microsoft.com> (raw)
In-Reply-To: <20180924144919.164617-1-alexander.levin@microsoft.com>
From: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
[ Upstream commit f3ffb6c3a28963657eb8b02a795d75f2ebbd5ef4 ]
We hit a problem with iwlwifi that was caused by a bug in
mac80211. A bug in iwlwifi caused the firwmare to crash in
certain cases in channel switch. Because of that bug,
drv_pre_channel_switch would fail and trigger the restart
flow.
Now we had the hw restart worker which runs on the system's
workqueue and the csa_connection_drop_work worker that runs
on mac80211's workqueue that can run together. This is
obviously problematic since the restart work wants to
reconfigure the connection, while the csa_connection_drop_work
worker does the exact opposite: it tries to disconnect.
Fix this by cancelling the csa_connection_drop_work worker
in the restart worker.
Note that this can sound racy: we could have:
driver iface_work CSA_work restart_work
+++++++++++++++++++++++++++++++++++++++++++++
|
<--drv_cs ---|
<FW CRASH!>
-CS FAILED-->
| |
| cancel_work(CSA)
schedule |
CSA work |
| |
Race between those 2
But this is not possible because we flush the workqueue
in the restart worker before we cancel the CSA worker.
That would be bullet proof if we could guarantee that
we schedule the CSA worker only from the iface_work
which runs on the workqueue (and not on the system's
workqueue), but unfortunately we do have an instance
in which we schedule the CSA work outside the context
of the workqueue (ieee80211_chswitch_done).
Note also that we should probably cancel other workers
like beacon_connection_loss_work and possibly others
for different types of interfaces, at the very least,
IBSS should suffer from the exact same problem, but for
now, do the minimum to fix the actual bug that was actually
experienced and reproduced.
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
---
net/mac80211/main.c | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/net/mac80211/main.c b/net/mac80211/main.c
index 4729e1c09bcc..e3bbfb20ae82 100644
--- a/net/mac80211/main.c
+++ b/net/mac80211/main.c
@@ -254,8 +254,27 @@ static void ieee80211_restart_work(struct work_struct *work)
"%s called with hardware scan in progress\n", __func__);
rtnl_lock();
- list_for_each_entry(sdata, &local->interfaces, list)
+ list_for_each_entry(sdata, &local->interfaces, list) {
+ /*
+ * XXX: there may be more work for other vif types and even
+ * for station mode: a good thing would be to run most of
+ * the iface type's dependent _stop (ieee80211_mg_stop,
+ * ieee80211_ibss_stop) etc...
+ * For now, fix only the specific bug that was seen: race
+ * between csa_connection_drop_work and us.
+ */
+ if (sdata->vif.type == NL80211_IFTYPE_STATION) {
+ /*
+ * This worker is scheduled from the iface worker that
+ * runs on mac80211's workqueue, so we can't be
+ * scheduling this worker after the cancel right here.
+ * The exception is ieee80211_chswitch_done.
+ * Then we can have a race...
+ */
+ cancel_work_sync(&sdata->u.mgd.csa_connection_drop_work);
+ }
flush_delayed_work(&sdata->dec_tailroom_needed_wk);
+ }
ieee80211_scan_cancel(local);
/* make sure any new ROC will consider local->in_reconfig */
--
2.17.1
next prev parent reply other threads:[~2018-09-24 20:53 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-09-24 14:49 [PATCH AUTOSEL 4.9 01/23] mac80211: Run TXQ teardown code before de-registering interfaces Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.9 02/23] KVM: PPC: Book3S HV: Don't truncate HPTE index in xlate function Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.9 03/23] mac80211: correct use of IEEE80211_VHT_CAP_RXSTBC_X Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.9 04/23] mac80211_hwsim: " Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.9 05/23] gpio: adp5588: Fix sleep-in-atomic-context bug Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.9 07/23] net: hns: add netif_carrier_off before change speed and duplex Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.9 06/23] mac80211: mesh: fix HWMP sequence numbering to follow standard Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.9 09/23] gpio: Fix crash due to registration race Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.9 08/23] cfg80211: nl80211_update_ft_ies() to validate NL80211_ATTR_IE Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.9 11/23] RAID10 BUG_ON in raise_barrier when force is true and conf->barrier is 0 Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.9 10/23] ARC: atomics: unbork atomic_fetch_##op() Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.9 12/23] net: ethernet: cpsw-phy-sel: prefer phandle for phy sel Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.9 13/23] i2c: uniphier: issue STOP only for last message or I2C_M_STOP Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.9 14/23] i2c: uniphier-f: " Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.9 15/23] net: cadence: Fix a sleep-in-atomic-context bug in macb_halt_tx() Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.9 16/23] fs/cifs: don't translate SFM_SLASH (U+F026) to backslash Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.9 17/23] cfg80211: fix a type issue in ieee80211_chandef_to_operating_class() Sasha Levin
2018-09-24 14:49 ` Sasha Levin [this message]
2018-09-24 14:49 ` [PATCH AUTOSEL 4.9 19/23] mac80211: Fix station bandwidth setting after channel switch Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.9 20/23] mac80211: don't Tx a deauth frame if the AP forbade Tx Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.9 21/23] mac80211: shorten the IBSS debug messages Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.9 22/23] tools/vm/slabinfo.c: fix sign-compare warning Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.9 23/23] tools/vm/page-types.c: fix "defined but not used" warning Sasha Levin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180924144919.164617-18-alexander.levin@microsoft.com \
--to=alexander.levin@microsoft.com \
--cc=emmanuel.grumbach@intel.com \
--cc=johannes.berg@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=luciano.coelho@intel.com \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).