mirror of
https://github.com/torvalds/linux
synced 2024-09-06 18:01:05 +00:00
net: no longer support SOCK_REFCNT_DEBUG feature
Commite48c414ee6
("[INET]: Generalise the TCP sock ID lookup routines") commented out the definition of SOCK_REFCNT_DEBUG in 2005 and later another commit463c84b97f
("[NET]: Introduce inet_connection_sock") removed it. Since we could track all of them through bpf and kprobe related tools and the feature could print loads of information which might not be that helpful even under a little bit pressure, the whole feature which has been inactive for many years is no longer supported. Link: https://lore.kernel.org/lkml/20230211065153.54116-1-kerneljasonxing@gmail.com/ Suggested-by: Kuniyuki Iwashima <kuniyu@amazon.com> Signed-off-by: Jason Xing <kernelxing@tencent.com> Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com> Acked-by: Wenjia Zhang <wenjia@linux.ibm.com> Reviewed-by: Eric Dumazet <edumazet@google.com> Acked-by: Matthieu Baerts <matthieu.baerts@tessares.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
1ed32ad4a3
commit
fe33311c3e
|
@ -1349,9 +1349,6 @@ struct proto {
|
||||||
char name[32];
|
char name[32];
|
||||||
|
|
||||||
struct list_head node;
|
struct list_head node;
|
||||||
#ifdef SOCK_REFCNT_DEBUG
|
|
||||||
atomic_t socks;
|
|
||||||
#endif
|
|
||||||
int (*diag_destroy)(struct sock *sk, int err);
|
int (*diag_destroy)(struct sock *sk, int err);
|
||||||
} __randomize_layout;
|
} __randomize_layout;
|
||||||
|
|
||||||
|
@ -1359,31 +1356,6 @@ int proto_register(struct proto *prot, int alloc_slab);
|
||||||
void proto_unregister(struct proto *prot);
|
void proto_unregister(struct proto *prot);
|
||||||
int sock_load_diag_module(int family, int protocol);
|
int sock_load_diag_module(int family, int protocol);
|
||||||
|
|
||||||
#ifdef SOCK_REFCNT_DEBUG
|
|
||||||
static inline void sk_refcnt_debug_inc(struct sock *sk)
|
|
||||||
{
|
|
||||||
atomic_inc(&sk->sk_prot->socks);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void sk_refcnt_debug_dec(struct sock *sk)
|
|
||||||
{
|
|
||||||
atomic_dec(&sk->sk_prot->socks);
|
|
||||||
printk(KERN_DEBUG "%s socket %p released, %d are still alive\n",
|
|
||||||
sk->sk_prot->name, sk, atomic_read(&sk->sk_prot->socks));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void sk_refcnt_debug_release(const struct sock *sk)
|
|
||||||
{
|
|
||||||
if (refcount_read(&sk->sk_refcnt) != 1)
|
|
||||||
printk(KERN_DEBUG "Destruction of the %s socket %p delayed, refcnt=%d\n",
|
|
||||||
sk->sk_prot->name, sk, refcount_read(&sk->sk_refcnt));
|
|
||||||
}
|
|
||||||
#else /* SOCK_REFCNT_DEBUG */
|
|
||||||
#define sk_refcnt_debug_inc(sk) do { } while (0)
|
|
||||||
#define sk_refcnt_debug_dec(sk) do { } while (0)
|
|
||||||
#define sk_refcnt_debug_release(sk) do { } while (0)
|
|
||||||
#endif /* SOCK_REFCNT_DEBUG */
|
|
||||||
|
|
||||||
INDIRECT_CALLABLE_DECLARE(bool tcp_stream_memory_free(const struct sock *sk, int wake));
|
INDIRECT_CALLABLE_DECLARE(bool tcp_stream_memory_free(const struct sock *sk, int wake));
|
||||||
|
|
||||||
static inline int sk_forward_alloc_get(const struct sock *sk)
|
static inline int sk_forward_alloc_get(const struct sock *sk)
|
||||||
|
|
|
@ -2340,17 +2340,6 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority)
|
||||||
smp_wmb();
|
smp_wmb();
|
||||||
refcount_set(&newsk->sk_refcnt, 2);
|
refcount_set(&newsk->sk_refcnt, 2);
|
||||||
|
|
||||||
/* Increment the counter in the same struct proto as the master
|
|
||||||
* sock (sk_refcnt_debug_inc uses newsk->sk_prot->socks, that
|
|
||||||
* is the same as sk->sk_prot->socks, as this field was copied
|
|
||||||
* with memcpy).
|
|
||||||
*
|
|
||||||
* This _changes_ the previous behaviour, where
|
|
||||||
* tcp_create_openreq_child always was incrementing the
|
|
||||||
* equivalent to tcp_prot->socks (inet_sock_nr), so this have
|
|
||||||
* to be taken into account in all callers. -acme
|
|
||||||
*/
|
|
||||||
sk_refcnt_debug_inc(newsk);
|
|
||||||
sk_set_socket(newsk, NULL);
|
sk_set_socket(newsk, NULL);
|
||||||
sk_tx_queue_clear(newsk);
|
sk_tx_queue_clear(newsk);
|
||||||
RCU_INIT_POINTER(newsk->sk_wq, NULL);
|
RCU_INIT_POINTER(newsk->sk_wq, NULL);
|
||||||
|
@ -3710,8 +3699,6 @@ void sk_common_release(struct sock *sk)
|
||||||
|
|
||||||
xfrm_sk_free_policy(sk);
|
xfrm_sk_free_policy(sk);
|
||||||
|
|
||||||
sk_refcnt_debug_release(sk);
|
|
||||||
|
|
||||||
sock_put(sk);
|
sock_put(sk);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(sk_common_release);
|
EXPORT_SYMBOL(sk_common_release);
|
||||||
|
|
|
@ -156,7 +156,6 @@ void inet_sock_destruct(struct sock *sk)
|
||||||
kfree(rcu_dereference_protected(inet->inet_opt, 1));
|
kfree(rcu_dereference_protected(inet->inet_opt, 1));
|
||||||
dst_release(rcu_dereference_protected(sk->sk_dst_cache, 1));
|
dst_release(rcu_dereference_protected(sk->sk_dst_cache, 1));
|
||||||
dst_release(rcu_dereference_protected(sk->sk_rx_dst, 1));
|
dst_release(rcu_dereference_protected(sk->sk_rx_dst, 1));
|
||||||
sk_refcnt_debug_dec(sk);
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(inet_sock_destruct);
|
EXPORT_SYMBOL(inet_sock_destruct);
|
||||||
|
|
||||||
|
@ -357,8 +356,6 @@ static int inet_create(struct net *net, struct socket *sock, int protocol,
|
||||||
inet->mc_list = NULL;
|
inet->mc_list = NULL;
|
||||||
inet->rcv_tos = 0;
|
inet->rcv_tos = 0;
|
||||||
|
|
||||||
sk_refcnt_debug_inc(sk);
|
|
||||||
|
|
||||||
if (inet->inet_num) {
|
if (inet->inet_num) {
|
||||||
/* It assumes that any protocol which allows
|
/* It assumes that any protocol which allows
|
||||||
* the user to assign a number at socket
|
* the user to assign a number at socket
|
||||||
|
|
|
@ -1199,8 +1199,6 @@ void inet_csk_destroy_sock(struct sock *sk)
|
||||||
|
|
||||||
xfrm_sk_free_policy(sk);
|
xfrm_sk_free_policy(sk);
|
||||||
|
|
||||||
sk_refcnt_debug_release(sk);
|
|
||||||
|
|
||||||
this_cpu_dec(*sk->sk_prot->orphan_count);
|
this_cpu_dec(*sk->sk_prot->orphan_count);
|
||||||
|
|
||||||
sock_put(sk);
|
sock_put(sk);
|
||||||
|
|
|
@ -77,9 +77,6 @@ void inet_twsk_free(struct inet_timewait_sock *tw)
|
||||||
{
|
{
|
||||||
struct module *owner = tw->tw_prot->owner;
|
struct module *owner = tw->tw_prot->owner;
|
||||||
twsk_destructor((struct sock *)tw);
|
twsk_destructor((struct sock *)tw);
|
||||||
#ifdef SOCK_REFCNT_DEBUG
|
|
||||||
pr_debug("%s timewait_sock %p released\n", tw->tw_prot->name, tw);
|
|
||||||
#endif
|
|
||||||
kmem_cache_free(tw->tw_prot->twsk_prot->twsk_slab, tw);
|
kmem_cache_free(tw->tw_prot->twsk_prot->twsk_slab, tw);
|
||||||
module_put(owner);
|
module_put(owner);
|
||||||
}
|
}
|
||||||
|
|
|
@ -239,16 +239,6 @@ static int inet6_create(struct net *net, struct socket *sock, int protocol,
|
||||||
inet->pmtudisc = IP_PMTUDISC_DONT;
|
inet->pmtudisc = IP_PMTUDISC_DONT;
|
||||||
else
|
else
|
||||||
inet->pmtudisc = IP_PMTUDISC_WANT;
|
inet->pmtudisc = IP_PMTUDISC_WANT;
|
||||||
/*
|
|
||||||
* Increment only the relevant sk_prot->socks debug field, this changes
|
|
||||||
* the previous behaviour of incrementing both the equivalent to
|
|
||||||
* answer->prot->socks (inet6_sock_nr) and inet_sock_nr.
|
|
||||||
*
|
|
||||||
* This allows better debug granularity as we'll know exactly how many
|
|
||||||
* UDPv6, TCPv6, etc socks were allocated, not the sum of all IPv6
|
|
||||||
* transport protocol socks. -acme
|
|
||||||
*/
|
|
||||||
sk_refcnt_debug_inc(sk);
|
|
||||||
|
|
||||||
if (inet->inet_num) {
|
if (inet->inet_num) {
|
||||||
/* It assumes that any protocol which allows
|
/* It assumes that any protocol which allows
|
||||||
|
|
|
@ -464,13 +464,6 @@ int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
|
||||||
__ipv6_sock_mc_close(sk);
|
__ipv6_sock_mc_close(sk);
|
||||||
__ipv6_sock_ac_close(sk);
|
__ipv6_sock_ac_close(sk);
|
||||||
|
|
||||||
/*
|
|
||||||
* Sock is moving from IPv6 to IPv4 (sk_prot), so
|
|
||||||
* remove it from the refcnt debug socks count in the
|
|
||||||
* original family...
|
|
||||||
*/
|
|
||||||
sk_refcnt_debug_dec(sk);
|
|
||||||
|
|
||||||
if (sk->sk_protocol == IPPROTO_TCP) {
|
if (sk->sk_protocol == IPPROTO_TCP) {
|
||||||
struct inet_connection_sock *icsk = inet_csk(sk);
|
struct inet_connection_sock *icsk = inet_csk(sk);
|
||||||
|
|
||||||
|
@ -507,11 +500,6 @@ int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
|
||||||
|
|
||||||
inet6_cleanup_sock(sk);
|
inet6_cleanup_sock(sk);
|
||||||
|
|
||||||
/*
|
|
||||||
* ... and add it to the refcnt debug socks count
|
|
||||||
* in the new family. -acme
|
|
||||||
*/
|
|
||||||
sk_refcnt_debug_inc(sk);
|
|
||||||
module_put(THIS_MODULE);
|
module_put(THIS_MODULE);
|
||||||
retv = 0;
|
retv = 0;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -2875,7 +2875,6 @@ static void __mptcp_destroy_sock(struct sock *sk)
|
||||||
sk_stream_kill_queues(sk);
|
sk_stream_kill_queues(sk);
|
||||||
xfrm_sk_free_policy(sk);
|
xfrm_sk_free_policy(sk);
|
||||||
|
|
||||||
sk_refcnt_debug_release(sk);
|
|
||||||
sock_put(sk);
|
sock_put(sk);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1335,8 +1335,6 @@ static void packet_sock_destruct(struct sock *sk)
|
||||||
pr_err("Attempt to release alive packet socket: %p\n", sk);
|
pr_err("Attempt to release alive packet socket: %p\n", sk);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sk_refcnt_debug_dec(sk);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool fanout_flow_is_huge(struct packet_sock *po, struct sk_buff *skb)
|
static bool fanout_flow_is_huge(struct packet_sock *po, struct sk_buff *skb)
|
||||||
|
@ -3174,7 +3172,6 @@ static int packet_release(struct socket *sock)
|
||||||
|
|
||||||
skb_queue_purge(&sk->sk_receive_queue);
|
skb_queue_purge(&sk->sk_receive_queue);
|
||||||
packet_free_pending(po);
|
packet_free_pending(po);
|
||||||
sk_refcnt_debug_release(sk);
|
|
||||||
|
|
||||||
sock_put(sk);
|
sock_put(sk);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -3364,7 +3361,6 @@ static int packet_create(struct net *net, struct socket *sock, int protocol,
|
||||||
packet_cached_dev_reset(po);
|
packet_cached_dev_reset(po);
|
||||||
|
|
||||||
sk->sk_destruct = packet_sock_destruct;
|
sk->sk_destruct = packet_sock_destruct;
|
||||||
sk_refcnt_debug_inc(sk);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Attach a protocol block
|
* Attach a protocol block
|
||||||
|
|
|
@ -807,8 +807,6 @@ static struct sock *sctp_v6_create_accept_sk(struct sock *sk,
|
||||||
|
|
||||||
newsk->sk_v6_rcv_saddr = sk->sk_v6_rcv_saddr;
|
newsk->sk_v6_rcv_saddr = sk->sk_v6_rcv_saddr;
|
||||||
|
|
||||||
sk_refcnt_debug_inc(newsk);
|
|
||||||
|
|
||||||
if (newsk->sk_prot->init(newsk)) {
|
if (newsk->sk_prot->init(newsk)) {
|
||||||
sk_common_release(newsk);
|
sk_common_release(newsk);
|
||||||
newsk = NULL;
|
newsk = NULL;
|
||||||
|
|
|
@ -601,8 +601,6 @@ static struct sock *sctp_v4_create_accept_sk(struct sock *sk,
|
||||||
|
|
||||||
newinet->inet_daddr = asoc->peer.primary_addr.v4.sin_addr.s_addr;
|
newinet->inet_daddr = asoc->peer.primary_addr.v4.sin_addr.s_addr;
|
||||||
|
|
||||||
sk_refcnt_debug_inc(newsk);
|
|
||||||
|
|
||||||
if (newsk->sk_prot->init(newsk)) {
|
if (newsk->sk_prot->init(newsk)) {
|
||||||
sk_common_release(newsk);
|
sk_common_release(newsk);
|
||||||
newsk = NULL;
|
newsk = NULL;
|
||||||
|
|
|
@ -360,8 +360,6 @@ static void smc_destruct(struct sock *sk)
|
||||||
return;
|
return;
|
||||||
if (!sock_flag(sk, SOCK_DEAD))
|
if (!sock_flag(sk, SOCK_DEAD))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
sk_refcnt_debug_dec(sk);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct sock *smc_sock_alloc(struct net *net, struct socket *sock,
|
static struct sock *smc_sock_alloc(struct net *net, struct socket *sock,
|
||||||
|
@ -390,7 +388,6 @@ static struct sock *smc_sock_alloc(struct net *net, struct socket *sock,
|
||||||
spin_lock_init(&smc->accept_q_lock);
|
spin_lock_init(&smc->accept_q_lock);
|
||||||
spin_lock_init(&smc->conn.send_lock);
|
spin_lock_init(&smc->conn.send_lock);
|
||||||
sk->sk_prot->hash(sk);
|
sk->sk_prot->hash(sk);
|
||||||
sk_refcnt_debug_inc(sk);
|
|
||||||
mutex_init(&smc->clcsock_release_lock);
|
mutex_init(&smc->clcsock_release_lock);
|
||||||
smc_init_saved_callbacks(smc);
|
smc_init_saved_callbacks(smc);
|
||||||
|
|
||||||
|
|
|
@ -845,7 +845,6 @@ static int xsk_release(struct socket *sock)
|
||||||
sock_orphan(sk);
|
sock_orphan(sk);
|
||||||
sock->sk = NULL;
|
sock->sk = NULL;
|
||||||
|
|
||||||
sk_refcnt_debug_release(sk);
|
|
||||||
sock_put(sk);
|
sock_put(sk);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1396,8 +1395,6 @@ static void xsk_destruct(struct sock *sk)
|
||||||
|
|
||||||
if (!xp_put_pool(xs->pool))
|
if (!xp_put_pool(xs->pool))
|
||||||
xdp_put_umem(xs->umem, !xs->pool);
|
xdp_put_umem(xs->umem, !xs->pool);
|
||||||
|
|
||||||
sk_refcnt_debug_dec(sk);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int xsk_create(struct net *net, struct socket *sock, int protocol,
|
static int xsk_create(struct net *net, struct socket *sock, int protocol,
|
||||||
|
@ -1427,7 +1424,6 @@ static int xsk_create(struct net *net, struct socket *sock, int protocol,
|
||||||
sk->sk_family = PF_XDP;
|
sk->sk_family = PF_XDP;
|
||||||
|
|
||||||
sk->sk_destruct = xsk_destruct;
|
sk->sk_destruct = xsk_destruct;
|
||||||
sk_refcnt_debug_inc(sk);
|
|
||||||
|
|
||||||
sock_set_flag(sk, SOCK_RCU_FREE);
|
sock_set_flag(sk, SOCK_RCU_FREE);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue