mac80211: use spin_lock_bh() for tim_lock
authorJohannes Berg <johannes.berg@intel.com>
Wed, 13 Feb 2013 16:39:53 +0000 (17:39 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 15 Feb 2013 08:41:12 +0000 (09:41 +0100)
There's no need to use _irqsave() as the lock
is never used in interrupt context.

This also fixes a problem in the iwlwifi MVM
driver that calls spin_unlock_bh() within its
set_tim() callback.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/sta_info.c
net/mac80211/tx.c

index fb3b5865fc39260334ae2524872ba0fb9e2f8bfb..0794b9018ed4dc6a903e78e74d8e9d1181b21fb1 100644 (file)
@@ -571,7 +571,6 @@ void sta_info_recalc_tim(struct sta_info *sta)
 {
        struct ieee80211_local *local = sta->local;
        struct ps_data *ps;
-       unsigned long flags;
        bool indicate_tim = false;
        u8 ignore_for_tim = sta->sta.uapsd_queues;
        int ac;
@@ -628,7 +627,7 @@ void sta_info_recalc_tim(struct sta_info *sta)
        }
 
  done:
-       spin_lock_irqsave(&local->tim_lock, flags);
+       spin_lock_bh(&local->tim_lock);
 
        if (indicate_tim)
                __bss_tim_set(ps->tim, id);
@@ -641,7 +640,7 @@ void sta_info_recalc_tim(struct sta_info *sta)
                local->tim_in_locked_section = false;
        }
 
-       spin_unlock_irqrestore(&local->tim_lock, flags);
+       spin_unlock_bh(&local->tim_lock);
 }
 
 static bool sta_info_buffer_expired(struct sta_info *sta, struct sk_buff *skb)
index f4c89f506e9df2e35a7ce588e8f34700c845d6e2..7d8c629f1e6a901c818be3a4b69c446bc8036646 100644 (file)
@@ -2364,11 +2364,9 @@ static int ieee80211_beacon_add_tim(struct ieee80211_sub_if_data *sdata,
        if (local->tim_in_locked_section) {
                __ieee80211_beacon_add_tim(sdata, ps, skb);
        } else {
-               unsigned long flags;
-
-               spin_lock_irqsave(&local->tim_lock, flags);
+               spin_lock(&local->tim_lock);
                __ieee80211_beacon_add_tim(sdata, ps, skb);
-               spin_unlock_irqrestore(&local->tim_lock, flags);
+               spin_unlock(&local->tim_lock);
        }
 
        return 0;