From 9f82a35776391f9b2779f4e348b5520d1f633e10 Mon Sep 17 00:00:00 2001 From: Johannes Berg Date: Mon, 22 Mar 2010 13:42:43 -0700 Subject: [PATCH] --- yaml --- r: 189511 b: refs/heads/master c: 7236fe29fd72d17074574ba312e7f1bb9d10abaa h: refs/heads/master i: 189509: 55995f29f6b6ab3eb9510d8751d07ca2c1100b79 189507: 01846516ff91a8e319a19b504567a36f170a3f1d 189503: fe48e1c8063b4ee4ee384a02fe5cca07c90d2fe5 v: v3 --- [refs] | 2 +- trunk/net/mac80211/tx.c | 6 ++++++ trunk/net/mac80211/util.c | 12 ++++++------ 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/[refs] b/[refs] index 7fec15e783ce..4c2a3b11693d 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 05a9a1617026977422c7c5ed3aeac6f46fa2132c +refs/heads/master: 7236fe29fd72d17074574ba312e7f1bb9d10abaa diff --git a/trunk/net/mac80211/tx.c b/trunk/net/mac80211/tx.c index cbe53ed4fb0b..cfc473e1b050 100644 --- a/trunk/net/mac80211/tx.c +++ b/trunk/net/mac80211/tx.c @@ -1991,6 +1991,7 @@ static bool ieee80211_tx_pending_skb(struct ieee80211_local *local, void ieee80211_tx_pending(unsigned long data) { struct ieee80211_local *local = (struct ieee80211_local *)data; + struct ieee80211_sub_if_data *sdata; unsigned long flags; int i; bool txok; @@ -2029,6 +2030,11 @@ void ieee80211_tx_pending(unsigned long data) if (!txok) break; } + + if (skb_queue_empty(&local->pending[i])) + list_for_each_entry_rcu(sdata, &local->interfaces, list) + netif_tx_wake_queue( + netdev_get_tx_queue(sdata->dev, i)); } spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); diff --git a/trunk/net/mac80211/util.c b/trunk/net/mac80211/util.c index e6b1fba980c6..53af57047435 100644 --- a/trunk/net/mac80211/util.c +++ b/trunk/net/mac80211/util.c @@ -279,13 +279,13 @@ static void __ieee80211_wake_queue(struct ieee80211_hw *hw, int queue, /* someone still has this queue stopped */ return; - if (!skb_queue_empty(&local->pending[queue])) + if (skb_queue_empty(&local->pending[queue])) { + rcu_read_lock(); + list_for_each_entry_rcu(sdata, &local->interfaces, list) + netif_tx_wake_queue(netdev_get_tx_queue(sdata->dev, queue)); + rcu_read_unlock(); + } else tasklet_schedule(&local->tx_pending_tasklet); - - rcu_read_lock(); - list_for_each_entry_rcu(sdata, &local->interfaces, list) - netif_tx_wake_queue(netdev_get_tx_queue(sdata->dev, queue)); - rcu_read_unlock(); } void ieee80211_wake_queue_by_reason(struct ieee80211_hw *hw, int queue,