diff options
author | Felix Fietkau <nbd@openwrt.org> | 2014-04-29 15:52:03 +0000 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2014-04-29 15:52:03 +0000 |
commit | d1e0abf3a8c4d7e04a1ffcfb6d53b85f1fc98c55 (patch) | |
tree | d1928eb313de3b6c31160fcdd7e0eb32e74e5e70 /package/kernel/mac80211/patches/300-pending_work.patch | |
parent | 4e85193d1e5851d7420995ca071b997606e4d402 (diff) | |
download | upstream-d1e0abf3a8c4d7e04a1ffcfb6d53b85f1fc98c55.tar.gz upstream-d1e0abf3a8c4d7e04a1ffcfb6d53b85f1fc98c55.tar.bz2 upstream-d1e0abf3a8c4d7e04a1ffcfb6d53b85f1fc98c55.zip |
ath9k: merge fixes for stability issues under heavy load
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@40590 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package/kernel/mac80211/patches/300-pending_work.patch')
-rw-r--r-- | package/kernel/mac80211/patches/300-pending_work.patch | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/300-pending_work.patch b/package/kernel/mac80211/patches/300-pending_work.patch index 90dd5e779f..d6d042d460 100644 --- a/package/kernel/mac80211/patches/300-pending_work.patch +++ b/package/kernel/mac80211/patches/300-pending_work.patch @@ -1,3 +1,43 @@ +commit c82552c5b0cb1735dbcbad78b1ffc6d3c212dc56 +Author: Tim Harvey <tharvey@gateworks.com> +Date: Mon Apr 21 16:14:57 2014 -0700 + + ath9k: add a recv budget + + Implement a recv budget so that in cases of high traffic we still allow other + taskets to get processed. + + Without this, we can encounter a host of issues during high wireless traffic + reception depending on system load including rcu stall's detected (ARM), + soft lockups, failure to service critical tasks such as watchdog resets, + and triggering of the tx stuck tasklet. + + The same thing was proposed previously by Ben: + http://www.spinics.net/lists/linux-wireless/msg112891.html + + The only difference here is that I make sure only processed packets are counted + in the budget by checking at the end of the rx loop. + + Signed-off-by: Tim Harvey <tharvey@gateworks.com> + Acked-by: Felix Fietkau <nbd@openwrt.org> + Signed-off-by: John W. Linville <linville@tuxdriver.com> + +commit 3a758134e66ca74a9df792616b5288b2fa2cfd7f +Author: Tim Harvey <tharvey@gateworks.com> +Date: Mon Apr 21 16:14:56 2014 -0700 + + ath9k: fix possible hang on flush + + If a flush is requested, make sure to clear the descriptor once we've + processed it. + + This resolves a hang that will occur if all RX descriptors are full when a + flush is requested. + + Signed-off-by: Tim Harvey <tharvey@gateworks.com> + Acked-by: Felix Fietkau <nbd@openwrt.org> + Signed-off-by: John W. Linville <linville@tuxdriver.com> + commit eefb1d6adc4c60d219182b8917e4567484ce07fc Author: Felix Fietkau <nbd@openwrt.org> Date: Mon Apr 28 18:27:41 2014 +0200 @@ -237,3 +277,34 @@ Date: Sun Apr 6 23:35:28 2014 +0200 tid->active = false; __skb_queue_head_init(&tid->buf_q); __skb_queue_head_init(&tid->retry_q); +--- a/drivers/net/wireless/ath/ath9k/recv.c ++++ b/drivers/net/wireless/ath/ath9k/recv.c +@@ -975,6 +975,7 @@ int ath_rx_tasklet(struct ath_softc *sc, + u64 tsf = 0; + unsigned long flags; + dma_addr_t new_buf_addr; ++ unsigned int budget = 512; + + if (edma) + dma_type = DMA_BIDIRECTIONAL; +@@ -1113,15 +1114,17 @@ requeue_drop_frag: + } + requeue: + list_add_tail(&bf->list, &sc->rx.rxbuf); +- if (flush) +- continue; + + if (edma) { + ath_rx_edma_buf_link(sc, qtype); + } else { + ath_rx_buf_relink(sc, bf); +- ath9k_hw_rxena(ah); ++ if (!flush) ++ ath9k_hw_rxena(ah); + } ++ ++ if (!budget--) ++ break; + } while (1); + + if (!(ah->imask & ATH9K_INT_RXEOL)) { |