]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net/sched: netem: fix queue limit check to include reordered packets
authorStephen Hemminger <stephen@networkplumber.org>
Sat, 18 Apr 2026 03:19:40 +0000 (20:19 -0700)
committerJakub Kicinski <kuba@kernel.org>
Tue, 28 Apr 2026 00:30:27 +0000 (17:30 -0700)
The queue limit check in netem_enqueue() uses q->t_len which only
counts packets in the internal tfifo. Packets placed in sch->q by
the reorder path (__qdisc_enqueue_head) are not counted, allowing
the total queue occupancy to exceed sch->limit under reordering.

Include sch->q.qlen in the limit check.

Fixes: f8d4bc455047 ("net/sched: netem: account for backlog updates from child qdisc")
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20260418032027.900913-3-stephen@networkplumber.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/sched/sch_netem.c

index 8ee72cac1faf09e577b45f357b9df9a8a551a9a5..d400a730eadd1296289f1bfeb7281f32fdf47055 100644 (file)
@@ -524,7 +524,7 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch,
                                1 << get_random_u32_below(8);
        }
 
-       if (unlikely(q->t_len >= sch->limit)) {
+       if (unlikely(sch->q.qlen >= sch->limit)) {
                /* re-link segs, so that qdisc_drop_all() frees them all */
                skb->next = segs;
                qdisc_drop_all(skb, sch, to_free);