pkt_sched: Add peek emulation for non-work-conserving qdiscs.
This patch adds qdisc_peek_dequeued() wrapper to emulate peek method with qdisc->dequeue() and storing "peeked" skb in qdisc->gso_skb until dequeuing. This is mainly for compatibility reasons not to break some strange configs because peeking is expected for non-work-conserving parent qdiscs to query work-conserving child qdiscs. This implementation requires using qdisc_dequeue_peeked() wrapper instead of directly calling qdisc->dequeue() for all qdiscs ever querried with qdisc->ops->peek() or qdisc_peek_dequeued(). Signed-off-by: Jarek Poplawski <jarkao2@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
03c05f0d4b
commit
77be155cba
@@ -484,7 +484,7 @@ static void sch_atm_dequeue(unsigned long data)
|
||||
if (!atm_may_send(flow->vcc, skb->truesize))
|
||||
break;
|
||||
|
||||
skb = flow->q->dequeue(flow->q);
|
||||
skb = qdisc_dequeue_peeked(flow->q);
|
||||
if (unlikely(!skb))
|
||||
break;
|
||||
|
||||
@@ -519,7 +519,7 @@ static struct sk_buff *atm_tc_dequeue(struct Qdisc *sch)
|
||||
|
||||
pr_debug("atm_tc_dequeue(sch %p,[qdisc %p])\n", sch, p);
|
||||
tasklet_schedule(&p->task);
|
||||
skb = p->link.q->dequeue(p->link.q);
|
||||
skb = qdisc_dequeue_peeked(p->link.q);
|
||||
if (skb)
|
||||
sch->q.qlen--;
|
||||
return skb;
|
||||
|
Reference in New Issue
Block a user