diff options
author | Tonghao Zhang <xiangxia.m.yue@gmail.com> | 2017-12-14 05:51:58 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-12-19 09:58:14 -0500 |
commit | 648845ab7e200993dccd3948c719c858368c91e7 (patch) | |
tree | ca35bba9338cb8bca9cadfa1badd2e755277beda /include | |
parent | 08fc7f8140730d2f8499c91b5abad44581b74635 (diff) | |
download | op-kernel-dev-648845ab7e200993dccd3948c719c858368c91e7.zip op-kernel-dev-648845ab7e200993dccd3948c719c858368c91e7.tar.gz |
sock: Move the socket inuse to namespace.
In some case, we want to know how many sockets are in use in
different _net_ namespaces. It's a key resource metric.
This patch add a member in struct netns_core. This is a counter
for socket-inuse in the _net_ namespace. The patch will add/sub
counter in the sk_alloc, sk_clone_lock and __sk_free.
This patch will not counter the socket created in kernel.
It's not very useful for userspace to know how many kernel
sockets we created.
The main reasons for doing this are that:
1. When linux calls the 'do_exit' for process to exit, the functions
'exit_task_namespaces' and 'exit_task_work' will be called sequentially.
'exit_task_namespaces' may have destroyed the _net_ namespace, but
'sock_release' called in 'exit_task_work' may use the _net_ namespace
if we counter the socket-inuse in sock_release.
2. socket and sock are in pair. More important, sock holds the _net_
namespace. We counter the socket-inuse in sock, for avoiding holding
_net_ namespace again in socket. It's a easy way to maintain the code.
Signed-off-by: Martin Zhang <zhangjunweimartin@didichuxing.com>
Signed-off-by: Tonghao Zhang <zhangtonghao@didichuxing.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
-rw-r--r-- | include/net/netns/core.h | 3 | ||||
-rw-r--r-- | include/net/sock.h | 1 |
2 files changed, 4 insertions, 0 deletions
diff --git a/include/net/netns/core.h b/include/net/netns/core.h index 45cfb5d..a5e8a66 100644 --- a/include/net/netns/core.h +++ b/include/net/netns/core.h @@ -11,6 +11,9 @@ struct netns_core { int sysctl_somaxconn; +#ifdef CONFIG_PROC_FS + int __percpu *sock_inuse; +#endif struct prot_inuse __percpu *prot_inuse; }; diff --git a/include/net/sock.h b/include/net/sock.h index 9a90472..0a32f3c 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -1262,6 +1262,7 @@ proto_memory_pressure(struct proto *prot) /* Called with local bh disabled */ void sock_prot_inuse_add(struct net *net, struct proto *prot, int inc); int sock_prot_inuse_get(struct net *net, struct proto *proto); +int sock_inuse_get(struct net *net); #else static inline void sock_prot_inuse_add(struct net *net, struct proto *prot, int inc) |