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

inet: raw: add drop_counters to raw sockets



When a packet flood hits one or more RAW sockets, many cpus
have to update sk->sk_drops.

This slows down other cpus, because currently
sk_drops is in sock_write_rx group.

Add a socket_drop_counters structure to raw sockets.

Using dedicated cache lines to hold drop counters
makes sure that consumers no longer suffer from
false sharing if/when producers only change sk->sk_drops.

This adds 128 bytes per RAW socket.

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


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 51132b99
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -295,7 +295,7 @@ struct raw6_sock {
	__u32			offset;		/* checksum offset  */
	struct icmp6_filter	filter;
	__u32			ip6mr_table;

	struct socket_drop_counters drop_counters;
	struct ipv6_pinfo	inet6;
};

+1 −0
Original line number Diff line number Diff line
@@ -81,6 +81,7 @@ struct raw_sock {
	struct inet_sock   inet;
	struct icmp_filter filter;
	u32		   ipmr_table;
	struct socket_drop_counters drop_counters;
};

#define raw_sk(ptr) container_of_const(ptr, struct raw_sock, inet.sk)
+1 −0
Original line number Diff line number Diff line
@@ -793,6 +793,7 @@ static int raw_sk_init(struct sock *sk)
{
	struct raw_sock *rp = raw_sk(sk);

	sk->sk_drop_counters = &rp->drop_counters;
	if (inet_sk(sk)->inet_num == IPPROTO_ICMP)
		memset(&rp->filter, 0, sizeof(rp->filter));
	return 0;
+1 −0
Original line number Diff line number Diff line
@@ -1175,6 +1175,7 @@ static int rawv6_init_sk(struct sock *sk)
{
	struct raw6_sock *rp = raw6_sk(sk);

	sk->sk_drop_counters = &rp->drop_counters;
	switch (inet_sk(sk)->inet_num) {
	case IPPROTO_ICMPV6:
		rp->checksum = 1;