]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net/sched: add qdisc_qlen_lockless() helper
authorEric Dumazet <edumazet@google.com>
Sun, 10 May 2026 09:14:51 +0000 (09:14 +0000)
committerJakub Kicinski <kuba@kernel.org>
Tue, 12 May 2026 01:28:07 +0000 (18:28 -0700)
Used in contexts were qdisc spinlock is not held.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Acked-by: Toke Høiland-Jørgensen <toke@toke.dk>
Link: https://patch.msgid.link/20260510091455.4039245-5-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/sch_generic.h
net/sched/sch_mq.c
net/sched/sch_mqprio.c

index 391ee85300172fced9bd7c8918727f01662c4a11..0edf05d56862b113a9468ef2175d203123814ec5 100644 (file)
@@ -542,6 +542,11 @@ static inline int qdisc_qlen(const struct Qdisc *q)
        return q->q.qlen;
 }
 
+static inline int qdisc_qlen_lockless(const struct Qdisc *q)
+{
+       return READ_ONCE(q->q.qlen);
+}
+
 static inline void qdisc_qlen_inc(struct Qdisc *q)
 {
        WRITE_ONCE(q->q.qlen, q->q.qlen + 1);
@@ -561,7 +566,7 @@ static inline int qdisc_qlen_sum(const struct Qdisc *q)
                for_each_possible_cpu(i)
                        qlen += READ_ONCE(per_cpu_ptr(q->cpu_qstats, i)->qlen);
        } else {
-               qlen += READ_ONCE(q->q.qlen);
+               qlen += qdisc_qlen_lockless(q);
        }
 
        return qlen;
index ec8c91d3fde04e59daec2aecdb14d6bf50715e15..4172ec24a43d1c2fe56789986a46da93eb522721 100644 (file)
@@ -163,7 +163,7 @@ void mq_dump_common(struct Qdisc *sch, struct sk_buff *skb)
                                     &qdisc->bstats, false);
                gnet_stats_add_queue(&sch->qstats, qdisc->cpu_qstats,
                                     &qdisc->qstats);
-               qlen += qdisc_qlen(qdisc);
+               qlen += qdisc_qlen_lockless(qdisc);
 
                spin_unlock_bh(qdisc_lock(qdisc));
        }
index 91a92992cd24ab6c30bf7db2288c08cd493c7bc3..3b4881c389c535368687454ea268bec892ecb942 100644 (file)
@@ -576,7 +576,7 @@ static int mqprio_dump(struct Qdisc *sch, struct sk_buff *skb)
                                     &qdisc->bstats, false);
                gnet_stats_add_queue(&sch->qstats, qdisc->cpu_qstats,
                                     &qdisc->qstats);
-               qlen += qdisc_qlen(qdisc);
+               qlen += qdisc_qlen_lockless(qdisc);
 
                spin_unlock_bh(qdisc_lock(qdisc));
        }
@@ -691,7 +691,7 @@ static int mqprio_dump_class_stats(struct Qdisc *sch, unsigned long cl,
                                             &qdisc->bstats, false);
                        gnet_stats_add_queue(&qstats, qdisc->cpu_qstats,
                                             &qdisc->qstats);
-                       qlen += qdisc_qlen(qdisc);
+                       qlen += qdisc_qlen_lockless(qdisc);
 
                        spin_unlock_bh(qdisc_lock(qdisc));
                }