]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
dql: annotate data-races around dql->last_obj_cnt
authorEric Dumazet <edumazet@google.com>
Tue, 29 Oct 2024 19:14:25 +0000 (19:14 +0000)
committerJakub Kicinski <kuba@kernel.org>
Fri, 1 Nov 2024 02:19:36 +0000 (19:19 -0700)
dql->last_obj_cnt is read/written from different contexts,
without any lock synchronization.

Use READ_ONCE()/WRITE_ONCE() to avoid load/store tearing.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Joe Damato <jdamato@fastly.com>
Link: https://patch.msgid.link/20241029191425.2519085-1-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/linux/dynamic_queue_limits.h
lib/dynamic_queue_limits.c

index 281298e77a1579cba1f92a3b3f03b8be089fd38f..808b1a5102e7c0bbbcd9676b0dacadad2f0ee49a 100644 (file)
@@ -127,7 +127,7 @@ static inline void dql_queued(struct dql *dql, unsigned int count)
        if (WARN_ON_ONCE(count > DQL_MAX_OBJECT))
                return;
 
-       dql->last_obj_cnt = count;
+       WRITE_ONCE(dql->last_obj_cnt, count);
 
        /* We want to force a write first, so that cpu do not attempt
         * to get cache line containing last_obj_cnt, num_queued, adj_limit
index e49deddd3de9fe9e98d6712559cf48d12a0a2537..c1b7638a594ac43f947e00decabbd3468dcb53de 100644 (file)
@@ -179,7 +179,7 @@ void dql_completed(struct dql *dql, unsigned int count)
 
        dql->adj_limit = limit + completed;
        dql->prev_ovlimit = ovlimit;
-       dql->prev_last_obj_cnt = dql->last_obj_cnt;
+       dql->prev_last_obj_cnt = READ_ONCE(dql->last_obj_cnt);
        dql->num_completed = completed;
        dql->prev_num_queued = num_queued;