On Fri, Jun 14, 2019 at 04:22:19PM -0700, Eric Dumazet wrote: > 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.
Thanks for the effort! Acked-by: Feng Tang <feng.t...@intel.com> > > Signed-off-by: Eric Dumazet <eduma...@google.com> > --- > Documentation/networking/ip-sysctl.txt | 8 ++++++++ > include/net/sock.h | 6 ++---- > net/ipv4/sysctl_net_ipv4.c | 9 +++++++++ > 3 files changed, 19 insertions(+), 4 deletions(-) > > diff --git a/Documentation/networking/ip-sysctl.txt > b/Documentation/networking/ip-sysctl.txt > index > 14fe93049d28e965d7349b03c5c8782c3d386e7d..288aa264ac26d98637a5bb1babc334bfc699bef1 > 100644 > --- a/Documentation/networking/ip-sysctl.txt > +++ b/Documentation/networking/ip-sysctl.txt > @@ -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 > diff --git a/include/net/sock.h b/include/net/sock.h > index > e9d769c04637a3c0b967c9bfa6def724834796b9..b02645e2dfad722769c1455bcde76e46da9fc5ac > 100644 > --- a/include/net/sock.h > +++ b/include/net/sock.h > @@ -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); > diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c > index > 875867b64d6a6597bf4fcd3498ed55741cbe33f7..886b58d31351df44725bdc34081e798bcb89ecf0 > 100644 > --- a/net/ipv4/sysctl_net_ipv4.c > +++ b/net/ipv4/sysctl_net_ipv4.c > @@ -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, > + }, > { } > }; > > -- > 2.22.0.410.gd8fdbe21b5-goog