pkt_sched: Use qdisc->ops->peek() instead of ->dequeue() & ->requeue()
Subsystems (4)
PATCH RESEND 5/6 pkt_sched: Use qdisc->ops->peek() instead of ->dequeue() & ->requeue()
Use qdisc->ops->peek() instead of ->dequeue() & ->requeue() pair. After this patch the only remaining user of qdisc->ops->requeue() is netem_enqueue(). Based on ideas of Herbert Xu, Patrick McHardy and David S. Miller.
Signed-off-by Jarek Poplawski <[email protected]>
--- net/sched/sch_atm.c | 11 +++++++---- net/sched/sch_hfsc.c | 12 ++---------- net/sched/sch_netem.c | 13 +++++-------- net/sched/sch_tbf.c | 12 +++++------- 4 files changed, 19 insertions(+), 29 deletions(-)
net/sched/sch_atm.c +7 -4
@@ -480,11 +480,14 @@ static void sch_atm_dequeue(unsigned long data)* If traffic is properly shaped, this won't generate nasty * little bursts. Otherwise, it may ... (but that's okay) */ -while ((skb = flow->q->dequeue (flow->q))) { -if (!atm_may_send (flow->vcc, skb->truesize)) { - (void )flow->q->ops->requeue (skb, flow->q); +while ((skb = flow->q->ops->peek (flow->q))) { +if (!atm_may_send (flow->vcc, skb->truesize))break ; - } + + skb = flow->q->dequeue (flow->q); +if (unlikely (!skb)) +break ; +pr_debug ("atm_tc_dequeue: sending on class %p\n" , flow);/* remove any LL header somebody else has attached */ skb_pull (skb,skb_network_offset (skb));
net/sched/sch_hfsc.c +2 -10
@@ -880,28 +880,20 @@ set_passive(struct hfsc_class *cl)*/ } -/* -* hack to get length of first packet in queue. -*/ static unsigned int qdisc_peek_len (struct Qdisc *sch) {struct sk_buff *skb;unsigned int len; - skb = sch->dequeue (sch); + skb = sch->ops->peek (sch);if (skb ==NULL ) {if (net_ratelimit ())printk ("qdisc_peek_len: non work-conserving qdisc ?\n" );return 0 ; } len =qdisc_pkt_len (skb); -if (unlikely (sch->ops->requeue (skb, sch) !=NET_XMIT_SUCCESS )) { -if (net_ratelimit ()) -printk ("qdisc_peek_len: failed to requeue\n" ); -qdisc_tree_decrease_qlen (sch,1 ); -return 0 ; - } +return len; }
net/sched/sch_netem.c +5 -8
@@ -283,25 +283,22 @@ static struct sk_buff *netem_dequeue(struct Qdisc *sch)if (sch->flags &TCQ_F_THROTTLED )return NULL ; - skb = q->qdisc->dequeue (q->qdisc); + skb = q->qdisc->ops->peek (q->qdisc);if (skb) {const struct netem_skb_cb *cb =netem_skb_cb (skb);psched_time_t now =psched_get_time ();/* if more time remaining? */ if (cb->time_to_send <= now) { + skb = q->qdisc->dequeue (q->qdisc); +if (!skb) +return NULL ; +pr_debug ("netem_dequeue: return skb=%p\n" , skb); sch->q.qlen--;return skb; } -if (unlikely (q->qdisc->ops->requeue (skb, q->qdisc) !=NET_XMIT_SUCCESS )) { -qdisc_tree_decrease_qlen (q->qdisc,1 ); - sch->qstats.drops++; -printk (KERN_ERR "netem: %s could not requeue\n" , - q->qdisc->ops->id); - } -qdisc_watchdog_schedule (&q->watchdog, cb->time_to_send); }
net/sched/sch_tbf.c +5 -7
@@ -169,7 +169,7 @@ static struct sk_buff *tbf_dequeue(struct Qdisc* sch)struct tbf_sched_data *q =qdisc_priv (sch);struct sk_buff *skb; - skb = q->qdisc->dequeue (q->qdisc); + skb = q->qdisc->ops->peek (q->qdisc);if (skb) {psched_time_t now;
@@ -192,6 +192,10 @@ static struct sk_buff *tbf_dequeue(struct Qdisc* sch) toks -=L2T (q, len);if ((toks|ptoks) >=0 ) { + skb = q->qdisc->dequeue (q->qdisc); +if (unlikely (!skb)) +return NULL ; + q->t_c = now; q->tokens = toks; q->ptokens = ptoks;
@@ -214,12 +218,6 @@ static struct sk_buff *tbf_dequeue(struct Qdisc* sch)(cf. CSZ, HPFQ, HFSC) */ -if (q->qdisc->ops->requeue (skb, q->qdisc) !=NET_XMIT_SUCCESS ) { -/* When requeue fails skb is dropped */ -qdisc_tree_decrease_qlen (q->qdisc,1 ); - sch->qstats.drops++; - } - sch->qstats.overlimits++; }return NULL ;
Signature · 1 line
1.5.6.5