Commit 3557619f authored by Florian Westphal's avatar Florian Westphal Committed by David S. Miller

net_sched: prio: use qdisc_dequeue_peeked

commit 07bd8df5
(sch_sfq: fix peek() implementation) changed sfq to use generic
peek helper.

This makes HFSC complain about a non-work-conserving child qdisc, if
prio with sfq child is used within hfsc:

hfsc peeks into prio qdisc, which will then peek into sfq.
returned skb is stashed in sch->gso_skb.

Next, hfsc tries to dequeue from prio, but prio will call sfq dequeue
directly, which may return NULL instead of previously peeked-at skb.

Have prio call qdisc_dequeue_peeked, so sfq->dequeue() is
not called in this case.

Cc: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 9be6dd65
...@@ -112,7 +112,7 @@ static struct sk_buff *prio_dequeue(struct Qdisc *sch) ...@@ -112,7 +112,7 @@ static struct sk_buff *prio_dequeue(struct Qdisc *sch)
for (prio = 0; prio < q->bands; prio++) { for (prio = 0; prio < q->bands; prio++) {
struct Qdisc *qdisc = q->queues[prio]; struct Qdisc *qdisc = q->queues[prio];
struct sk_buff *skb = qdisc->dequeue(qdisc); struct sk_buff *skb = qdisc_dequeue_peeked(qdisc);
if (skb) { if (skb) {
qdisc_bstats_update(sch, skb); qdisc_bstats_update(sch, skb);
sch->q.qlen--; sch->q.qlen--;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment