Subject: Re: [PATCH 1/2] udp: Move the udp sysctl to namespace.

From: Paolo Abeni <[email-masked]>
Date: Tue, 13 Mar 2018 12:36:35 +0100

Hi,

On Tue, 2018-03-13 at 02:57 -0700, Tonghao Zhang wrote:
> This patch moves the udp_rmem_min, udp_wmem_min
> to namespace and init the udp_l3mdev_accept explicitly.

Can you please be a little more descriptive on why this is
needed/helpful?

> Signed-off-by: Tonghao Zhang <[email-masked]>
> ---
>  include/net/netns/ipv4.h   |  3 ++
>  net/ipv4/sysctl_net_ipv4.c | 32 ++++++++---------
>  net/ipv4/udp.c             | 86 +++++++++++++++++++++++++++-------------------
>  net/ipv6/udp.c             | 52 ++++++++++++++--------------
>  4 files changed, 96 insertions(+), 77 deletions(-)
> 
> diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h
> index 3a970e4..382bfd7 100644
> --- a/include/net/netns/ipv4.h
> +++ b/include/net/netns/ipv4.h
> @@ -168,6 +168,9 @@ struct netns_ipv4 {
>  	atomic_t tfo_active_disable_times;
>  	unsigned long tfo_active_disable_stamp;
>  
> +	int sysctl_udp_wmem_min;
> +	int sysctl_udp_rmem_min;
> +
>  #ifdef CONFIG_NET_L3_MASTER_DEV
>  	int sysctl_udp_l3mdev_accept;
>  #endif
> diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c
> index 011de9a..5b72d97 100644
> --- a/net/ipv4/sysctl_net_ipv4.c
> +++ b/net/ipv4/sysctl_net_ipv4.c
> @@ -520,22 +520,6 @@ static int proc_fib_multipath_hash_policy(struct ctl_table *table, int write,
>  		.mode		= 0644,
>  		.proc_handler	= proc_doulongvec_minmax,
>  	},
> -	{
> -		.procname	= "udp_rmem_min",
> -		.data		= &sysctl_udp_rmem_min,
> -		.maxlen		= sizeof(sysctl_udp_rmem_min),
> -		.mode		= 0644,
> -		.proc_handler	= proc_dointvec_minmax,
> -		.extra1		= &one
> -	},
> -	{
> -		.procname	= "udp_wmem_min",
> -		.data		= &sysctl_udp_wmem_min,
> -		.maxlen		= sizeof(sysctl_udp_wmem_min),
> -		.mode		= 0644,
> -		.proc_handler	= proc_dointvec_minmax,
> -		.extra1		= &one
> -	},
>  	{ }
>  };
>  
> @@ -1167,6 +1151,22 @@ static int proc_fib_multipath_hash_policy(struct ctl_table *table, int write,
>  		.proc_handler	= proc_dointvec_minmax,
>  		.extra1		= &one,
>  	},
> +	{
> +		.procname	= "udp_rmem_min",
> +		.data		= &init_net.ipv4.sysctl_udp_rmem_min,
> +		.maxlen		= sizeof(init_net.ipv4.sysctl_udp_rmem_min),
> +		.mode		= 0644,
> +		.proc_handler	= proc_dointvec_minmax,
> +		.extra1		= &one
> +	},
> +	{
> +		.procname	= "udp_wmem_min",
> +		.data		= &init_net.ipv4.sysctl_udp_wmem_min,
> +		.maxlen		= sizeof(init_net.ipv4.sysctl_udp_wmem_min),
> +		.mode		= 0644,
> +		.proc_handler	= proc_dointvec_minmax,
> +		.extra1		= &one
> +	},
>  	{ }
>  };
>  
> diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
> index 3013404..7ae77f2 100644
> --- a/net/ipv4/udp.c
> +++ b/net/ipv4/udp.c
> @@ -122,12 +122,6 @@
>  long sysctl_udp_mem[3] __read_mostly;
>  EXPORT_SYMBOL(sysctl_udp_mem);
>  
> -int sysctl_udp_rmem_min __read_mostly;
> -EXPORT_SYMBOL(sysctl_udp_rmem_min);
> -
> -int sysctl_udp_wmem_min __read_mostly;
> -EXPORT_SYMBOL(sysctl_udp_wmem_min);
> -
>  atomic_long_t udp_memory_allocated;
>  EXPORT_SYMBOL(udp_memory_allocated);
>  
> @@ -2533,35 +2527,35 @@ int udp_abort(struct sock *sk, int err)
>  EXPORT_SYMBOL_GPL(udp_abort);
>  
>  struct proto udp_prot = {
> -	.name		   = "UDP",
> -	.owner		   = THIS_MODULE,
> -	.close		   = udp_lib_close,
> -	.connect	   = ip4_datagram_connect,
> -	.disconnect	   = udp_disconnect,
> -	.ioctl		   = udp_ioctl,
> -	.init		   = udp_init_sock,
> -	.destroy	   = udp_destroy_sock,
> -	.setsockopt	   = udp_setsockopt,
> -	.getsockopt	   = udp_getsockopt,
> -	.sendmsg	   = udp_sendmsg,
> -	.recvmsg	   = udp_recvmsg,
> -	.sendpage	   = udp_sendpage,
> -	.release_cb	   = ip4_datagram_release_cb,
> -	.hash		   = udp_lib_hash,
> -	.unhash		   = udp_lib_unhash,
> -	.rehash		   = udp_v4_rehash,
> -	.get_port	   = udp_v4_get_port,
> -	.memory_allocated  = &udp_memory_allocated,
> -	.sysctl_mem	   = sysctl_udp_mem,
> -	.sysctl_wmem	   = &sysctl_udp_wmem_min,
> -	.sysctl_rmem	   = &sysctl_udp_rmem_min,
> -	.obj_size	   = sizeof(struct udp_sock),
> -	.h.udp_table	   = &udp_table,
> +	.name			= "UDP",
> +	.owner			= THIS_MODULE,
> +	.close			= udp_lib_close,
> +	.connect		= ip4_datagram_connect,
> +	.disconnect		= udp_disconnect,
> +	.ioctl			= udp_ioctl,
> +	.init			= udp_init_sock,
> +	.destroy		= udp_destroy_sock,
> +	.setsockopt		= udp_setsockopt,
> +	.getsockopt		= udp_getsockopt,
> +	.sendmsg		= udp_sendmsg,
> +	.recvmsg		= udp_recvmsg,
> +	.sendpage		= udp_sendpage,
> +	.release_cb		= ip4_datagram_release_cb,
> +	.hash			= udp_lib_hash,
> +	.unhash			= udp_lib_unhash,
> +	.rehash			= udp_v4_rehash,
> +	.get_port		= udp_v4_get_port,
> +	.memory_allocated	= &udp_memory_allocated,
> +	.sysctl_mem		= sysctl_udp_mem,
> +	.sysctl_wmem_offset	= offsetof(struct net, ipv4.sysctl_udp_wmem_min),
> +	.sysctl_rmem_offset	= offsetof(struct net, ipv4.sysctl_udp_rmem_min),
> +	.obj_size		= sizeof(struct udp_sock),
> +	.h.udp_table		= &udp_table,
>  #ifdef CONFIG_COMPAT
> -	.compat_setsockopt = compat_udp_setsockopt,
> -	.compat_getsockopt = compat_udp_getsockopt,
> +	.compat_setsockopt	= compat_udp_setsockopt,
> +	.compat_getsockopt	= compat_udp_getsockopt,
>  #endif
> -	.diag_destroy	   = udp_abort,
> +	.diag_destroy		= udp_abort,
>  };
>  EXPORT_SYMBOL(udp_prot);
>  
> @@ -2831,6 +2825,21 @@ u32 udp_flow_hashrnd(void)
>  }
>  EXPORT_SYMBOL(udp_flow_hashrnd);
>  
> +static int __net_init udp_sysctl_init(struct net *net)
> +{
> +	net->ipv4.sysctl_udp_rmem_min = SK_MEM_QUANTUM;
> +	net->ipv4.sysctl_udp_wmem_min = SK_MEM_QUANTUM;
> +
> +#ifdef CONFIG_NET_L3_MASTER_DEV
> +	net->ipv4.sysctl_udp_l3mdev_accept = 0;
> +#endif
> +	return 0;
> +}
> +
> +static struct pernet_operations __net_initdata udp_sysctl_ops = {
> +	.init       = udp_sysctl_init,
> +};
> +
>  void __init udp_init(void)
>  {
>  	unsigned long limit;
> @@ -2843,8 +2852,12 @@ void __init udp_init(void)
>  	sysctl_udp_mem[1] = limit;
>  	sysctl_udp_mem[2] = sysctl_udp_mem[0] * 2;
>  
> -	sysctl_udp_rmem_min = SK_MEM_QUANTUM;
> -	sysctl_udp_wmem_min = SK_MEM_QUANTUM;
> +	init_net.ipv4.sysctl_udp_rmem_min = SK_MEM_QUANTUM;
> +	init_net.ipv4.sysctl_udp_wmem_min = SK_MEM_QUANTUM;
> +
> +#ifdef CONFIG_NET_L3_MASTER_DEV
> +	init_net.ipv4.sysctl_udp_l3mdev_accept = 0;
> +#endif

You can avoid the code duplication here - and in udp_sysctl_init() -
using a common helper.

Thanks,

Paolo