aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/iface.c
diff options
context:
space:
mode:
authorEyal Shapira <eyal@wizery.com>2012-08-06 07:26:16 -0400
committerJohannes Berg <johannes.berg@intel.com>2012-08-20 07:20:56 -0400
commitaa7a00809cf6afe3cd6f5af2889110b47b798667 (patch)
tree4b2d537fdad3058f61ab0bb894b935afc75442b5 /net/mac80211/iface.c
parentf609a43dca2964a8a604ef554be92fa11c3b4c41 (diff)
mac80211: avoid using synchronize_rcu in ieee80211_set_probe_resp
This could take a while (100ms+) and may delay sending assoc resp in AP mode with WPS or P2P GO (as setting the probe resp takes place there). We've encountered situations where the delay was big enough to cause connection problems with devices like Galaxy Nexus. Switch to using call_rcu with a free handler. [Arik - rework to use plain buffer and instead of skb] Signed-off-by: Eyal Shapira <eyal@wizery.com> Signed-off-by: Arik Nemtsov <arik@wizery.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211/iface.c')
-rw-r--r--net/mac80211/iface.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
index abee3a0c25ed..fbab7a84ca21 100644
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
@@ -715,7 +715,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
715 struct ieee80211_sub_if_data *vlan, *tmpsdata; 715 struct ieee80211_sub_if_data *vlan, *tmpsdata;
716 struct beacon_data *old_beacon = 716 struct beacon_data *old_beacon =
717 rtnl_dereference(sdata->u.ap.beacon); 717 rtnl_dereference(sdata->u.ap.beacon);
718 struct sk_buff *old_probe_resp = 718 struct probe_resp *old_probe_resp =
719 rtnl_dereference(sdata->u.ap.probe_resp); 719 rtnl_dereference(sdata->u.ap.probe_resp);
720 720
721 /* sdata_running will return false, so this will disable */ 721 /* sdata_running will return false, so this will disable */
@@ -727,7 +727,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
727 RCU_INIT_POINTER(sdata->u.ap.probe_resp, NULL); 727 RCU_INIT_POINTER(sdata->u.ap.probe_resp, NULL);
728 synchronize_rcu(); 728 synchronize_rcu();
729 kfree(old_beacon); 729 kfree(old_beacon);
730 kfree_skb(old_probe_resp); 730 kfree(old_probe_resp);
731 731
732 /* down all dependent devices, that is VLANs */ 732 /* down all dependent devices, that is VLANs */
733 list_for_each_entry_safe(vlan, tmpsdata, &sdata->u.ap.vlans, 733 list_for_each_entry_safe(vlan, tmpsdata, &sdata->u.ap.vlans,