mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-03 22:44:27 -05:00 
			
		
		
		
	Refreshed all patches Remove upstreamed patches. - 103-MIPS-ath79-fix-register-address-in-ath79_ddr_wb_flus.patch - 403-mtd_fix_cfi_cmdset_0002_status_check.patch - 001-4.11-01-mtd-m25p80-consider-max-message-size-in-m25p80_read.patch - 001-4.15-08-bcm63xx_enet-correct-clock-usage.patch - 001-4.15-09-bcm63xx_enet-do-not-write-to-random-DMA-channel-on-B.patch - 900-gen_stats-fix-netlink-stats-padding.patch Introduce a new backported patch to address ext4 breakage, introduced in 4.9.112 - backport-4.9/500-ext4-fix-check-to-prevent-initializing-reserved-inod.patch This patch has been slightly altered to compensate for a new helper function introduced in later kernels. Also add ARM64_SSBD symbol to ARM64 targets still running kernel 4.9 Compile-tested on: ar71xx, bcm2710 Runtime-tested on: ar71xx Signed-off-by: Koen Vandeputte <koen.vandeputte@ncentric.com>
		
			
				
	
	
		
			39 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From a9b204d1564702b704ad6fe74f10a102c7b87ba3 Mon Sep 17 00:00:00 2001
 | 
						|
From: Eric Dumazet <edumazet@google.com>
 | 
						|
Date: Sat, 3 Dec 2016 11:14:53 -0800
 | 
						|
Subject: [PATCH 04/10] tcp: tsq: avoid one atomic in tcp_wfree()
 | 
						|
 | 
						|
Under high load, tcp_wfree() has an atomic operation trying
 | 
						|
to schedule a tasklet over and over.
 | 
						|
 | 
						|
We can schedule it only if our per cpu list was empty.
 | 
						|
 | 
						|
Signed-off-by: Eric Dumazet <edumazet@google.com>
 | 
						|
Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
						|
---
 | 
						|
 net/ipv4/tcp_output.c | 5 ++++-
 | 
						|
 1 file changed, 4 insertions(+), 1 deletion(-)
 | 
						|
 | 
						|
--- a/net/ipv4/tcp_output.c
 | 
						|
+++ b/net/ipv4/tcp_output.c
 | 
						|
@@ -885,6 +885,7 @@ void tcp_wfree(struct sk_buff *skb)
 | 
						|
 
 | 
						|
 	for (oval = READ_ONCE(tp->tsq_flags);; oval = nval) {
 | 
						|
 		struct tsq_tasklet *tsq;
 | 
						|
+		bool empty;
 | 
						|
 
 | 
						|
 		if (!(oval & TSQF_THROTTLED) || (oval & TSQF_QUEUED))
 | 
						|
 			goto out;
 | 
						|
@@ -897,8 +898,10 @@ void tcp_wfree(struct sk_buff *skb)
 | 
						|
 		/* queue this socket to tasklet queue */
 | 
						|
 		local_irq_save(flags);
 | 
						|
 		tsq = this_cpu_ptr(&tsq_tasklet);
 | 
						|
+		empty = list_empty(&tsq->head);
 | 
						|
 		list_add(&tp->tsq_node, &tsq->head);
 | 
						|
-		tasklet_schedule(&tsq->tasklet);
 | 
						|
+		if (empty)
 | 
						|
+			tasklet_schedule(&tsq->tasklet);
 | 
						|
 		local_irq_restore(flags);
 | 
						|
 		return;
 | 
						|
 	}
 |