ath9k: merge fixes for stability issues under heavy load
Signed-off-by: Felix Fietkau <nbd@openwrt.org> SVN-Revision: 40590
This commit is contained in:
		@@ -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
 | 
					commit eefb1d6adc4c60d219182b8917e4567484ce07fc
 | 
				
			||||||
Author: Felix Fietkau <nbd@openwrt.org>
 | 
					Author: Felix Fietkau <nbd@openwrt.org>
 | 
				
			||||||
Date:   Mon Apr 28 18:27:41 2014 +0200
 | 
					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;
 | 
					 		tid->active	   = false;
 | 
				
			||||||
 		__skb_queue_head_init(&tid->buf_q);
 | 
					 		__skb_queue_head_init(&tid->buf_q);
 | 
				
			||||||
 		__skb_queue_head_init(&tid->retry_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)) {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user