--- x/net/core/sock.c +++ y/net/core/sock.c @@ -2160,11 +2160,6 @@ static void __sk_destruct(struct rcu_hea put_cred(sk->sk_peer_cred); put_pid(sk->sk_peer_pid); - if (likely(sk->sk_net_refcnt)) - put_net_track(sock_net(sk), &sk->ns_tracker); - else - __netns_tracker_free(sock_net(sk), &sk->ns_tracker, false); - sk_prot_free(sk->sk_prot_creator, sk); } @@ -2177,6 +2172,11 @@ void sk_destruct(struct sock *sk) use_call_rcu = true; } + if (likely(sk->sk_net_refcnt)) + put_net_track(sock_net(sk), &sk->ns_tracker); + else + __netns_tracker_free(sock_net(sk), &sk->ns_tracker, false); + if (use_call_rcu) call_rcu(&sk->sk_rcu, __sk_destruct); else