Merge tag 'char-misc-4.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh...
[firefly-linux-kernel-4.4.55.git] / net / mac80211 / key.c
index 8abc31ebcf61e22a06bc90b5c36d9c29a30147df..b22df3a79a417c9d182647f3126e004490d3de93 100644 (file)
@@ -66,12 +66,15 @@ update_vlan_tailroom_need_count(struct ieee80211_sub_if_data *sdata, int delta)
        if (sdata->vif.type != NL80211_IFTYPE_AP)
                return;
 
-       mutex_lock(&sdata->local->mtx);
+       /* crypto_tx_tailroom_needed_cnt is protected by this */
+       assert_key_lock(sdata->local);
+
+       rcu_read_lock();
 
-       list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list)
+       list_for_each_entry_rcu(vlan, &sdata->u.ap.vlans, u.vlan.list)
                vlan->crypto_tx_tailroom_needed_cnt += delta;
 
-       mutex_unlock(&sdata->local->mtx);
+       rcu_read_unlock();
 }
 
 static void increment_tailroom_need_count(struct ieee80211_sub_if_data *sdata)
@@ -95,6 +98,8 @@ static void increment_tailroom_need_count(struct ieee80211_sub_if_data *sdata)
         * http://mid.gmane.org/1308590980.4322.19.camel@jlt3.sipsolutions.net
         */
 
+       assert_key_lock(sdata->local);
+
        update_vlan_tailroom_need_count(sdata, 1);
 
        if (!sdata->crypto_tx_tailroom_needed_cnt++) {
@@ -109,6 +114,8 @@ static void increment_tailroom_need_count(struct ieee80211_sub_if_data *sdata)
 static void decrease_tailroom_need_count(struct ieee80211_sub_if_data *sdata,
                                         int delta)
 {
+       assert_key_lock(sdata->local);
+
        WARN_ON_ONCE(sdata->crypto_tx_tailroom_needed_cnt < delta);
 
        update_vlan_tailroom_need_count(sdata, -delta);