]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net/sched: sch_pie: annotate more data-races in pie_dump_stats()
authorEric Dumazet <edumazet@google.com>
Thu, 30 Apr 2026 08:00:56 +0000 (08:00 +0000)
committerJakub Kicinski <kuba@kernel.org>
Sat, 2 May 2026 00:54:57 +0000 (17:54 -0700)
My prior patch missed few READ_ONCE()/WRITE_ONCE() annotations.

Fixes: 5154561d9b11 ("net/sched: sch_pie: annotate data-races in pie_dump_stats()")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20260430080056.35104-1-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/sched/sch_pie.c

index fb53fbf0e328571be72b66ba4e75a938e1963422..b41f2def2e2cc5bb09b663feea30a7d884d1dabc 100644 (file)
@@ -219,16 +219,14 @@ void pie_process_dequeue(struct sk_buff *skb, struct pie_params *params,
         * packet timestamp.
         */
        if (!params->dq_rate_estimator) {
-               vars->qdelay = now - pie_get_enqueue_time(skb);
+               WRITE_ONCE(vars->qdelay,
+                          backlog ? now - pie_get_enqueue_time(skb) : 0);
 
                if (vars->dq_tstamp != DTIME_INVALID)
                        dtime = now - vars->dq_tstamp;
 
                vars->dq_tstamp = now;
 
-               if (backlog == 0)
-                       vars->qdelay = 0;
-
                if (dtime == 0)
                        return;
 
@@ -376,7 +374,7 @@ void pie_calculate_probability(struct pie_params *params, struct pie_vars *vars,
        if (qdelay > (PSCHED_NS2TICKS(250 * NSEC_PER_MSEC)))
                delta += MAX_PROB / (100 / 2);
 
-       vars->prob += delta;
+       WRITE_ONCE(vars->prob, vars->prob + delta);
 
        if (delta > 0) {
                /* prevent overflow */
@@ -401,7 +399,7 @@ void pie_calculate_probability(struct pie_params *params, struct pie_vars *vars,
 
        if (qdelay == 0 && qdelay_old == 0 && update_prob)
                /* Reduce drop probability to 98.4% */
-               vars->prob -= vars->prob / 64;
+               WRITE_ONCE(vars->prob, vars->prob - vars->prob / 64);
 
        WRITE_ONCE(vars->qdelay, qdelay);
        vars->backlog_old = backlog;
@@ -501,7 +499,7 @@ static int pie_dump_stats(struct Qdisc *sch, struct gnet_dump *d)
 {
        struct pie_sched_data *q = qdisc_priv(sch);
        struct tc_pie_xstats st = {
-               .prob           = q->vars.prob << BITS_PER_BYTE,
+               .prob           = READ_ONCE(q->vars.prob) << BITS_PER_BYTE,
                .delay          = ((u32)PSCHED_TICKS2NS(READ_ONCE(q->vars.qdelay))) /
                                   NSEC_PER_USEC,
                .packets_in     = READ_ONCE(q->stats.packets_in),
@@ -512,7 +510,7 @@ static int pie_dump_stats(struct Qdisc *sch, struct gnet_dump *d)
        };
 
        /* avg_dq_rate is only valid if dq_rate_estimator is enabled */
-       st.dq_rate_estimating = q->params.dq_rate_estimator;
+       st.dq_rate_estimating = READ_ONCE(q->params.dq_rate_estimator);
 
        /* unscale and return dq_rate in bytes per sec */
        if (st.dq_rate_estimating)