[NET] sysctl: make sysctl_somaxconn per-namespace
authorPavel Emelyanov <xemul@openvz.org>
Sat, 8 Dec 2007 08:12:33 +0000 (00:12 -0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 28 Jan 2008 22:56:57 +0000 (14:56 -0800)
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 <xemul@oenvz.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/socket.h
include/net/net_namespace.h
net/core/sysctl_net_core.c
net/socket.c

index eb5bdd59a644aeb1a1d57fbf8eca349da5188daf..bd2b30a74e7694b67038ee0d69865580b4081d2f 100644 (file)
@@ -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);
index d5936115d97230c2a39009bbd269fd33827b4868..b62e31fca4742543a3a9df86841305d9e7faad53 100644 (file)
@@ -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;
index dc4cf7dda9d173fe9c23fba4d2563afce357f6f8..130338f83ae5c7be54b7f848d755931f65b4bc0e 100644 (file)
@@ -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);
index 9ebca5c695d626c4ad68a527063fcf8cf3ecbc91..7651de0085028dc4d02b15e5844e239dd938d01e 100644 (file)
@@ -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)