Commit ffa84b5f authored by Eric Dumazet's avatar Eric Dumazet Committed by Jakub Kicinski

net: add netns refcount tracker to struct sock

Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 9ba74e6c
...@@ -350,6 +350,7 @@ struct bpf_local_storage; ...@@ -350,6 +350,7 @@ struct bpf_local_storage;
* @sk_txtime_deadline_mode: set deadline mode for SO_TXTIME * @sk_txtime_deadline_mode: set deadline mode for SO_TXTIME
* @sk_txtime_report_errors: set report errors mode for SO_TXTIME * @sk_txtime_report_errors: set report errors mode for SO_TXTIME
* @sk_txtime_unused: unused txtime flags * @sk_txtime_unused: unused txtime flags
* @ns_tracker: tracker for netns reference
*/ */
struct sock { struct sock {
/* /*
...@@ -538,6 +539,7 @@ struct sock { ...@@ -538,6 +539,7 @@ struct sock {
struct bpf_local_storage __rcu *sk_bpf_storage; struct bpf_local_storage __rcu *sk_bpf_storage;
#endif #endif
struct rcu_head sk_rcu; struct rcu_head sk_rcu;
netns_tracker ns_tracker;
}; };
enum sk_pacing { enum sk_pacing {
......
...@@ -1983,7 +1983,7 @@ struct sock *sk_alloc(struct net *net, int family, gfp_t priority, ...@@ -1983,7 +1983,7 @@ struct sock *sk_alloc(struct net *net, int family, gfp_t priority,
sock_lock_init(sk); sock_lock_init(sk);
sk->sk_net_refcnt = kern ? 0 : 1; sk->sk_net_refcnt = kern ? 0 : 1;
if (likely(sk->sk_net_refcnt)) { if (likely(sk->sk_net_refcnt)) {
get_net(net); get_net_track(net, &sk->ns_tracker, priority);
sock_inuse_add(net, 1); sock_inuse_add(net, 1);
} }
...@@ -2039,7 +2039,7 @@ static void __sk_destruct(struct rcu_head *head) ...@@ -2039,7 +2039,7 @@ static void __sk_destruct(struct rcu_head *head)
put_pid(sk->sk_peer_pid); put_pid(sk->sk_peer_pid);
if (likely(sk->sk_net_refcnt)) if (likely(sk->sk_net_refcnt))
put_net(sock_net(sk)); put_net_track(sock_net(sk), &sk->ns_tracker);
sk_prot_free(sk->sk_prot_creator, sk); sk_prot_free(sk->sk_prot_creator, sk);
} }
...@@ -2126,7 +2126,7 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority) ...@@ -2126,7 +2126,7 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority)
/* SANITY */ /* SANITY */
if (likely(newsk->sk_net_refcnt)) { if (likely(newsk->sk_net_refcnt)) {
get_net(sock_net(newsk)); get_net_track(sock_net(newsk), &newsk->ns_tracker, priority);
sock_inuse_add(sock_net(newsk), 1); sock_inuse_add(sock_net(newsk), 1);
} }
sk_node_init(&newsk->sk_node); sk_node_init(&newsk->sk_node);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment