Skip to content

Commit

Permalink
mac80211: move interface shutdown out of wiphy lock
Browse files Browse the repository at this point in the history
commit f5baf28 upstream.

When reconfiguration fails, we shut down everything, but we
cannot call cfg80211_shutdown_all_interfaces() with the wiphy
mutex held. Since cfg80211 now calls it on resume errors, we
only need to do likewise for where we call reconfig (whether
directly or indirectly), but not under the wiphy lock.

Cc: stable@vger.kernel.org
Fixes: 2fe8ef1 ("cfg80211: change netdev registration/unregistration semantics")
Link: https://lore.kernel.org/r/20210608113226.78233c80f548.Iecc104aceb89f0568f50e9670a9cb191a1c8887b@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
jmberg-intel authored and gregkh committed Jun 23, 2021
1 parent db40ccf commit 077ad15
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 4 deletions.
7 changes: 6 additions & 1 deletion net/mac80211/debugfs.c
Expand Up @@ -387,12 +387,17 @@ static ssize_t reset_write(struct file *file, const char __user *user_buf,
size_t count, loff_t *ppos)
{
struct ieee80211_local *local = file->private_data;
int ret;

rtnl_lock();
wiphy_lock(local->hw.wiphy);
__ieee80211_suspend(&local->hw, NULL);
__ieee80211_resume(&local->hw);
ret = __ieee80211_resume(&local->hw);
wiphy_unlock(local->hw.wiphy);

if (ret)
cfg80211_shutdown_all_interfaces(local->hw.wiphy);

rtnl_unlock();

return count;
Expand Down
7 changes: 6 additions & 1 deletion net/mac80211/main.c
Expand Up @@ -252,6 +252,7 @@ static void ieee80211_restart_work(struct work_struct *work)
struct ieee80211_local *local =
container_of(work, struct ieee80211_local, restart_work);
struct ieee80211_sub_if_data *sdata;
int ret;

/* wait for scan work complete */
flush_workqueue(local->workqueue);
Expand Down Expand Up @@ -294,8 +295,12 @@ static void ieee80211_restart_work(struct work_struct *work)
/* wait for all packet processing to be done */
synchronize_net();

ieee80211_reconfig(local);
ret = ieee80211_reconfig(local);
wiphy_unlock(local->hw.wiphy);

if (ret)
cfg80211_shutdown_all_interfaces(local->hw.wiphy);

rtnl_unlock();
}

Expand Down
2 changes: 0 additions & 2 deletions net/mac80211/util.c
Expand Up @@ -2186,8 +2186,6 @@ static void ieee80211_handle_reconfig_failure(struct ieee80211_local *local)
list_for_each_entry(ctx, &local->chanctx_list, list)
ctx->driver_present = false;
mutex_unlock(&local->chanctx_mtx);

cfg80211_shutdown_all_interfaces(local->hw.wiphy);
}

static void ieee80211_assign_chanctx(struct ieee80211_local *local,
Expand Down

0 comments on commit 077ad15

Please sign in to comment.