mac80211: call synchronize_net once in the restart flow
authorSara Sharon <sara.sharon@intel.com>
Sun, 29 Oct 2017 09:51:08 +0000 (11:51 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 11 Dec 2017 11:18:56 +0000 (12:18 +0100)
Currently the restart flow enables RX back, and then proceeds
to tear down RX and TX aggregations.
The TX aggregation tear down calls synchronize_net(), which
waits for packet receiving to be done.
This is done for every session, while RX processing is already
active, and in some reproductions it takes up to 3 seconds.
Add a call once in the restart_work, before we have traffic
active again, and remove the subsequent calls when tearing
down the aggregation.
This requires to move down the code that turns off the
reconfig flag in order to be able to test it in
_ieee80211_stop_tx_ba_session().

Signed-off-by: Sara Sharon <sara.sharon@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/agg-tx.c
net/mac80211/main.c
net/mac80211/util.c

index a04df962129ca85c44cc1a772cb604407001f681..595c662a61e87bd7621c9336df8a81b5080c1d1f 100644 (file)
@@ -392,7 +392,8 @@ int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid,
         * telling the driver. New packets will not go through since
         * the aggregation session is no longer OPERATIONAL.
         */
-       synchronize_net();
+       if (!local->in_reconfig)
+               synchronize_net();
 
        tid_tx->stop_initiator = reason == AGG_STOP_PEER_REQUEST ?
                                        WLAN_BACK_RECIPIENT :
index e054a2fd8d38bd00c0e181ca01180b19c3ffb132..0785d04a80bcfe74763d69e6579196e671898612 100644 (file)
@@ -263,6 +263,9 @@ static void ieee80211_restart_work(struct work_struct *work)
        flush_delayed_work(&local->roc_work);
        flush_work(&local->hw_roc_done);
 
+       /* wait for all packet processing to be done */
+       synchronize_net();
+
        ieee80211_reconfig(local);
        rtnl_unlock();
 }
index d57e5f6bd8b6127b9dc37a5b5eb2097ca9539b39..1f82191ce601e9aff2aa472d3eefa1614be33623 100644 (file)
@@ -2110,15 +2110,6 @@ int ieee80211_reconfig(struct ieee80211_local *local)
                cfg80211_sched_scan_stopped_rtnl(local->hw.wiphy, 0);
 
  wake_up:
-       if (local->in_reconfig) {
-               local->in_reconfig = false;
-               barrier();
-
-               /* Restart deferred ROCs */
-               mutex_lock(&local->mtx);
-               ieee80211_start_next_roc(local);
-               mutex_unlock(&local->mtx);
-       }
 
        if (local->monitors == local->open_count && local->monitors > 0)
                ieee80211_add_virtual_monitor(local);
@@ -2146,6 +2137,16 @@ int ieee80211_reconfig(struct ieee80211_local *local)
                mutex_unlock(&local->sta_mtx);
        }
 
+       if (local->in_reconfig) {
+               local->in_reconfig = false;
+               barrier();
+
+               /* Restart deferred ROCs */
+               mutex_lock(&local->mtx);
+               ieee80211_start_next_roc(local);
+               mutex_unlock(&local->mtx);
+       }
+
        ieee80211_wake_queues_by_reason(hw, IEEE80211_MAX_QUEUE_MAP,
                                        IEEE80211_QUEUE_STOP_REASON_SUSPEND,
                                        false);