diff options
Diffstat (limited to 'net/mac80211/tx.c')
-rw-r--r-- | net/mac80211/tx.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 38394c40f6ad..244c80d0c8fb 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
@@ -295,8 +295,12 @@ static void purge_old_ps_buffers(struct ieee80211_local *local) | |||
295 | struct ieee80211_sub_if_data *sdata; | 295 | struct ieee80211_sub_if_data *sdata; |
296 | struct sta_info *sta; | 296 | struct sta_info *sta; |
297 | 297 | ||
298 | read_lock(&local->sub_if_lock); | 298 | /* |
299 | list_for_each_entry(sdata, &local->sub_if_list, list) { | 299 | * virtual interfaces are protected by RCU |
300 | */ | ||
301 | rcu_read_lock(); | ||
302 | |||
303 | list_for_each_entry_rcu(sdata, &local->interfaces, list) { | ||
300 | struct ieee80211_if_ap *ap; | 304 | struct ieee80211_if_ap *ap; |
301 | if (sdata->dev == local->mdev || | 305 | if (sdata->dev == local->mdev || |
302 | sdata->type != IEEE80211_IF_TYPE_AP) | 306 | sdata->type != IEEE80211_IF_TYPE_AP) |
@@ -309,7 +313,7 @@ static void purge_old_ps_buffers(struct ieee80211_local *local) | |||
309 | } | 313 | } |
310 | total += skb_queue_len(&ap->ps_bc_buf); | 314 | total += skb_queue_len(&ap->ps_bc_buf); |
311 | } | 315 | } |
312 | read_unlock(&local->sub_if_lock); | 316 | rcu_read_unlock(); |
313 | 317 | ||
314 | read_lock_bh(&local->sta_lock); | 318 | read_lock_bh(&local->sta_lock); |
315 | list_for_each_entry(sta, &local->sta_list, list) { | 319 | list_for_each_entry(sta, &local->sta_list, list) { |