diff options
author | Eric Dumazet <dada1@cosmosbay.com> | 2008-11-26 00:16:35 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-11-26 00:16:35 -0500 |
commit | 1748376b6626acf59c24e9592ac67b3fe2a0e026 (patch) | |
tree | 65a28205daf1ca92e31389440764fc407365014e /net/core | |
parent | c1b56878fb68e9c14070939ea4537ad4db79ffae (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')
-rw-r--r-- | net/core/sock.c | 10 |
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 | } |
1076 | out: | 1076 | out: |
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)) |