diff options
author | Johannes Berg <johannes.berg@intel.com> | 2013-03-06 23:09:11 +0100 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2013-03-11 15:16:42 +0200 |
commit | 6d10e46be5ac1d0ae787babd3dafd52b30686db5 (patch) | |
tree | 5377578eb94c2329d944ebf6ec657e8df5006e02 /net/mac80211/sta_info.c | |
parent | 3b8d9c290364c86fc9f4baff7c82264a96f706d6 (diff) | |
download | lwn-6d10e46be5ac1d0ae787babd3dafd52b30686db5.tar.gz lwn-6d10e46be5ac1d0ae787babd3dafd52b30686db5.zip |
mac80211: batch key free synchronize_net()
Instead of calling synchronize_net() for every key
on an interface or when a station is removed, do it
only once for all keys in both of these cases.
As a side-effect, removing station keys now always
calls synchronize_net() even if there are no keys,
which fixes an issue with station removal happening
in the driver while the station could still be used
for TX.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211/sta_info.c')
-rw-r--r-- | net/mac80211/sta_info.c | 12 |
1 files changed, 3 insertions, 9 deletions
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c index 2961f3d6b209..11216bc13b27 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c @@ -783,7 +783,7 @@ int __must_check __sta_info_destroy(struct sta_info *sta) { struct ieee80211_local *local; struct ieee80211_sub_if_data *sdata; - int ret, i; + int ret; might_sleep(); @@ -810,14 +810,8 @@ int __must_check __sta_info_destroy(struct sta_info *sta) list_del_rcu(&sta->list); - mutex_lock(&local->key_mtx); - for (i = 0; i < NUM_DEFAULT_KEYS; i++) - ieee80211_key_free(key_mtx_dereference(local, sta->gtk[i]), - true); - if (sta->ptk) - ieee80211_key_free(key_mtx_dereference(local, sta->ptk), - true); - mutex_unlock(&local->key_mtx); + /* this always calls synchronize_net() */ + ieee80211_free_sta_keys(local, sta); sta->dead = true; |