]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net/sched: sch_cake: annotate data-races in cake_dump_stats() (V)
authorEric Dumazet <edumazet@google.com>
Mon, 27 Apr 2026 08:36:06 +0000 (08:36 +0000)
committerJakub Kicinski <kuba@kernel.org>
Wed, 29 Apr 2026 01:27:51 +0000 (18:27 -0700)
cake_dump_stats() runs without qdisc spinlock being held.

In this final patch, I add READ_ONCE()/WRITE_ONCE() annotations
for cparams.target and cparams.interval.

Fixes: 046f6fd5daef ("sched: Add Common Applications Kept Enhanced (cake) qdisc")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Acked-by: "Toke Høiland-Jørgensen" <toke@toke.dk>
Link: https://patch.msgid.link/20260427083606.459355-6-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/sched/sch_cake.c

index 975f5d6d6982f33a9d1f5454721ce16b6c433439..13c6d1869a144738c52ffc462f06338bf8245fea 100644 (file)
@@ -2356,10 +2356,11 @@ static void cake_set_rate(struct cake_tin_data *b, u64 rate, u32 mtu,
 
        byte_target_ns = (byte_target * rate_ns) >> rate_shft;
 
-       b->cparams.target = max((byte_target_ns * 3) / 2, target_ns);
-       b->cparams.interval = max(rtt_est_ns +
-                                    b->cparams.target - target_ns,
-                                    b->cparams.target * 2);
+       WRITE_ONCE(b->cparams.target,
+                  max((byte_target_ns * 3) / 2, target_ns));
+       WRITE_ONCE(b->cparams.interval,
+                  max(rtt_est_ns + b->cparams.target - target_ns,
+                      b->cparams.target * 2));
        b->cparams.mtu_time = byte_target_ns;
        b->cparams.p_inc = 1 << 24; /* 1/256 */
        b->cparams.p_dec = 1 << 20; /* 1/4096 */
@@ -3042,9 +3043,9 @@ static int cake_dump_stats(struct Qdisc *sch, struct gnet_dump *d)
                PUT_TSTAT_U32(BACKLOG_BYTES, READ_ONCE(b->tin_backlog));
 
                PUT_TSTAT_U32(TARGET_US,
-                             ktime_to_us(ns_to_ktime(b->cparams.target)));
+                             ktime_to_us(ns_to_ktime(READ_ONCE(b->cparams.target))));
                PUT_TSTAT_U32(INTERVAL_US,
-                             ktime_to_us(ns_to_ktime(b->cparams.interval)));
+                             ktime_to_us(ns_to_ktime(READ_ONCE(b->cparams.interval))));
 
                PUT_TSTAT_U32(SENT_PACKETS, READ_ONCE(b->packets));
                PUT_TSTAT_U32(DROPPED_PACKETS, READ_ONCE(b->tin_dropped));