mac80211: fix tim_lock locking
authorJohannes Berg <johannes.berg@intel.com>
Fri, 22 Feb 2013 11:55:01 +0000 (12:55 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 25 Feb 2013 23:09:19 +0000 (00:09 +0100)
The ieee80211_beacon_add_tim() function might be called
by drivers with BHs enabled, which causes a potential
deadlock if TX happens at the same time and attempts to
lock the tim_lock as well. Use spin_lock_bh to fix it.

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

index 5b9602b6240520844b45f6c6b2b293ac8e9ecfb0..5800c7a0d075d12b213eea54f1f9a6a44baaa708 100644 (file)
@@ -2360,9 +2360,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 {
-               spin_lock(&local->tim_lock);
+               spin_lock_bh(&local->tim_lock);
                __ieee80211_beacon_add_tim(sdata, ps, skb);
-               spin_unlock(&local->tim_lock);
+               spin_unlock_bh(&local->tim_lock);
        }
 
        return 0;