Commit ede61ca4 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

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: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a8e11e5c
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -772,6 +772,14 @@ tcp_challenge_ack_limit - INTEGER
	in RFC 5961 (Improving TCP's Robustness to Blind In-Window Attacks)
	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_l3mdev_accept - BOOLEAN
+2 −4
Original line number Diff line number Diff line
@@ -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
 * 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)
{
	__skb_unlink(skb, &sk->sk_receive_queue);
	if (
#ifdef CONFIG_RPS
	    !static_branch_unlikely(&rps_needed) &&
#endif
	if (static_branch_unlikely(&tcp_rx_skb_cache_key) &&
	    !sk->sk_rx_skb_cache) {
		sk->sk_rx_skb_cache = skb;
		skb_orphan(skb);
+9 −0
Original line number Diff line number Diff line
@@ -51,6 +51,9 @@ static int comp_sack_nr_max = 255;
static u32 u32_max_div_HZ = UINT_MAX / HZ;
static int one_day_secs = 24 * 3600;

DEFINE_STATIC_KEY_FALSE(tcp_rx_skb_cache_key);
EXPORT_SYMBOL(tcp_rx_skb_cache_key);

/* obsolete */
static int sysctl_tcp_low_latency __read_mostly;

@@ -559,6 +562,12 @@ static struct ctl_table ipv4_table[] = {
		.extra1		= &sysctl_fib_sync_mem_min,
		.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,
	},
	{ }
};