pkt_sched: Fix qdisc len in qdisc_peek_dequeued()
Subsystems (2)
PATCH 1/1 pkt_sched: Fix qdisc len in qdisc_peek_dequeued()
pkt_sched: Fix qdisc len in qdisc_peek_dequeued()
A packet dequeued and stored as gso_skb in qdisc_peek_dequeued() should be seen as part of the queue for sch->q.qlen queries until it's really dequeued with qdisc_dequeue_peeked(), so qlen needs additional updating in these functions. (Updating qstats.backlog shouldn't matter here.)
---
include/net/sch_generic.h | 12 +++++++++--- 1 files changed, 9 insertions(+), 3 deletions(-)
include/net/sch_generic.h +9 -3
@@ -442,8 +442,12 @@ static inline struct sk_buff *qdisc_peek_head(struct Qdisc *sch)static inline struct sk_buff *qdisc_peek_dequeued (struct Qdisc *sch) {/* we can reuse ->gso_skb because peek isn't called for root qdiscs */ -if (!sch->gso_skb) +if (!sch->gso_skb) { sch->gso_skb = sch->dequeue (sch); +if (sch->gso_skb) +/* it's still part of the queue */ + sch->q.qlen++; + }return sch->gso_skb; }
@@ -453,10 +457,12 @@ static inline struct sk_buff *qdisc_dequeue_peeked(struct Qdisc *sch) {struct sk_buff *skb = sch->gso_skb; -if (skb) +if (skb) { sch->gso_skb =NULL ; -else + sch->q.qlen--; + }else { skb = sch->dequeue (sch); + }return skb; }
From: Jarek Poplawski <[email protected]>
Date: Wed, 5 Nov 2008 13:44:54 +0000
Quoted 8 lines
pkt_sched: Fix qdisc len inqdisc_peek_dequeued()A packet dequeued and stored as
gso_skbinqdisc_peek_dequeued()should be seen as part of the queue forsch->q.qlenqueries until it's really dequeued withqdisc_dequeue_peeked(), so qlen needs additional updating in these functions. (Updating qstats.backlog shouldn't matter here.)Signed-off-by Jarek Poplawski <[email protected]>
Applied, thanks Jarek.