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 (248969ae31
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>
This commit is contained in:
committed by
David S. Miller
parent
c1b56878fb
commit
1748376b66
@ -1071,7 +1071,7 @@ struct sock *sk_clone(const struct sock *sk, const gfp_t priority)
|
||||
newsk->sk_sleep = NULL;
|
||||
|
||||
if (newsk->sk_prot->sockets_allocated)
|
||||
atomic_inc(newsk->sk_prot->sockets_allocated);
|
||||
percpu_counter_inc(newsk->sk_prot->sockets_allocated);
|
||||
}
|
||||
out:
|
||||
return newsk;
|
||||
@ -1463,8 +1463,12 @@ int __sk_mem_schedule(struct sock *sk, int size, int kind)
|
||||
}
|
||||
|
||||
if (prot->memory_pressure) {
|
||||
if (!*prot->memory_pressure ||
|
||||
prot->sysctl_mem[2] > atomic_read(prot->sockets_allocated) *
|
||||
int alloc;
|
||||
|
||||
if (!*prot->memory_pressure)
|
||||
return 1;
|
||||
alloc = percpu_counter_read_positive(prot->sockets_allocated);
|
||||
if (prot->sysctl_mem[2] > alloc *
|
||||
sk_mem_pages(sk->sk_wmem_queued +
|
||||
atomic_read(&sk->sk_rmem_alloc) +
|
||||
sk->sk_forward_alloc))
|
||||
|
Reference in New Issue
Block a user