forked from mirrors/linux
		
	tcp: add tcp_rx_skb_cache sysctl
Instead of relying on rps_needed, it is safer to use a separate static key, since we do not want to enable TCP rx_skb_cache by default. This feature can cause huge increase of memory usage on hosts with millions of sockets. Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									a8e11e5c56
								
							
						
					
					
						commit
						ede61ca474
					
				
					 3 changed files with 19 additions and 4 deletions
				
			
		| 
						 | 
					@ -772,6 +772,14 @@ tcp_challenge_ack_limit - INTEGER
 | 
				
			||||||
	in RFC 5961 (Improving TCP's Robustness to Blind In-Window Attacks)
 | 
						in RFC 5961 (Improving TCP's Robustness to Blind In-Window Attacks)
 | 
				
			||||||
	Default: 100
 | 
						Default: 100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					tcp_rx_skb_cache - BOOLEAN
 | 
				
			||||||
 | 
						Controls a per TCP socket cache of one skb, that might help
 | 
				
			||||||
 | 
						performance of some workloads. This might be dangerous
 | 
				
			||||||
 | 
						on systems with a lot of TCP sockets, since it increases
 | 
				
			||||||
 | 
						memory usage.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Default: 0 (disabled)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UDP variables:
 | 
					UDP variables:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
udp_l3mdev_accept - BOOLEAN
 | 
					udp_l3mdev_accept - BOOLEAN
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2433,13 +2433,11 @@ static inline void skb_setup_tx_timestamp(struct sk_buff *skb, __u16 tsflags)
 | 
				
			||||||
 * This routine must be called with interrupts disabled or with the socket
 | 
					 * This routine must be called with interrupts disabled or with the socket
 | 
				
			||||||
 * locked so that the sk_buff queue operation is ok.
 | 
					 * locked so that the sk_buff queue operation is ok.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					DECLARE_STATIC_KEY_FALSE(tcp_rx_skb_cache_key);
 | 
				
			||||||
static inline void sk_eat_skb(struct sock *sk, struct sk_buff *skb)
 | 
					static inline void sk_eat_skb(struct sock *sk, struct sk_buff *skb)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	__skb_unlink(skb, &sk->sk_receive_queue);
 | 
						__skb_unlink(skb, &sk->sk_receive_queue);
 | 
				
			||||||
	if (
 | 
						if (static_branch_unlikely(&tcp_rx_skb_cache_key) &&
 | 
				
			||||||
#ifdef CONFIG_RPS
 | 
					 | 
				
			||||||
	    !static_branch_unlikely(&rps_needed) &&
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
	    !sk->sk_rx_skb_cache) {
 | 
						    !sk->sk_rx_skb_cache) {
 | 
				
			||||||
		sk->sk_rx_skb_cache = skb;
 | 
							sk->sk_rx_skb_cache = skb;
 | 
				
			||||||
		skb_orphan(skb);
 | 
							skb_orphan(skb);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,6 +51,9 @@ static int comp_sack_nr_max = 255;
 | 
				
			||||||
static u32 u32_max_div_HZ = UINT_MAX / HZ;
 | 
					static u32 u32_max_div_HZ = UINT_MAX / HZ;
 | 
				
			||||||
static int one_day_secs = 24 * 3600;
 | 
					static int one_day_secs = 24 * 3600;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEFINE_STATIC_KEY_FALSE(tcp_rx_skb_cache_key);
 | 
				
			||||||
 | 
					EXPORT_SYMBOL(tcp_rx_skb_cache_key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* obsolete */
 | 
					/* obsolete */
 | 
				
			||||||
static int sysctl_tcp_low_latency __read_mostly;
 | 
					static int sysctl_tcp_low_latency __read_mostly;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -559,6 +562,12 @@ static struct ctl_table ipv4_table[] = {
 | 
				
			||||||
		.extra1		= &sysctl_fib_sync_mem_min,
 | 
							.extra1		= &sysctl_fib_sync_mem_min,
 | 
				
			||||||
		.extra2		= &sysctl_fib_sync_mem_max,
 | 
							.extra2		= &sysctl_fib_sync_mem_max,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							.procname	= "tcp_rx_skb_cache",
 | 
				
			||||||
 | 
							.data		= &tcp_rx_skb_cache_key.key,
 | 
				
			||||||
 | 
							.mode		= 0644,
 | 
				
			||||||
 | 
							.proc_handler	= proc_do_static_key,
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
	{ }
 | 
						{ }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue