Commit 9ed816b1 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'net-optmem_max-changes'



Eric Dumazet says:

====================
net: optmem_max changes

optmem_max default value is too small for tx zerocopy workloads.

First patch increases default from 20KB to 128 KB,
which is the value we have used for seven years.

Second patch makes optmem_max sysctl per netns.

Last patch tweaks two tests accordingly.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents e16064c9 18872ba8
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -345,7 +345,10 @@ optmem_max
----------

Maximum ancillary buffer size allowed per socket. Ancillary data is a sequence
of struct cmsghdr structures with appended data.
of struct cmsghdr structures with appended data. TCP tx zerocopy also uses
optmem_max as a limit for its internal structures.

Default : 128 KB

fb_tunnels_only_for_init_net
----------------------------
+1 −0
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@ struct netns_core {
	struct ctl_table_header	*sysctl_hdr;

	int	sysctl_somaxconn;
	int	sysctl_optmem_max;
	u8	sysctl_txrehash;

#ifdef CONFIG_PROC_FS
+0 −1
Original line number Diff line number Diff line
@@ -2920,7 +2920,6 @@ extern __u32 sysctl_wmem_max;
extern __u32 sysctl_rmem_max;

extern int sysctl_tstamp_allow_data;
extern int sysctl_optmem_max;

extern __u32 sysctl_wmem_default;
extern __u32 sysctl_rmem_default;
+2 −1
Original line number Diff line number Diff line
@@ -275,9 +275,10 @@ BPF_CALL_2(bpf_sk_storage_delete, struct bpf_map *, map, struct sock *, sk)
static int bpf_sk_storage_charge(struct bpf_local_storage_map *smap,
				 void *owner, u32 size)
{
	int optmem_max = READ_ONCE(sysctl_optmem_max);
	struct sock *sk = (struct sock *)owner;
	int optmem_max;

	optmem_max = READ_ONCE(sock_net(sk)->core.sysctl_optmem_max);
	/* same check as in sock_kmalloc() */
	if (size <= optmem_max &&
	    atomic_read(&sk->sk_omem_alloc) + size < optmem_max) {
+7 −5
Original line number Diff line number Diff line
@@ -1219,8 +1219,8 @@ void sk_filter_uncharge(struct sock *sk, struct sk_filter *fp)
 */
static bool __sk_filter_charge(struct sock *sk, struct sk_filter *fp)
{
	int optmem_max = READ_ONCE(sock_net(sk)->core.sysctl_optmem_max);
	u32 filter_size = bpf_prog_size(fp->prog->len);
	int optmem_max = READ_ONCE(sysctl_optmem_max);

	/* same check as in sock_kmalloc() */
	if (filter_size <= optmem_max &&
@@ -1550,12 +1550,13 @@ EXPORT_SYMBOL_GPL(sk_attach_filter);
int sk_reuseport_attach_filter(struct sock_fprog *fprog, struct sock *sk)
{
	struct bpf_prog *prog = __get_filter(fprog, sk);
	int err;
	int err, optmem_max;

	if (IS_ERR(prog))
		return PTR_ERR(prog);

	if (bpf_prog_size(prog->len) > READ_ONCE(sysctl_optmem_max))
	optmem_max = READ_ONCE(sock_net(sk)->core.sysctl_optmem_max);
	if (bpf_prog_size(prog->len) > optmem_max)
		err = -ENOMEM;
	else
		err = reuseport_attach_prog(sk, prog);
@@ -1594,7 +1595,7 @@ int sk_attach_bpf(u32 ufd, struct sock *sk)
int sk_reuseport_attach_bpf(u32 ufd, struct sock *sk)
{
	struct bpf_prog *prog;
	int err;
	int err, optmem_max;

	if (sock_flag(sk, SOCK_FILTER_LOCKED))
		return -EPERM;
@@ -1622,7 +1623,8 @@ int sk_reuseport_attach_bpf(u32 ufd, struct sock *sk)
		}
	} else {
		/* BPF_PROG_TYPE_SOCKET_FILTER */
		if (bpf_prog_size(prog->len) > READ_ONCE(sysctl_optmem_max)) {
		optmem_max = READ_ONCE(sock_net(sk)->core.sysctl_optmem_max);
		if (bpf_prog_size(prog->len) > optmem_max) {
			err = -ENOMEM;
			goto err_prog_put;
		}
Loading