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

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
...@@ -772,6 +772,14 @@ tcp_challenge_ack_limit - INTEGER ...@@ -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) ...@@ -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; ...@@ -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[] = { ...@@ -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,
},
{ } { }
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment