]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net/sched: sch_fq_pie: annotate data-races in fq_pie_dump_stats()
authorEric Dumazet <edumazet@google.com>
Thu, 23 Apr 2026 06:35:27 +0000 (06:35 +0000)
committerJakub Kicinski <kuba@kernel.org>
Tue, 28 Apr 2026 00:41:52 +0000 (17:41 -0700)
fq_codel_dump_stats() acquires the qdisc spinlock a bit too late.

Move this acquisition before we fill tc_fq_pie_xstats with live data.

Alternative would be to add READ_ONCE() and WRITE_ONCE() annotations,
but the spinlock is needed anyway to scan q->new_flows and q->old_flows.

Fixes: ec97ecf1ebe4 ("net: sched: add Flow Queue PIE packet scheduler")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Jamal Hadi Salim <jhs@mojatatu.com>
Link: https://patch.msgid.link/20260423063527.2568262-1-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/sched/sch_fq_pie.c

index 154c70f489f289066db5d61bb51e58aaf328f16e..7becbf5362b3165bac4517f32887386b01301612 100644 (file)
@@ -509,18 +509,19 @@ nla_put_failure:
 static int fq_pie_dump_stats(struct Qdisc *sch, struct gnet_dump *d)
 {
        struct fq_pie_sched_data *q = qdisc_priv(sch);
-       struct tc_fq_pie_xstats st = {
-               .packets_in     = q->stats.packets_in,
-               .overlimit      = q->stats.overlimit,
-               .overmemory     = q->overmemory,
-               .dropped        = q->stats.dropped,
-               .ecn_mark       = q->stats.ecn_mark,
-               .new_flow_count = q->new_flow_count,
-               .memory_usage   = q->memory_usage,
-       };
+       struct tc_fq_pie_xstats st = { 0 };
        struct list_head *pos;
 
        sch_tree_lock(sch);
+
+       st.packets_in   = q->stats.packets_in;
+       st.overlimit    = q->stats.overlimit;
+       st.overmemory   = q->overmemory;
+       st.dropped      = q->stats.dropped;
+       st.ecn_mark     = q->stats.ecn_mark;
+       st.new_flow_count = q->new_flow_count;
+       st.memory_usage   = q->memory_usage;
+
        list_for_each(pos, &q->new_flows)
                st.new_flows_len++;