]> www.infradead.org Git - users/hch/misc.git/commitdiff
inet: raw: add drop_counters to raw sockets
authorEric Dumazet <edumazet@google.com>
Tue, 26 Aug 2025 12:50:31 +0000 (12:50 +0000)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 28 Aug 2025 11:14:50 +0000 (13:14 +0200)
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: Eric Dumazet <edumazet@google.com>
Reviewed-by: Kuniyuki Iwashima <kuniyu@google.com>
Link: https://patch.msgid.link/20250826125031.1578842-6-edumazet@google.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
include/linux/ipv6.h
include/net/raw.h
net/ipv4/raw.c
net/ipv6/raw.c

index bc6ec295917321b38489efb4a82897ad02ee9b52..261d02efb615cfb7fa5717a88c1b2612ef0cbd82 100644 (file)
@@ -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;
 };
 
index 32a61481a253b2cf991fc4a3360e56604ef8490d..d5270913906077f88cbd843ed1edde345b4d42d7 100644 (file)
@@ -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)
index 0f9f02f6146eef6df3f5bbb4f564e16fbabd1ba2..d54ebb7df966d561c8f29b390212a4e6140dcada 100644 (file)
@@ -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;
index 4026192143ec9f1b071f43874185bc367c950c67..4ae07a67b4d4f1be6730c252d246e79ff9c73d4c 100644 (file)
@@ -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;