mac80211: catch queue stop underflow
authorJohannes Berg <johannes.berg@intel.com>
Tue, 24 Nov 2015 14:29:53 +0000 (15:29 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 4 Dec 2015 13:43:32 +0000 (14:43 +0100)
If some code stops the queues more times than having started
(for when refcounting is used), warn on and reset the counter
to 0 to avoid blocking forever.

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

index 74058020b7d6154c1ea1613e9a8a9775789736fa..08af2b30794580e58b43a01c22497b5d0cba281a 100644 (file)
@@ -288,10 +288,13 @@ static void __ieee80211_wake_queue(struct ieee80211_hw *hw, int queue,
        if (!test_bit(reason, &local->queue_stop_reasons[queue]))
                return;
 
-       if (!refcounted)
+       if (!refcounted) {
                local->q_stop_reasons[queue][reason] = 0;
-       else
+       } else {
                local->q_stop_reasons[queue][reason]--;
+               if (WARN_ON(local->q_stop_reasons[queue][reason] < 0))
+                       local->q_stop_reasons[queue][reason] = 0;
+       }
 
        if (local->q_stop_reasons[queue][reason] == 0)
                __clear_bit(reason, &local->queue_stop_reasons[queue]);