Commit efe117ab8114f47f317b4803e5bc0104420bcba2

Authored by Eric Dumazet
Committed by John W. Linville
1 parent 4ba3eb034f

mac80211: Speedup ieee80211_remove_interfaces()

Speedup ieee80211_remove_interfaces() by factorizing synchronize_rcu() calls

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Reviewed-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

Showing 1 changed file with 5 additions and 9 deletions Side-by-side Diff

net/mac80211/iface.c
... ... @@ -860,22 +860,18 @@
860 860 void ieee80211_remove_interfaces(struct ieee80211_local *local)
861 861 {
862 862 struct ieee80211_sub_if_data *sdata, *tmp;
  863 + LIST_HEAD(unreg_list);
863 864  
864 865 ASSERT_RTNL();
865 866  
  867 + mutex_lock(&local->iflist_mtx);
866 868 list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) {
867   - /*
868   - * we cannot hold the iflist_mtx across unregister_netdevice,
869   - * but we only need to hold it for list modifications to lock
870   - * out readers since we're under the RTNL here as all other
871   - * writers.
872   - */
873   - mutex_lock(&local->iflist_mtx);
874 869 list_del(&sdata->list);
875   - mutex_unlock(&local->iflist_mtx);
876 870  
877   - unregister_netdevice(sdata->dev);
  871 + unregister_netdevice_queue(sdata->dev, &unreg_list);
878 872 }
  873 + mutex_unlock(&local->iflist_mtx);
  874 + unregister_netdevice_many(&unreg_list);
879 875 }
880 876  
881 877 static u32 ieee80211_idle_off(struct ieee80211_local *local,