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
|
@ -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 New Issue