| From 5aeddcd6b2c0cab577b5c38d46e4be6f0032a025 Mon Sep 17 00:00:00 2001 |
| From: Bob Copeland <me@bobcopeland.com> |
| Date: Wed, 5 Sep 2018 06:22:59 -0400 |
| Subject: mac80211: fix pending queue hang due to TX_DROP |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| [ Upstream commit 6eae4a6c2be387fec41b0d2782c4fffb57159498 ] |
| |
| In our environment running lots of mesh nodes, we are seeing the |
| pending queue hang periodically, with the debugfs queues file showing |
| lines such as: |
| |
| 00: 0x00000000/348 |
| |
| i.e. there are a large number of frames but no stop reason set. |
| |
| One way this could happen is if queue processing from the pending |
| tasklet exited early without processing all frames, and without having |
| some future event (incoming frame, stop reason flag, ...) to reschedule |
| it. |
| |
| Exactly this can occur today if ieee80211_tx() returns false due to |
| packet drops or power-save buffering in the tx handlers. In the |
| past, this function would return true in such cases, and the change |
| to false doesn't seem to be intentional. Fix this case by reverting |
| to the previous behavior. |
| |
| Fixes: bb42f2d13ffc ("mac80211: Move reorder-sensitive TX handlers to after TXQ dequeue") |
| Signed-off-by: Bob Copeland <bobcopeland@fb.com> |
| Acked-by: Toke Høiland-Jørgensen <toke@toke.dk> |
| Signed-off-by: Johannes Berg <johannes.berg@intel.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| net/mac80211/tx.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c |
| index 84582998f65f..58fba4e569e6 100644 |
| --- a/net/mac80211/tx.c |
| +++ b/net/mac80211/tx.c |
| @@ -1833,7 +1833,7 @@ static bool ieee80211_tx(struct ieee80211_sub_if_data *sdata, |
| sdata->vif.hw_queue[skb_get_queue_mapping(skb)]; |
| |
| if (invoke_tx_handlers_early(&tx)) |
| - return false; |
| + return true; |
| |
| if (ieee80211_queue_skb(local, sdata, tx.sta, tx.skb)) |
| return true; |
| -- |
| 2.17.1 |
| |