Commit f86f42ed authored by Eric Dumazet's avatar Eric Dumazet Committed by Paolo Abeni
Browse files

net: add sk_drops_read(), sk_drops_inc() and sk_drops_reset() helpers



We want to split sk->sk_drops in the future to reduce
potential contention on this field.

Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Reviewed-by: default avatarKuniyuki Iwashima <kuniyu@google.com>
Link: https://patch.msgid.link/20250826125031.1578842-2-edumazet@google.com


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent c2a75689
Loading
Loading
Loading
Loading
+16 −1
Original line number Diff line number Diff line
@@ -2682,11 +2682,26 @@ struct sock_skb_cb {
#define sock_skb_cb_check_size(size) \
	BUILD_BUG_ON((size) > SOCK_SKB_CB_OFFSET)

static inline void sk_drops_inc(struct sock *sk)
{
	atomic_inc(&sk->sk_drops);
}

static inline int sk_drops_read(const struct sock *sk)
{
	return atomic_read(&sk->sk_drops);
}

static inline void sk_drops_reset(struct sock *sk)
{
	atomic_set(&sk->sk_drops, 0);
}

static inline void
sock_skb_set_dropcount(const struct sock *sk, struct sk_buff *skb)
{
	SOCK_SKB_CB(skb)->dropcount = sock_flag(sk, SOCK_RXQ_OVFL) ?
						atomic_read(&sk->sk_drops) : 0;
						sk_drops_read(sk) : 0;
}

static inline void sk_drops_add(struct sock *sk, const struct sk_buff *skb)
+1 −1
Original line number Diff line number Diff line
@@ -2612,7 +2612,7 @@ static inline void tcp_segs_in(struct tcp_sock *tp, const struct sk_buff *skb)
 */
static inline void tcp_listendrop(const struct sock *sk)
{
	atomic_inc(&((struct sock *)sk)->sk_drops);
	sk_drops_inc((struct sock *)sk);
	__NET_INC_STATS(sock_net(sk), LINUX_MIB_LISTENDROPS);
}

+1 −1
Original line number Diff line number Diff line
@@ -345,7 +345,7 @@ int __sk_queue_drop_skb(struct sock *sk, struct sk_buff_head *sk_queue,
		spin_unlock_bh(&sk_queue->lock);
	}

	atomic_inc(&sk->sk_drops);
	sk_drops_inc(sk);
	return err;
}
EXPORT_SYMBOL(__sk_queue_drop_skb);
+7 −7
Original line number Diff line number Diff line
@@ -491,13 +491,13 @@ int __sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
	struct sk_buff_head *list = &sk->sk_receive_queue;

	if (atomic_read(&sk->sk_rmem_alloc) >= READ_ONCE(sk->sk_rcvbuf)) {
		atomic_inc(&sk->sk_drops);
		sk_drops_inc(sk);
		trace_sock_rcvqueue_full(sk, skb);
		return -ENOMEM;
	}

	if (!sk_rmem_schedule(sk, skb, skb->truesize)) {
		atomic_inc(&sk->sk_drops);
		sk_drops_inc(sk);
		return -ENOBUFS;
	}

@@ -562,7 +562,7 @@ int __sk_receive_skb(struct sock *sk, struct sk_buff *skb,
	skb->dev = NULL;

	if (sk_rcvqueues_full(sk, READ_ONCE(sk->sk_rcvbuf))) {
		atomic_inc(&sk->sk_drops);
		sk_drops_inc(sk);
		reason = SKB_DROP_REASON_SOCKET_RCVBUFF;
		goto discard_and_relse;
	}
@@ -585,7 +585,7 @@ int __sk_receive_skb(struct sock *sk, struct sk_buff *skb,
			reason = SKB_DROP_REASON_PFMEMALLOC;
		if (err == -ENOBUFS)
			reason = SKB_DROP_REASON_SOCKET_BACKLOG;
		atomic_inc(&sk->sk_drops);
		sk_drops_inc(sk);
		goto discard_and_relse;
	}

@@ -2505,7 +2505,7 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority)
	newsk->sk_wmem_queued	= 0;
	newsk->sk_forward_alloc = 0;
	newsk->sk_reserved_mem  = 0;
	atomic_set(&newsk->sk_drops, 0);
	sk_drops_reset(newsk);
	newsk->sk_send_head	= NULL;
	newsk->sk_userlocks	= sk->sk_userlocks & ~SOCK_BINDPORT_LOCK;
	atomic_set(&newsk->sk_zckey, 0);
@@ -3713,7 +3713,7 @@ void sock_init_data_uid(struct socket *sock, struct sock *sk, kuid_t uid)
	 */
	smp_wmb();
	refcount_set(&sk->sk_refcnt, 1);
	atomic_set(&sk->sk_drops, 0);
	sk_drops_reset(sk);
}
EXPORT_SYMBOL(sock_init_data_uid);

@@ -3973,7 +3973,7 @@ void sk_get_meminfo(const struct sock *sk, u32 *mem)
	mem[SK_MEMINFO_WMEM_QUEUED] = READ_ONCE(sk->sk_wmem_queued);
	mem[SK_MEMINFO_OPTMEM] = atomic_read(&sk->sk_omem_alloc);
	mem[SK_MEMINFO_BACKLOG] = READ_ONCE(sk->sk_backlog.len);
	mem[SK_MEMINFO_DROPS] = atomic_read(&sk->sk_drops);
	mem[SK_MEMINFO_DROPS] = sk_drops_read(sk);
}

#ifdef CONFIG_PROC_FS
+1 −1
Original line number Diff line number Diff line
@@ -1119,7 +1119,7 @@ static void ping_v4_format_sock(struct sock *sp, struct seq_file *f,
		from_kuid_munged(seq_user_ns(f), sk_uid(sp)),
		0, sock_i_ino(sp),
		refcount_read(&sp->sk_refcnt), sp,
		atomic_read(&sp->sk_drops));
		sk_drops_read(sp));
}

static int ping_v4_seq_show(struct seq_file *seq, void *v)
Loading