sysctl: make sysctl_somaxconn per-namespace
Subsystems (3)
PATCH 3/3 sysctl: make sysctl_somaxconn per-namespace
Just move the variable on the struct net and adjust its usage.
Others sysctls from sys.net.core table are more difficult to virtualize (i.e. make them per-namespace), but I'll look at them as well a bit later.
Signed-off-by Pavel Emelyanov <[email protected]>
---
include/linux/socket.h +0 -1
@@ -24,7 +24,6 @@ struct __kernel_sockaddr_storage {#include <linux/types.h> /* pid_t */ #include <linux/compiler.h> /* __user */ -extern int sysctl_somaxconn;#ifdef CONFIG_PROC_FS struct seq_file ;extern void socket_seq_show (struct seq_file *seq);
include/net/net_namespace.h +1 -0
@@ -39,6 +39,7 @@ struct net {/* core sysctls */ struct ctl_table_header *sysctl_core_hdr; +int sysctl_somaxconn;/* List of all packet sockets. */ rwlock_t packet_sklist_lock;
net/core/sysctl_net_core.c +3 -1
@@ -127,7 +127,7 @@ static struct ctl_table net_core_table[] = { { .ctl_name = NET_CORE_SOMAXCONN, .procname = "somaxconn", - .data = &sysctl_somaxconn, + .data = &init_net.sysctl_somaxconn, .maxlen = sizeof(int), .mode =0644 , .proc_handler = &proc_dointvec
@@ -161,6 +161,8 @@ static __net_init int sysctl_core_net_init(struct net *net) {struct ctl_table *tbl, *tmp; + net->sysctl_somaxconn =SOMAXCONN ; + tbl = net_core_table;if (net != &init_net) { tbl =kmemdup (tbl,sizeof (net_core_table),GFP_KERNEL );
net/socket.c +4 -4
@@ -1365,17 +1365,17 @@ asmlinkage long sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen)* ready for listening. */ -int sysctl_somaxconn__read_mostly =SOMAXCONN ; -asmlinkage long sys_listen (int fd,int backlog) {struct socket *sock;int err, fput_needed; +int somaxconn; sock =sockfd_lookup_light (fd, &err, &fput_needed);if (sock) { -if ((unsigned )backlog > sysctl_somaxconn) - backlog = sysctl_somaxconn; + somaxconn = sock->sk->sk_net->sysctl_somaxconn; +if ((unsigned )backlog > somaxconn) + backlog = somaxconn; err =security_socket_listen (sock, backlog);if (!err)
Signature · 1 line
1.5.3.4
From: Pavel Emelyanov <[email protected]>
Date: Fri, 07 Dec 2007 16:12:48 +0300
Quoted 8 lines
Just move the variable on the struct net and adjust its usage.
Others sysctls from sys.net.core table are more difficult to virtualize (i.e. make them per-namespace), but I'll look at them as well a bit later.
Signed-off-by Pavel Emelyanov <[email protected]>
Applied, thanks.