aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/sock.c
diff options
context:
space:
mode:
authorEric Dumazet <dada1@cosmosbay.com>2008-11-26 00:16:35 -0500
committerDavid S. Miller <davem@davemloft.net>2008-11-26 00:16:35 -0500
commit1748376b6626acf59c24e9592ac67b3fe2a0e026 (patch)
tree65a28205daf1ca92e31389440764fc407365014e /net/core/sock.c
parentc1b56878fb68e9c14070939ea4537ad4db79ffae (diff)
net: Use a percpu_counter for sockets_allocated
Instead of using one atomic_t per protocol, use a percpu_counter for "sockets_allocated", to reduce cache line contention on heavy duty network servers. Note : We revert commit (248969ae31e1b3276fc4399d67ce29a5d81e6fd9 net: af_unix can make unix_nr_socks visbile in /proc), since it is not anymore used after sock_prot_inuse_add() addition Signed-off-by: Eric Dumazet <dada1@cosmosbay.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core/sock.c')
-rw-r--r--net/core/sock.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/net/core/sock.c b/net/core/sock.c
index a4e840e5a053..7a081b647bf9 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -1071,7 +1071,7 @@ struct sock *sk_clone(const struct sock *sk, const gfp_t priority)
1071 newsk->sk_sleep = NULL; 1071 newsk->sk_sleep = NULL;
1072 1072
1073 if (newsk->sk_prot->sockets_allocated) 1073 if (newsk->sk_prot->sockets_allocated)
1074 atomic_inc(newsk->sk_prot->sockets_allocated); 1074 percpu_counter_inc(newsk->sk_prot->sockets_allocated);
1075 } 1075 }
1076out: 1076out:
1077 return newsk; 1077 return newsk;
@@ -1463,8 +1463,12 @@ int __sk_mem_schedule(struct sock *sk, int size, int kind)
1463 } 1463 }
1464 1464
1465 if (prot->memory_pressure) { 1465 if (prot->memory_pressure) {
1466 if (!*prot->memory_pressure || 1466 int alloc;
1467 prot->sysctl_mem[2] > atomic_read(prot->sockets_allocated) * 1467
1468 if (!*prot->memory_pressure)
1469 return 1;
1470 alloc = percpu_counter_read_positive(prot->sockets_allocated);
1471 if (prot->sysctl_mem[2] > alloc *
1468 sk_mem_pages(sk->sk_wmem_queued + 1472 sk_mem_pages(sk->sk_wmem_queued +
1469 atomic_read(&sk->sk_rmem_alloc) + 1473 atomic_read(&sk->sk_rmem_alloc) +
1470 sk->sk_forward_alloc)) 1474 sk->sk_forward_alloc))