]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net/sched: sch_ets: make cl->quantum lockless
authorEric Dumazet <edumazet@google.com>
Fri, 22 May 2026 11:03:56 +0000 (11:03 +0000)
committerJakub Kicinski <kuba@kernel.org>
Mon, 25 May 2026 18:09:27 +0000 (11:09 -0700)
cl->quantum does not need to be protected by RTNL or qdisc spinlock.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Victor Nogueira <victor@mojatatu.com>
Link: https://patch.msgid.link/20260522110356.1403343-1-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/sched/sch_ets.c

index 1cc559634ed27ce5a6630186a51a8ac8180dad96..cb8cf437ce87086c9eedf777dc7610137d5e09a5 100644 (file)
@@ -247,9 +247,7 @@ static int ets_class_change(struct Qdisc *sch, u32 classid, u32 parentid,
        if (err)
                return err;
 
-       sch_tree_lock(sch);
-       cl->quantum = quantum;
-       sch_tree_unlock(sch);
+       WRITE_ONCE(cl->quantum, quantum);
 
        ets_offload_change(sch);
        return 0;
@@ -320,7 +318,7 @@ static int ets_class_dump(struct Qdisc *sch, unsigned long arg,
        if (!nest)
                goto nla_put_failure;
        if (!ets_class_is_strict(q, cl)) {
-               if (nla_put_u32(skb, TCA_ETS_QUANTA_BAND, cl->quantum))
+               if (nla_put_u32(skb, TCA_ETS_QUANTA_BAND, READ_ONCE(cl->quantum)))
                        goto nla_put_failure;
        }
        return nla_nest_end(skb, nest);
@@ -445,7 +443,7 @@ static int ets_qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch,
 
        if (!cl_is_active(cl) && !ets_class_is_strict(q, cl)) {
                list_add_tail(&cl->alist, &q->active);
-               cl->deficit = cl->quantum;
+               cl->deficit = READ_ONCE(cl->quantum);
        }
 
        qstats_backlog_add(sch, len);
@@ -499,7 +497,7 @@ static struct sk_buff *ets_qdisc_dequeue(struct Qdisc *sch)
                        return ets_qdisc_dequeue_skb(sch, skb);
                }
 
-               cl->deficit += cl->quantum;
+               cl->deficit += READ_ONCE(cl->quantum);
                list_move_tail(&cl->alist, &q->active);
        }
 out: