]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
can: statistics: add missing atomic access in hot path
authorOliver Hartkopp <socketcan@hartkopp.net>
Wed, 18 Mar 2026 17:34:13 +0000 (18:34 +0100)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Thu, 19 Mar 2026 13:53:19 +0000 (14:53 +0100)
Commit 80b5f90158d1 ("can: statistics: use atomic access in hot path")
fixed a KCSAN issue in can_receive() but missed to convert the 'matches'
variable used in can_rcv_filter().

Fixes: 80b5f90158d1 ("can: statistics: use atomic access in hot path")
Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
Link: https://patch.msgid.link/20260318173413.28235-1-socketcan@hartkopp.net
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
net/can/af_can.c
net/can/af_can.h
net/can/proc.c

index f70e2ba0aadc0d9aa8bb90c965ecf6eab3ae6a22..7bc86b176b4de32dddeab5a42a420d62434fcd7f 100644 (file)
@@ -469,7 +469,7 @@ int can_rx_register(struct net *net, struct net_device *dev, canid_t can_id,
 
        rcv->can_id = can_id;
        rcv->mask = mask;
-       rcv->matches = 0;
+       atomic_long_set(&rcv->matches, 0);
        rcv->func = func;
        rcv->data = data;
        rcv->ident = ident;
@@ -573,7 +573,7 @@ EXPORT_SYMBOL(can_rx_unregister);
 static inline void deliver(struct sk_buff *skb, struct receiver *rcv)
 {
        rcv->func(skb, rcv->data);
-       rcv->matches++;
+       atomic_long_inc(&rcv->matches);
 }
 
 static int can_rcv_filter(struct can_dev_rcv_lists *dev_rcv_lists, struct sk_buff *skb)
index 22f3352c77fecec1bb973715dabe83021db3a2f2..87887014f5628e97e3a1a83cd9f9f2eaa38c7ece 100644 (file)
@@ -52,7 +52,7 @@ struct receiver {
        struct hlist_node list;
        canid_t can_id;
        canid_t mask;
-       unsigned long matches;
+       atomic_long_t matches;
        void (*func)(struct sk_buff *skb, void *data);
        void *data;
        char *ident;
index 0938bf7dd646ac44220873358c242d489b394918..de4d05ae345977b71db672ff163da0f45c2f4b17 100644 (file)
@@ -196,7 +196,8 @@ static void can_print_rcvlist(struct seq_file *m, struct hlist_head *rx_list,
                        "   %-5s     %03x    %08x  %pK  %pK  %8ld  %s\n";
 
                seq_printf(m, fmt, DNAME(dev), r->can_id, r->mask,
-                               r->func, r->data, r->matches, r->ident);
+                          r->func, r->data, atomic_long_read(&r->matches),
+                          r->ident);
        }
 }