* [PATCH 01/14] pkt_sched: Add qdisc_dequeue() helper. [not found] <fe92ba9380e7da89b674cc58fcb5bc1dae69e0c6.1223973003.git.jarkao2@gmail.com> @ 2008-10-14 9:53 ` Jarek Poplawski 2008-10-14 9:53 ` [PATCH 02/14] pkt_sched: Replace all explitic ->dequeue() calls with qdisc_dequeue() Jarek Poplawski ` (12 subsequent siblings) 13 siblings, 0 replies; 17+ messages in thread From: Jarek Poplawski @ 2008-10-14 9:53 UTC (permalink / raw) To: David Miller; +Cc: netdev -------- Original Message -------- Subject: [PATCH 3/9]: pkt_sched: Add qdisc_dequeue() helper. Date: Mon, 18 Aug 2008 01:36:55 -0700 (PDT) From: David Miller <davem@davemloft.net> Modified sch_generic.c part. -------------> From: David Miller <davem@davemloft.net> pkt_sched: Add qdisc_dequeue() helper. It prioritizes packets on the ->requeue list. Use in qdisc_restart() as it's basically a complete copy of dequeue_skb(). Signed-off-by: Jarek Poplawski <jarkao2@gmail.com> --- include/net/sch_generic.h | 8 ++++++++ net/sched/sch_generic.c | 2 +- 2 files changed, 9 insertions(+), 1 deletions(-) diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h index 3fe49d8..00c1309 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h @@ -369,6 +369,14 @@ enum net_xmit_qdisc_t { #define net_xmit_drop_count(e) (1) #endif +static inline struct sk_buff *qdisc_dequeue(struct Qdisc *sch) +{ + struct sk_buff *skb = __skb_dequeue(&sch->requeue); + if (!skb) + skb = sch->dequeue(sch); + return skb; +} + static inline int qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch) { #ifdef CONFIG_NET_SCHED diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index 7b5572d..6730bac 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c @@ -66,7 +66,7 @@ static inline struct sk_buff *dequeue_skb(struct Qdisc *q) else skb = NULL; } else { - skb = q->dequeue(q); + skb = qdisc_dequeue(q); } return skb; -- 1.5.6.5 To: Cc: Bcc: Subject: Reply-To: ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 02/14] pkt_sched: Replace all explitic ->dequeue() calls with qdisc_dequeue(). [not found] <fe92ba9380e7da89b674cc58fcb5bc1dae69e0c6.1223973003.git.jarkao2@gmail.com> 2008-10-14 9:53 ` [PATCH 01/14] pkt_sched: Add qdisc_dequeue() helper Jarek Poplawski @ 2008-10-14 9:53 ` Jarek Poplawski 2008-10-14 10:35 ` Jarek Poplawski 2008-10-14 9:53 ` [PATCH 03/14] pkt_sched: Replace explitic ->dequeue() call with qdisc_dequeue() in sch_multiq Jarek Poplawski ` (11 subsequent siblings) 13 siblings, 1 reply; 17+ messages in thread From: Jarek Poplawski @ 2008-10-14 9:53 UTC (permalink / raw) To: David Miller; +Cc: netdev -------- Original Message -------- Subject: [PATCH 4/9]: pkt_sched: Replace all explitic ->dequeue() calls with qdisc_dequeue(). Date: Mon, 18 Aug 2008 01:36:58 -0700 (PDT) From: David Miller <davem@davemloft.net> -----------> From: David Miller <davem@davemloft.net> pkt_sched: Replace all explitic ->dequeue() calls with qdisc_dequeue(). This spotted a bug in sch_dsmark, it was using qdisc->ops->dequeue() instead of qdisc->dequeue(). Signed-off-by: Jarek Poplawski <jarkao2@gmail.com> --- net/sched/sch_atm.c | 4 ++-- net/sched/sch_cbq.c | 2 +- net/sched/sch_dsmark.c | 2 +- net/sched/sch_hfsc.c | 4 ++-- net/sched/sch_htb.c | 2 +- net/sched/sch_netem.c | 2 +- net/sched/sch_prio.c | 2 +- net/sched/sch_red.c | 2 +- net/sched/sch_tbf.c | 2 +- 9 files changed, 11 insertions(+), 11 deletions(-) diff --git a/net/sched/sch_atm.c b/net/sched/sch_atm.c index 43d3725..ca3467b 100644 --- a/net/sched/sch_atm.c +++ b/net/sched/sch_atm.c @@ -480,7 +480,7 @@ 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))) { + while ((skb = qdisc_dequeue(flow->q))) { if (!atm_may_send(flow->vcc, skb->truesize)) { (void)flow->q->ops->requeue(skb, flow->q); break; @@ -516,7 +516,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(p->link.q); if (skb) sch->q.qlen--; return skb; diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c index 8b06fa9..c68e09c 100644 --- a/net/sched/sch_cbq.c +++ b/net/sched/sch_cbq.c @@ -881,7 +881,7 @@ cbq_dequeue_prio(struct Qdisc *sch, int prio) goto next_class; } - skb = cl->q->dequeue(cl->q); + skb = qdisc_dequeue(cl->q); /* Class did not give us any skb :-( It could occur even if cl->q->q.qlen != 0 diff --git a/net/sched/sch_dsmark.c b/net/sched/sch_dsmark.c index ba43aab..c29e9c2 100644 --- a/net/sched/sch_dsmark.c +++ b/net/sched/sch_dsmark.c @@ -279,7 +279,7 @@ static struct sk_buff *dsmark_dequeue(struct Qdisc *sch) pr_debug("dsmark_dequeue(sch %p,[qdisc %p])\n", sch, p); - skb = p->q->ops->dequeue(p->q); + skb = qdisc_dequeue(p->q); if (skb == NULL) return NULL; diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c index c1e77da..67aa3ea 100644 --- a/net/sched/sch_hfsc.c +++ b/net/sched/sch_hfsc.c @@ -889,7 +889,7 @@ qdisc_peek_len(struct Qdisc *sch) struct sk_buff *skb; unsigned int len; - skb = sch->dequeue(sch); + skb = qdisc_dequeue(sch); if (skb == NULL) { if (net_ratelimit()) printk("qdisc_peek_len: non work-conserving qdisc ?\n"); @@ -1642,7 +1642,7 @@ hfsc_dequeue(struct Qdisc *sch) } } - skb = cl->qdisc->dequeue(cl->qdisc); + skb = qdisc_dequeue(cl->qdisc); if (skb == NULL) { if (net_ratelimit()) printk("HFSC: Non-work-conserving qdisc ?\n"); diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c index d14f020..34c0caf 100644 --- a/net/sched/sch_htb.c +++ b/net/sched/sch_htb.c @@ -840,7 +840,7 @@ next: goto next; } - skb = cl->un.leaf.q->dequeue(cl->un.leaf.q); + skb = qdisc_dequeue(cl->un.leaf.q); if (likely(skb != NULL)) break; if (!cl->warned) { diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c index a119599..cc4d057 100644 --- a/net/sched/sch_netem.c +++ b/net/sched/sch_netem.c @@ -283,7 +283,7 @@ static struct sk_buff *netem_dequeue(struct Qdisc *sch) if (sch->flags & TCQ_F_THROTTLED) return NULL; - skb = q->qdisc->dequeue(q->qdisc); + skb = qdisc_dequeue(q->qdisc); if (skb) { const struct netem_skb_cb *cb = netem_skb_cb(skb); psched_time_t now = psched_get_time(); diff --git a/net/sched/sch_prio.c b/net/sched/sch_prio.c index 504a78c..d527732 100644 --- a/net/sched/sch_prio.c +++ b/net/sched/sch_prio.c @@ -128,7 +128,7 @@ static struct sk_buff *prio_dequeue(struct Qdisc* sch) for (prio = 0; prio < q->bands; prio++) { struct Qdisc *qdisc = q->queues[prio]; - struct sk_buff *skb = qdisc->dequeue(qdisc); + struct sk_buff *skb = qdisc_dequeue(qdisc); if (skb) { sch->q.qlen--; return skb; diff --git a/net/sched/sch_red.c b/net/sched/sch_red.c index 5da0583..3709720 100644 --- a/net/sched/sch_red.c +++ b/net/sched/sch_red.c @@ -131,7 +131,7 @@ static struct sk_buff * red_dequeue(struct Qdisc* sch) struct red_sched_data *q = qdisc_priv(sch); struct Qdisc *child = q->qdisc; - skb = child->dequeue(child); + skb = qdisc_dequeue(child); if (skb) sch->q.qlen--; else if (!red_is_idling(&q->parms)) diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c index 94c6159..a99529d 100644 --- a/net/sched/sch_tbf.c +++ b/net/sched/sch_tbf.c @@ -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 = qdisc_dequeue(q->qdisc); if (skb) { psched_time_t now; -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH 02/14] pkt_sched: Replace all explitic ->dequeue() calls with qdisc_dequeue(). 2008-10-14 9:53 ` [PATCH 02/14] pkt_sched: Replace all explitic ->dequeue() calls with qdisc_dequeue() Jarek Poplawski @ 2008-10-14 10:35 ` Jarek Poplawski 0 siblings, 0 replies; 17+ messages in thread From: Jarek Poplawski @ 2008-10-14 10:35 UTC (permalink / raw) To: David Miller; +Cc: netdev On Tue, Oct 14, 2008 at 09:53:24AM +0000, Jarek Poplawski wrote: > -------- Original Message -------- > Subject: [PATCH 4/9]: pkt_sched: Replace all explitic ->dequeue() calls with qdisc_dequeue(). > Date: Mon, 18 Aug 2008 01:36:58 -0700 (PDT) > From: David Miller <davem@davemloft.net> > > -----------> > From: David Miller <davem@davemloft.net> > pkt_sched: Replace all explitic ->dequeue() calls with qdisc_dequeue(). Hmm... these "explitic" typos could be fixed while merging [PATCH 02/14] and [PATCH 03/14], I guess. Jarek P. ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 03/14] pkt_sched: Replace explitic ->dequeue() call with qdisc_dequeue() in sch_multiq. [not found] <fe92ba9380e7da89b674cc58fcb5bc1dae69e0c6.1223973003.git.jarkao2@gmail.com> 2008-10-14 9:53 ` [PATCH 01/14] pkt_sched: Add qdisc_dequeue() helper Jarek Poplawski 2008-10-14 9:53 ` [PATCH 02/14] pkt_sched: Replace all explitic ->dequeue() calls with qdisc_dequeue() Jarek Poplawski @ 2008-10-14 9:53 ` Jarek Poplawski 2008-10-14 9:53 ` [PATCH 04/14] sch_netem: Use requeue list instead of ops->requeue() Jarek Poplawski ` (10 subsequent siblings) 13 siblings, 0 replies; 17+ messages in thread From: Jarek Poplawski @ 2008-10-14 9:53 UTC (permalink / raw) To: David Miller; +Cc: netdev Replace explitic ->dequeue() call with qdisc_dequeue() in sch_multiq. Signed-off-by: Jarek Poplawski <jarkao2@gmail.com> --- net/sched/sch_multiq.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/net/sched/sch_multiq.c b/net/sched/sch_multiq.c index 915f314..df1857a 100644 --- a/net/sched/sch_multiq.c +++ b/net/sched/sch_multiq.c @@ -144,7 +144,7 @@ static struct sk_buff *multiq_dequeue(struct Qdisc *sch) */ if (!__netif_subqueue_stopped(qdisc_dev(sch), q->curband)) { qdisc = q->queues[q->curband]; - skb = qdisc->dequeue(qdisc); + skb = qdisc_dequeue(qdisc); if (skb) { sch->q.qlen--; return skb; -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 04/14] sch_netem: Use requeue list instead of ops->requeue() [not found] <fe92ba9380e7da89b674cc58fcb5bc1dae69e0c6.1223973003.git.jarkao2@gmail.com> ` (2 preceding siblings ...) 2008-10-14 9:53 ` [PATCH 03/14] pkt_sched: Replace explitic ->dequeue() call with qdisc_dequeue() in sch_multiq Jarek Poplawski @ 2008-10-14 9:53 ` Jarek Poplawski 2008-10-14 15:22 ` Stephen Hemminger 2008-10-14 9:54 ` [PATCH 05/14] sch_tbf: Use ->requeue queue instead of ops Jarek Poplawski ` (9 subsequent siblings) 13 siblings, 1 reply; 17+ messages in thread From: Jarek Poplawski @ 2008-10-14 9:53 UTC (permalink / raw) To: David Miller; +Cc: netdev -------- Original Message -------- Subject: [PATCH 5/9]: sch_netem: Use requeue list instead of ops->requeue() Date: Mon, 18 Aug 2008 01:37:02 -0700 (PDT) From: David Miller <davem@davemloft.net> ---------------> From: David Miller <davem@davemloft.net> sch_netem: Use requeue list instead of ops->requeue() This code just wants to make this packet the "front" one, and that's just as simply done by queueing to the ->requeue list. Signed-off-by: Jarek Poplawski <jarkao2@gmail.com> --- net/sched/sch_netem.c | 11 +++-------- 1 files changed, 3 insertions(+), 8 deletions(-) diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c index cc4d057..5ca92d9 100644 --- a/net/sched/sch_netem.c +++ b/net/sched/sch_netem.c @@ -233,7 +233,8 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) */ cb->time_to_send = psched_get_time(); q->counter = 0; - ret = q->qdisc->ops->requeue(skb, q->qdisc); + __skb_queue_tail(&q->qdisc->requeue, skb); + ret = NET_XMIT_SUCCESS; } if (likely(ret == NET_XMIT_SUCCESS)) { @@ -295,13 +296,7 @@ static struct sk_buff *netem_dequeue(struct Qdisc *sch) 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); - } - + __skb_queue_tail(&q->qdisc->requeue, skb); qdisc_watchdog_schedule(&q->watchdog, cb->time_to_send); } -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH 04/14] sch_netem: Use requeue list instead of ops->requeue() 2008-10-14 9:53 ` [PATCH 04/14] sch_netem: Use requeue list instead of ops->requeue() Jarek Poplawski @ 2008-10-14 15:22 ` Stephen Hemminger 2008-10-14 18:04 ` Jarek Poplawski 0 siblings, 1 reply; 17+ messages in thread From: Stephen Hemminger @ 2008-10-14 15:22 UTC (permalink / raw) To: Jarek Poplawski; +Cc: David Miller, netdev On Tue, 14 Oct 2008 09:53:49 +0000 Jarek Poplawski <jarkao2@gmail.com> wrote: > -------- Original Message -------- > Subject: [PATCH 5/9]: sch_netem: Use requeue list instead of ops->requeue() > Date: Mon, 18 Aug 2008 01:37:02 -0700 (PDT) > From: David Miller <davem@davemloft.net> > > ---------------> > From: David Miller <davem@davemloft.net> > sch_netem: Use requeue list instead of ops->requeue() > > This code just wants to make this packet the "front" one, and that's > just as simply done by queueing to the ->requeue list. > > Signed-off-by: Jarek Poplawski <jarkao2@gmail.com> > --- > net/sched/sch_netem.c | 11 +++-------- > 1 files changed, 3 insertions(+), 8 deletions(-) > > diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c > index cc4d057..5ca92d9 100644 > --- a/net/sched/sch_netem.c > +++ b/net/sched/sch_netem.c > @@ -233,7 +233,8 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) > */ > cb->time_to_send = psched_get_time(); > q->counter = 0; > - ret = q->qdisc->ops->requeue(skb, q->qdisc); > + __skb_queue_tail(&q->qdisc->requeue, skb); > + ret = NET_XMIT_SUCCESS; > } > > if (likely(ret == NET_XMIT_SUCCESS)) { > @@ -295,13 +296,7 @@ static struct sk_buff *netem_dequeue(struct Qdisc *sch) > 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); > - } > - > + __skb_queue_tail(&q->qdisc->requeue, skb); > qdisc_watchdog_schedule(&q->watchdog, cb->time_to_send); > } > This won't work for the case where time based reordering changes the packet sent. The current code works like this: Packet marked to be sent at some time (+101ms) new packet is queued and the random delay computes smaller delta (+87ms) new packet will go out in first. This was done for compatibility with NISTnet, so research that wanted to reproduce NISTnet results could use netem. ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 04/14] sch_netem: Use requeue list instead of ops->requeue() 2008-10-14 15:22 ` Stephen Hemminger @ 2008-10-14 18:04 ` Jarek Poplawski 0 siblings, 0 replies; 17+ messages in thread From: Jarek Poplawski @ 2008-10-14 18:04 UTC (permalink / raw) To: Stephen Hemminger; +Cc: David Miller, netdev On Tue, Oct 14, 2008 at 08:22:35AM -0700, Stephen Hemminger wrote: ... > This won't work for the case where time based reordering changes the packet > sent. The current code works like this: > > Packet marked to be sent at some time (+101ms) > new packet is queued and the random delay computes smaller delta (+87ms) > new packet will go out in first. > > This was done for compatibility with NISTnet, so research that wanted to reproduce > NISTnet results could use netem. > I've decided to withdraw this all, but I hope these explanations should be useful for me (to be more careful around here) in the future. Thanks, Jarek P. ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 05/14] sch_tbf: Use ->requeue queue instead of ops. [not found] <fe92ba9380e7da89b674cc58fcb5bc1dae69e0c6.1223973003.git.jarkao2@gmail.com> ` (3 preceding siblings ...) 2008-10-14 9:53 ` [PATCH 04/14] sch_netem: Use requeue list instead of ops->requeue() Jarek Poplawski @ 2008-10-14 9:54 ` Jarek Poplawski 2008-10-14 9:54 ` [PATCH 06/14] sch_atm: " Jarek Poplawski ` (8 subsequent siblings) 13 siblings, 0 replies; 17+ messages in thread From: Jarek Poplawski @ 2008-10-14 9:54 UTC (permalink / raw) To: David Miller; +Cc: netdev -------- Original Message -------- Subject: [PATCH 6/9]: sch_tbf: Use ->requeue queue instead of ops. Date: Mon, 18 Aug 2008 01:37:08 -0700 (PDT) From: David Miller <davem@davemloft.net> ---------------------> From: David Miller <davem@davemloft.net> sch_tbf: Use ->requeue queue instead of ops. Signed-off-by: Jarek Poplawski <jarkao2@gmail.com> --- net/sched/sch_tbf.c | 7 +------ 1 files changed, 1 insertions(+), 6 deletions(-) diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c index a99529d..e98aeb9 100644 --- a/net/sched/sch_tbf.c +++ b/net/sched/sch_tbf.c @@ -214,12 +214,7 @@ 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++; - } - + __skb_queue_tail(&q->qdisc->requeue, skb); sch->qstats.overlimits++; } return NULL; -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 06/14] sch_atm: Use ->requeue queue instead of ops. [not found] <fe92ba9380e7da89b674cc58fcb5bc1dae69e0c6.1223973003.git.jarkao2@gmail.com> ` (4 preceding siblings ...) 2008-10-14 9:54 ` [PATCH 05/14] sch_tbf: Use ->requeue queue instead of ops Jarek Poplawski @ 2008-10-14 9:54 ` Jarek Poplawski 2008-10-14 9:54 ` [PATCH 07/14] sch_hfsc: " Jarek Poplawski ` (7 subsequent siblings) 13 siblings, 0 replies; 17+ messages in thread From: Jarek Poplawski @ 2008-10-14 9:54 UTC (permalink / raw) To: David Miller; +Cc: netdev -------- Original Message -------- Subject: [PATCH 7/9]: sch_atm: Use ->requeue queue instead of ops. Date: Mon, 18 Aug 2008 01:37:12 -0700 (PDT) From: David Miller <davem@davemloft.net> -------------------> From: David Miller <davem@davemloft.net> sch_atm: Use ->requeue queue instead of ops. Signed-off-by: Jarek Poplawski <jarkao2@gmail.com> --- net/sched/sch_atm.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/net/sched/sch_atm.c b/net/sched/sch_atm.c index ca3467b..c8bc5fc 100644 --- a/net/sched/sch_atm.c +++ b/net/sched/sch_atm.c @@ -482,7 +482,7 @@ static void sch_atm_dequeue(unsigned long data) */ while ((skb = qdisc_dequeue(flow->q))) { if (!atm_may_send(flow->vcc, skb->truesize)) { - (void)flow->q->ops->requeue(skb, flow->q); + __skb_queue_tail(&flow->q->requeue, skb); break; } pr_debug("atm_tc_dequeue: sending on class %p\n", flow); -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 07/14] sch_hfsc: Use ->requeue queue instead of ops. [not found] <fe92ba9380e7da89b674cc58fcb5bc1dae69e0c6.1223973003.git.jarkao2@gmail.com> ` (5 preceding siblings ...) 2008-10-14 9:54 ` [PATCH 06/14] sch_atm: " Jarek Poplawski @ 2008-10-14 9:54 ` Jarek Poplawski 2008-10-14 9:54 ` [PATCH 08/14] pkt_sched: Kill qdisc->ops->requeue() Jarek Poplawski ` (6 subsequent siblings) 13 siblings, 0 replies; 17+ messages in thread From: Jarek Poplawski @ 2008-10-14 9:54 UTC (permalink / raw) To: David Miller; +Cc: netdev -------- Original Message -------- Subject: [PATCH 8/9]: sch_hfsc: Use ->requeue queue instead of ops. Date: Mon, 18 Aug 2008 01:37:15 -0700 (PDT) From: David Miller <davem@davemloft.net> ------------------> From: David Miller <davem@davemloft.net> sch_hfsc: Use ->requeue queue instead of ops. In fact this "peek head SKB for len" sequence could be optimized even further. Signed-off-by: Jarek Poplawski <jarkao2@gmail.com> --- net/sched/sch_hfsc.c | 7 +------ 1 files changed, 1 insertions(+), 6 deletions(-) diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c index 67aa3ea..87da751 100644 --- a/net/sched/sch_hfsc.c +++ b/net/sched/sch_hfsc.c @@ -896,12 +896,7 @@ qdisc_peek_len(struct Qdisc *sch) 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; - } + __skb_queue_head(&sch->requeue, skb); return len; } -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 08/14] pkt_sched: Kill qdisc->ops->requeue(). [not found] <fe92ba9380e7da89b674cc58fcb5bc1dae69e0c6.1223973003.git.jarkao2@gmail.com> ` (6 preceding siblings ...) 2008-10-14 9:54 ` [PATCH 07/14] sch_hfsc: " Jarek Poplawski @ 2008-10-14 9:54 ` Jarek Poplawski 2008-10-14 9:54 ` [PATCH 09/14] pkt_sched: Kill qdisc->ops->requeue() in sch_atm and sch_multiq Jarek Poplawski ` (5 subsequent siblings) 13 siblings, 0 replies; 17+ messages in thread From: Jarek Poplawski @ 2008-10-14 9:54 UTC (permalink / raw) To: David Miller; +Cc: netdev -------- Original Message -------- Subject: [PATCH 9/9]: pkt_sched: Kill qdisc->ops->requeue(). Date: Mon, 18 Aug 2008 01:37:18 -0700 (PDT) From: David Miller <davem@davemloft.net> -------------------> From: David Miller <davem@davemloft.net> pkt_sched: Kill qdisc->ops->requeue(). It is only used by the qdisc->ops->requeue implementations themselves. Signed-off-by: Jarek Poplawski <jarkao2@gmail.com> --- include/net/sch_generic.h | 16 ----------- net/sched/sch_api.c | 7 ----- net/sched/sch_cbq.c | 35 ------------------------ net/sched/sch_dsmark.c | 21 -------------- net/sched/sch_fifo.c | 2 - net/sched/sch_generic.c | 18 ------------ net/sched/sch_gred.c | 21 -------------- net/sched/sch_hfsc.c | 12 -------- net/sched/sch_htb.c | 42 ---------------------------- net/sched/sch_netem.c | 16 ----------- net/sched/sch_prio.c | 29 ------------------- net/sched/sch_red.c | 18 ------------ net/sched/sch_sfq.c | 66 --------------------------------------------- net/sched/sch_tbf.c | 14 --------- net/sched/sch_teql.c | 11 ------- 15 files changed, 0 insertions(+), 328 deletions(-) diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h index 00c1309..f3f0b0b 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h @@ -111,7 +111,6 @@ struct Qdisc_ops int (*enqueue)(struct sk_buff *, struct Qdisc *); struct sk_buff * (*dequeue)(struct Qdisc *); - int (*requeue)(struct sk_buff *, struct Qdisc *); unsigned int (*drop)(struct Qdisc *); int (*init)(struct Qdisc *, struct nlattr *arg); @@ -440,21 +439,6 @@ static inline struct sk_buff *qdisc_dequeue_tail(struct Qdisc *sch) return __qdisc_dequeue_tail(sch, &sch->q); } -static inline int __qdisc_requeue(struct sk_buff *skb, struct Qdisc *sch, - struct sk_buff_head *list) -{ - __skb_queue_head(list, skb); - sch->qstats.backlog += qdisc_pkt_len(skb); - sch->qstats.requeues++; - - return NET_XMIT_SUCCESS; -} - -static inline int qdisc_requeue(struct sk_buff *skb, struct Qdisc *sch) -{ - return __qdisc_requeue(skb, sch, &sch->q); -} - static inline void __qdisc_reset_queue(struct Qdisc *sch, struct sk_buff_head *list) { diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index 1122c95..ff58852 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c @@ -97,11 +97,6 @@ static int tclass_notify(struct sk_buff *oskb, struct nlmsghdr *n, Auxiliary routines: - ---requeue - - requeues once dequeued packet. It is used for non-standard or - just buggy devices, which can defer output even if netif_queue_stopped()=0. - ---reset returns qdisc to initial state: purge all buffers, clear all @@ -147,8 +142,6 @@ int register_qdisc(struct Qdisc_ops *qops) if (qops->enqueue == NULL) qops->enqueue = noop_qdisc_ops.enqueue; - if (qops->requeue == NULL) - qops->requeue = noop_qdisc_ops.requeue; if (qops->dequeue == NULL) qops->dequeue = noop_qdisc_ops.dequeue; diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c index c68e09c..8e0e7b2 100644 --- a/net/sched/sch_cbq.c +++ b/net/sched/sch_cbq.c @@ -405,40 +405,6 @@ cbq_enqueue(struct sk_buff *skb, struct Qdisc *sch) return ret; } -static int -cbq_requeue(struct sk_buff *skb, struct Qdisc *sch) -{ - struct cbq_sched_data *q = qdisc_priv(sch); - struct cbq_class *cl; - int ret; - - if ((cl = q->tx_class) == NULL) { - kfree_skb(skb); - sch->qstats.drops++; - return NET_XMIT_CN; - } - q->tx_class = NULL; - - cbq_mark_toplevel(q, cl); - -#ifdef CONFIG_NET_CLS_ACT - q->rx_class = cl; - cl->q->__parent = sch; -#endif - if ((ret = cl->q->ops->requeue(skb, cl->q)) == 0) { - sch->q.qlen++; - sch->qstats.requeues++; - if (!cl->next_alive) - cbq_activate_class(cl); - return 0; - } - if (net_xmit_drop_count(ret)) { - sch->qstats.drops++; - cl->qstats.drops++; - } - return ret; -} - /* Overlimit actions */ /* TC_CBQ_OVL_CLASSIC: (default) penalize leaf class by adding offtime */ @@ -2065,7 +2031,6 @@ static struct Qdisc_ops cbq_qdisc_ops __read_mostly = { .priv_size = sizeof(struct cbq_sched_data), .enqueue = cbq_enqueue, .dequeue = cbq_dequeue, - .requeue = cbq_requeue, .drop = cbq_drop, .init = cbq_init, .reset = cbq_reset, diff --git a/net/sched/sch_dsmark.c b/net/sched/sch_dsmark.c index c29e9c2..0768b41 100644 --- a/net/sched/sch_dsmark.c +++ b/net/sched/sch_dsmark.c @@ -313,26 +313,6 @@ static struct sk_buff *dsmark_dequeue(struct Qdisc *sch) return skb; } -static int dsmark_requeue(struct sk_buff *skb, struct Qdisc *sch) -{ - struct dsmark_qdisc_data *p = qdisc_priv(sch); - int err; - - pr_debug("dsmark_requeue(skb %p,sch %p,[qdisc %p])\n", skb, sch, p); - - err = p->q->ops->requeue(skb, p->q); - if (err != NET_XMIT_SUCCESS) { - if (net_xmit_drop_count(err)) - sch->qstats.drops++; - return err; - } - - sch->q.qlen++; - sch->qstats.requeues++; - - return NET_XMIT_SUCCESS; -} - static unsigned int dsmark_drop(struct Qdisc *sch) { struct dsmark_qdisc_data *p = qdisc_priv(sch); @@ -496,7 +476,6 @@ static struct Qdisc_ops dsmark_qdisc_ops __read_mostly = { .priv_size = sizeof(struct dsmark_qdisc_data), .enqueue = dsmark_enqueue, .dequeue = dsmark_dequeue, - .requeue = dsmark_requeue, .drop = dsmark_drop, .init = dsmark_init, .reset = dsmark_reset, diff --git a/net/sched/sch_fifo.c b/net/sched/sch_fifo.c index 23d258b..3114508 100644 --- a/net/sched/sch_fifo.c +++ b/net/sched/sch_fifo.c @@ -83,7 +83,6 @@ struct Qdisc_ops pfifo_qdisc_ops __read_mostly = { .priv_size = sizeof(struct fifo_sched_data), .enqueue = pfifo_enqueue, .dequeue = qdisc_dequeue_head, - .requeue = qdisc_requeue, .drop = qdisc_queue_drop, .init = fifo_init, .reset = qdisc_reset_queue, @@ -98,7 +97,6 @@ struct Qdisc_ops bfifo_qdisc_ops __read_mostly = { .priv_size = sizeof(struct fifo_sched_data), .enqueue = bfifo_enqueue, .dequeue = qdisc_dequeue_head, - .requeue = qdisc_requeue, .drop = qdisc_queue_drop, .init = fifo_init, .reset = qdisc_reset_queue, diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index 6730bac..9560ea1 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c @@ -306,21 +306,11 @@ static struct sk_buff *noop_dequeue(struct Qdisc * qdisc) return NULL; } -static int noop_requeue(struct sk_buff *skb, struct Qdisc* qdisc) -{ - if (net_ratelimit()) - printk(KERN_DEBUG "%s deferred output. It is buggy.\n", - skb->dev->name); - kfree_skb(skb); - return NET_XMIT_CN; -} - struct Qdisc_ops noop_qdisc_ops __read_mostly = { .id = "noop", .priv_size = 0, .enqueue = noop_enqueue, .dequeue = noop_dequeue, - .requeue = noop_requeue, .owner = THIS_MODULE, }; @@ -345,7 +335,6 @@ static struct Qdisc_ops noqueue_qdisc_ops __read_mostly = { .priv_size = 0, .enqueue = noop_enqueue, .dequeue = noop_dequeue, - .requeue = noop_requeue, .owner = THIS_MODULE, }; @@ -409,12 +398,6 @@ static struct sk_buff *pfifo_fast_dequeue(struct Qdisc* qdisc) return NULL; } -static int pfifo_fast_requeue(struct sk_buff *skb, struct Qdisc* qdisc) -{ - qdisc->q.qlen++; - return __qdisc_requeue(skb, qdisc, prio2list(skb, qdisc)); -} - static void pfifo_fast_reset(struct Qdisc* qdisc) { int prio; @@ -455,7 +438,6 @@ static struct Qdisc_ops pfifo_fast_ops __read_mostly = { .priv_size = PFIFO_FAST_BANDS * sizeof(struct sk_buff_head), .enqueue = pfifo_fast_enqueue, .dequeue = pfifo_fast_dequeue, - .requeue = pfifo_fast_requeue, .init = pfifo_fast_init, .reset = pfifo_fast_reset, .dump = pfifo_fast_dump, diff --git a/net/sched/sch_gred.c b/net/sched/sch_gred.c index c1ad6b8..8259796 100644 --- a/net/sched/sch_gred.c +++ b/net/sched/sch_gred.c @@ -240,26 +240,6 @@ congestion_drop: return NET_XMIT_CN; } -static int gred_requeue(struct sk_buff *skb, struct Qdisc* sch) -{ - struct gred_sched *t = qdisc_priv(sch); - struct gred_sched_data *q; - u16 dp = tc_index_to_dp(skb); - - if (dp >= t->DPs || (q = t->tab[dp]) == NULL) { - if (net_ratelimit()) - printk(KERN_WARNING "GRED: Unable to relocate VQ 0x%x " - "for requeue, screwing up backlog.\n", - tc_index_to_dp(skb)); - } else { - if (red_is_idling(&q->parms)) - red_end_of_idle_period(&q->parms); - q->backlog += qdisc_pkt_len(skb); - } - - return qdisc_requeue(skb, sch); -} - static struct sk_buff *gred_dequeue(struct Qdisc* sch) { struct sk_buff *skb; @@ -602,7 +582,6 @@ static struct Qdisc_ops gred_qdisc_ops __read_mostly = { .priv_size = sizeof(struct gred_sched), .enqueue = gred_enqueue, .dequeue = gred_dequeue, - .requeue = gred_requeue, .drop = gred_drop, .init = gred_init, .reset = gred_reset, diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c index 87da751..5598e73 100644 --- a/net/sched/sch_hfsc.c +++ b/net/sched/sch_hfsc.c @@ -1669,17 +1669,6 @@ hfsc_dequeue(struct Qdisc *sch) return skb; } -static int -hfsc_requeue(struct sk_buff *skb, struct Qdisc *sch) -{ - struct hfsc_sched *q = qdisc_priv(sch); - - __skb_queue_head(&q->requeue, skb); - sch->q.qlen++; - sch->qstats.requeues++; - return NET_XMIT_SUCCESS; -} - static unsigned int hfsc_drop(struct Qdisc *sch) { @@ -1730,7 +1719,6 @@ static struct Qdisc_ops hfsc_qdisc_ops __read_mostly = { .dump = hfsc_dump_qdisc, .enqueue = hfsc_enqueue, .dequeue = hfsc_dequeue, - .requeue = hfsc_requeue, .drop = hfsc_drop, .cl_ops = &hfsc_class_ops, .priv_size = sizeof(struct hfsc_sched), diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c index 34c0caf..b2f9e96 100644 --- a/net/sched/sch_htb.c +++ b/net/sched/sch_htb.c @@ -591,47 +591,6 @@ static int htb_enqueue(struct sk_buff *skb, struct Qdisc *sch) return NET_XMIT_SUCCESS; } -/* TODO: requeuing packet charges it to policers again !! */ -static int htb_requeue(struct sk_buff *skb, struct Qdisc *sch) -{ - int ret; - struct htb_sched *q = qdisc_priv(sch); - struct htb_class *cl = htb_classify(skb, sch, &ret); - struct sk_buff *tskb; - - if (cl == HTB_DIRECT) { - /* enqueue to helper queue */ - if (q->direct_queue.qlen < q->direct_qlen) { - __skb_queue_head(&q->direct_queue, skb); - } else { - __skb_queue_head(&q->direct_queue, skb); - tskb = __skb_dequeue_tail(&q->direct_queue); - kfree_skb(tskb); - sch->qstats.drops++; - return NET_XMIT_CN; - } -#ifdef CONFIG_NET_CLS_ACT - } else if (!cl) { - if (ret & __NET_XMIT_BYPASS) - sch->qstats.drops++; - kfree_skb(skb); - return ret; -#endif - } else if ((ret = cl->un.leaf.q->ops->requeue(skb, cl->un.leaf.q)) != - NET_XMIT_SUCCESS) { - if (net_xmit_drop_count(ret)) { - sch->qstats.drops++; - cl->qstats.drops++; - } - return ret; - } else - htb_activate(q, cl); - - sch->q.qlen++; - sch->qstats.requeues++; - return NET_XMIT_SUCCESS; -} - /** * htb_charge_class - charges amount "bytes" to leaf and ancestors * @@ -1565,7 +1524,6 @@ static struct Qdisc_ops htb_qdisc_ops __read_mostly = { .priv_size = sizeof(struct htb_sched), .enqueue = htb_enqueue, .dequeue = htb_dequeue, - .requeue = htb_requeue, .drop = htb_drop, .init = htb_init, .reset = htb_reset, diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c index 5ca92d9..17d161b 100644 --- a/net/sched/sch_netem.c +++ b/net/sched/sch_netem.c @@ -249,20 +249,6 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) return ret; } -/* Requeue packets but don't change time stamp */ -static int netem_requeue(struct sk_buff *skb, struct Qdisc *sch) -{ - struct netem_sched_data *q = qdisc_priv(sch); - int ret; - - if ((ret = q->qdisc->ops->requeue(skb, q->qdisc)) == 0) { - sch->q.qlen++; - sch->qstats.requeues++; - } - - return ret; -} - static unsigned int netem_drop(struct Qdisc* sch) { struct netem_sched_data *q = qdisc_priv(sch); @@ -536,7 +522,6 @@ static struct Qdisc_ops tfifo_qdisc_ops __read_mostly = { .priv_size = sizeof(struct fifo_sched_data), .enqueue = tfifo_enqueue, .dequeue = qdisc_dequeue_head, - .requeue = qdisc_requeue, .drop = qdisc_queue_drop, .init = tfifo_init, .reset = qdisc_reset_queue, @@ -711,7 +696,6 @@ static struct Qdisc_ops netem_qdisc_ops __read_mostly = { .priv_size = sizeof(struct netem_sched_data), .enqueue = netem_enqueue, .dequeue = netem_dequeue, - .requeue = netem_requeue, .drop = netem_drop, .init = netem_init, .reset = netem_reset, diff --git a/net/sched/sch_prio.c b/net/sched/sch_prio.c index d527732..657203b 100644 --- a/net/sched/sch_prio.c +++ b/net/sched/sch_prio.c @@ -93,34 +93,6 @@ prio_enqueue(struct sk_buff *skb, struct Qdisc *sch) return ret; } - -static int -prio_requeue(struct sk_buff *skb, struct Qdisc* sch) -{ - struct Qdisc *qdisc; - int ret; - - qdisc = prio_classify(skb, sch, &ret); -#ifdef CONFIG_NET_CLS_ACT - if (qdisc == NULL) { - if (ret & __NET_XMIT_BYPASS) - sch->qstats.drops++; - kfree_skb(skb); - return ret; - } -#endif - - if ((ret = qdisc->ops->requeue(skb, qdisc)) == NET_XMIT_SUCCESS) { - sch->q.qlen++; - sch->qstats.requeues++; - return NET_XMIT_SUCCESS; - } - if (net_xmit_drop_count(ret)) - sch->qstats.drops++; - return ret; -} - - static struct sk_buff *prio_dequeue(struct Qdisc* sch) { struct prio_sched_data *q = qdisc_priv(sch); @@ -421,7 +393,6 @@ static struct Qdisc_ops prio_qdisc_ops __read_mostly = { .priv_size = sizeof(struct prio_sched_data), .enqueue = prio_enqueue, .dequeue = prio_dequeue, - .requeue = prio_requeue, .drop = prio_drop, .init = prio_init, .reset = prio_reset, diff --git a/net/sched/sch_red.c b/net/sched/sch_red.c index 3709720..31a556d 100644 --- a/net/sched/sch_red.c +++ b/net/sched/sch_red.c @@ -108,23 +108,6 @@ congestion_drop: return NET_XMIT_CN; } -static int red_requeue(struct sk_buff *skb, struct Qdisc* sch) -{ - struct red_sched_data *q = qdisc_priv(sch); - struct Qdisc *child = q->qdisc; - int ret; - - if (red_is_idling(&q->parms)) - red_end_of_idle_period(&q->parms); - - ret = child->ops->requeue(skb, child); - if (likely(ret == NET_XMIT_SUCCESS)) { - sch->qstats.requeues++; - sch->q.qlen++; - } - return ret; -} - static struct sk_buff * red_dequeue(struct Qdisc* sch) { struct sk_buff *skb; @@ -361,7 +344,6 @@ static struct Qdisc_ops red_qdisc_ops __read_mostly = { .cl_ops = &red_class_ops, .enqueue = red_enqueue, .dequeue = red_dequeue, - .requeue = red_requeue, .drop = red_drop, .init = red_init, .reset = red_reset, diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c index fe1508e..a795cb2 100644 --- a/net/sched/sch_sfq.c +++ b/net/sched/sch_sfq.c @@ -329,71 +329,6 @@ sfq_enqueue(struct sk_buff *skb, struct Qdisc *sch) return NET_XMIT_CN; } -static int -sfq_requeue(struct sk_buff *skb, struct Qdisc *sch) -{ - struct sfq_sched_data *q = qdisc_priv(sch); - unsigned int hash; - sfq_index x; - int ret; - - hash = sfq_classify(skb, sch, &ret); - if (hash == 0) { - if (ret & __NET_XMIT_BYPASS) - sch->qstats.drops++; - kfree_skb(skb); - return ret; - } - hash--; - - x = q->ht[hash]; - if (x == SFQ_DEPTH) { - q->ht[hash] = x = q->dep[SFQ_DEPTH].next; - q->hash[x] = hash; - } - - sch->qstats.backlog += qdisc_pkt_len(skb); - __skb_queue_head(&q->qs[x], skb); - /* If selected queue has length q->limit+1, this means that - * all another queues are empty and we do simple tail drop. - * This packet is still requeued at head of queue, tail packet - * is dropped. - */ - if (q->qs[x].qlen > q->limit) { - skb = q->qs[x].prev; - __skb_unlink(skb, &q->qs[x]); - sch->qstats.drops++; - sch->qstats.backlog -= qdisc_pkt_len(skb); - kfree_skb(skb); - return NET_XMIT_CN; - } - - sfq_inc(q, x); - if (q->qs[x].qlen == 1) { /* The flow is new */ - if (q->tail == SFQ_DEPTH) { /* It is the first flow */ - q->tail = x; - q->next[x] = x; - q->allot[x] = q->quantum; - } else { - q->next[x] = q->next[q->tail]; - q->next[q->tail] = x; - q->tail = x; - } - } - - if (++sch->q.qlen <= q->limit) { - sch->qstats.requeues++; - return 0; - } - - sch->qstats.drops++; - sfq_drop(sch); - return NET_XMIT_CN; -} - - - - static struct sk_buff * sfq_dequeue(struct Qdisc *sch) { @@ -624,7 +559,6 @@ static struct Qdisc_ops sfq_qdisc_ops __read_mostly = { .priv_size = sizeof(struct sfq_sched_data), .enqueue = sfq_enqueue, .dequeue = sfq_dequeue, - .requeue = sfq_requeue, .drop = sfq_drop, .init = sfq_init, .reset = sfq_reset, diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c index e98aeb9..708e1eb 100644 --- a/net/sched/sch_tbf.c +++ b/net/sched/sch_tbf.c @@ -139,19 +139,6 @@ static int tbf_enqueue(struct sk_buff *skb, struct Qdisc* sch) return 0; } -static int tbf_requeue(struct sk_buff *skb, struct Qdisc* sch) -{ - struct tbf_sched_data *q = qdisc_priv(sch); - int ret; - - if ((ret = q->qdisc->ops->requeue(skb, q->qdisc)) == 0) { - sch->q.qlen++; - sch->qstats.requeues++; - } - - return ret; -} - static unsigned int tbf_drop(struct Qdisc* sch) { struct tbf_sched_data *q = qdisc_priv(sch); @@ -464,7 +451,6 @@ static struct Qdisc_ops tbf_qdisc_ops __read_mostly = { .priv_size = sizeof(struct tbf_sched_data), .enqueue = tbf_enqueue, .dequeue = tbf_dequeue, - .requeue = tbf_requeue, .drop = tbf_drop, .init = tbf_init, .reset = tbf_reset, diff --git a/net/sched/sch_teql.c b/net/sched/sch_teql.c index d35ef05..b3dcda3 100644 --- a/net/sched/sch_teql.c +++ b/net/sched/sch_teql.c @@ -93,16 +93,6 @@ teql_enqueue(struct sk_buff *skb, struct Qdisc* sch) return NET_XMIT_DROP; } -static int -teql_requeue(struct sk_buff *skb, struct Qdisc* sch) -{ - struct teql_sched_data *q = qdisc_priv(sch); - - __skb_queue_head(&q->q, skb); - sch->qstats.requeues++; - return 0; -} - static struct sk_buff * teql_dequeue(struct Qdisc* sch) { @@ -433,7 +423,6 @@ static __init void teql_master_setup(struct net_device *dev) ops->enqueue = teql_enqueue; ops->dequeue = teql_dequeue; - ops->requeue = teql_requeue; ops->init = teql_qdisc_init; ops->reset = teql_reset; ops->destroy = teql_destroy; -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 09/14] pkt_sched: Kill qdisc->ops->requeue() in sch_atm and sch_multiq. [not found] <fe92ba9380e7da89b674cc58fcb5bc1dae69e0c6.1223973003.git.jarkao2@gmail.com> ` (7 preceding siblings ...) 2008-10-14 9:54 ` [PATCH 08/14] pkt_sched: Kill qdisc->ops->requeue() Jarek Poplawski @ 2008-10-14 9:54 ` Jarek Poplawski 2008-10-14 9:55 ` [PATCH 10/14] pkt_sched: Redo qdisc_dequeue() and bring back qdisc_requeue() Jarek Poplawski ` (4 subsequent siblings) 13 siblings, 0 replies; 17+ messages in thread From: Jarek Poplawski @ 2008-10-14 9:54 UTC (permalink / raw) To: David Miller; +Cc: netdev It is only used by the qdisc->ops->requeue implementations themselves. Signed-off-by: Jarek Poplawski <jarkao2@gmail.com> --- net/sched/sch_atm.c | 18 ------------------ net/sched/sch_multiq.c | 36 +----------------------------------- 2 files changed, 1 insertions(+), 53 deletions(-) diff --git a/net/sched/sch_atm.c b/net/sched/sch_atm.c index c8bc5fc..7a34e3e 100644 --- a/net/sched/sch_atm.c +++ b/net/sched/sch_atm.c @@ -522,23 +522,6 @@ static struct sk_buff *atm_tc_dequeue(struct Qdisc *sch) return skb; } -static int atm_tc_requeue(struct sk_buff *skb, struct Qdisc *sch) -{ - struct atm_qdisc_data *p = qdisc_priv(sch); - int ret; - - pr_debug("atm_tc_requeue(skb %p,sch %p,[qdisc %p])\n", skb, sch, p); - ret = p->link.q->ops->requeue(skb, p->link.q); - if (!ret) { - sch->q.qlen++; - sch->qstats.requeues++; - } else if (net_xmit_drop_count(ret)) { - sch->qstats.drops++; - p->link.qstats.drops++; - } - return ret; -} - static unsigned int atm_tc_drop(struct Qdisc *sch) { struct atm_qdisc_data *p = qdisc_priv(sch); @@ -694,7 +677,6 @@ static struct Qdisc_ops atm_qdisc_ops __read_mostly = { .priv_size = sizeof(struct atm_qdisc_data), .enqueue = atm_tc_enqueue, .dequeue = atm_tc_dequeue, - .requeue = atm_tc_requeue, .drop = atm_tc_drop, .init = atm_tc_init, .reset = atm_tc_reset, diff --git a/net/sched/sch_multiq.c b/net/sched/sch_multiq.c index df1857a..cf34f67 100644 --- a/net/sched/sch_multiq.c +++ b/net/sched/sch_multiq.c @@ -93,39 +93,6 @@ multiq_enqueue(struct sk_buff *skb, struct Qdisc *sch) } -static int -multiq_requeue(struct sk_buff *skb, struct Qdisc *sch) -{ - struct Qdisc *qdisc; - struct multiq_sched_data *q = qdisc_priv(sch); - int ret; - - qdisc = multiq_classify(skb, sch, &ret); -#ifdef CONFIG_NET_CLS_ACT - if (qdisc == NULL) { - if (ret & __NET_XMIT_BYPASS) - sch->qstats.drops++; - kfree_skb(skb); - return ret; - } -#endif - - ret = qdisc->ops->requeue(skb, qdisc); - if (ret == NET_XMIT_SUCCESS) { - sch->q.qlen++; - sch->qstats.requeues++; - if (q->curband) - q->curband--; - else - q->curband = q->bands - 1; - return NET_XMIT_SUCCESS; - } - if (net_xmit_drop_count(ret)) - sch->qstats.drops++; - return ret; -} - - static struct sk_buff *multiq_dequeue(struct Qdisc *sch) { struct multiq_sched_data *q = qdisc_priv(sch); @@ -140,7 +107,7 @@ static struct sk_buff *multiq_dequeue(struct Qdisc *sch) q->curband = 0; /* Check that target subqueue is available before - * pulling an skb to avoid excessive requeues + * pulling an skb to avoid head-of-line blocking. */ if (!__netif_subqueue_stopped(qdisc_dev(sch), q->curband)) { qdisc = q->queues[q->curband]; @@ -451,7 +418,6 @@ static struct Qdisc_ops multiq_qdisc_ops __read_mostly = { .priv_size = sizeof(struct multiq_sched_data), .enqueue = multiq_enqueue, .dequeue = multiq_dequeue, - .requeue = multiq_requeue, .drop = multiq_drop, .init = multiq_init, .reset = multiq_reset, -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 10/14] pkt_sched: Redo qdisc_dequeue() and bring back qdisc_requeue(). [not found] <fe92ba9380e7da89b674cc58fcb5bc1dae69e0c6.1223973003.git.jarkao2@gmail.com> ` (8 preceding siblings ...) 2008-10-14 9:54 ` [PATCH 09/14] pkt_sched: Kill qdisc->ops->requeue() in sch_atm and sch_multiq Jarek Poplawski @ 2008-10-14 9:55 ` Jarek Poplawski 2008-10-14 9:55 ` [PATCH 11/14] pkt_sched: Use qdisc_requeue() wrapper instead of open-coding Jarek Poplawski ` (3 subsequent siblings) 13 siblings, 0 replies; 17+ messages in thread From: Jarek Poplawski @ 2008-10-14 9:55 UTC (permalink / raw) To: David Miller; +Cc: netdev Use __qdisc_dequeue_head() and update sch->q.qlen in qdisc_dequeue(). Bring back qdisc_requeue() wrapper to raplace open-coded uses of sch->requeue. Signed-off-by: Jarek Poplawski <jarkao2@gmail.com> --- include/net/sch_generic.h | 29 +++++++++++++++++++++-------- 1 files changed, 21 insertions(+), 8 deletions(-) diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h index f3f0b0b..78c38a4 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h @@ -368,14 +368,6 @@ enum net_xmit_qdisc_t { #define net_xmit_drop_count(e) (1) #endif -static inline struct sk_buff *qdisc_dequeue(struct Qdisc *sch) -{ - struct sk_buff *skb = __skb_dequeue(&sch->requeue); - if (!skb) - skb = sch->dequeue(sch); - return skb; -} - static inline int qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch) { #ifdef CONFIG_NET_SCHED @@ -439,6 +431,26 @@ static inline struct sk_buff *qdisc_dequeue_tail(struct Qdisc *sch) return __qdisc_dequeue_tail(sch, &sch->q); } +static inline struct sk_buff *qdisc_dequeue(struct Qdisc *sch) +{ + struct sk_buff *skb = __qdisc_dequeue_head(sch, &sch->requeue); + + if (unlikely(skb)) + sch->q.qlen--; + else + skb = sch->dequeue(sch); + + return skb; +} + +static inline void qdisc_requeue(struct Qdisc *sch, struct sk_buff *skb) +{ + __skb_queue_head(&sch->requeue, skb); + sch->qstats.backlog += qdisc_pkt_len(skb); + sch->qstats.requeues++; + sch->q.qlen++; +} + static inline void __qdisc_reset_queue(struct Qdisc *sch, struct sk_buff_head *list) { @@ -452,6 +464,7 @@ static inline void __qdisc_reset_queue(struct Qdisc *sch, static inline void qdisc_reset_queue(struct Qdisc *sch) { __qdisc_reset_queue(sch, &sch->q); + __qdisc_reset_queue(sch, &sch->requeue); sch->qstats.backlog = 0; } -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 11/14] pkt_sched: Use qdisc_requeue() wrapper instead of open-coding. [not found] <fe92ba9380e7da89b674cc58fcb5bc1dae69e0c6.1223973003.git.jarkao2@gmail.com> ` (9 preceding siblings ...) 2008-10-14 9:55 ` [PATCH 10/14] pkt_sched: Redo qdisc_dequeue() and bring back qdisc_requeue() Jarek Poplawski @ 2008-10-14 9:55 ` Jarek Poplawski 2008-10-14 9:55 ` [PATCH 12/14] sch_htb: Fix a compiler warning in htb_enqueue() Jarek Poplawski ` (2 subsequent siblings) 13 siblings, 0 replies; 17+ messages in thread From: Jarek Poplawski @ 2008-10-14 9:55 UTC (permalink / raw) To: David Miller; +Cc: netdev Replace __skb_queue_head() and __skb_queue_tail() to sch->requeue list with qdisc_requeue(). This change adds btw. updates of sch->q.qlen and other stats, and uses __skb_queue_head() everywhere, which is proper replacement for qdisc->ops->requeue() previously used here. Signed-off-by: Jarek Poplawski <jarkao2@gmail.com> --- net/sched/sch_atm.c | 2 +- net/sched/sch_hfsc.c | 2 +- net/sched/sch_netem.c | 4 ++-- net/sched/sch_tbf.c | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/net/sched/sch_atm.c b/net/sched/sch_atm.c index 7a34e3e..7f9e884 100644 --- a/net/sched/sch_atm.c +++ b/net/sched/sch_atm.c @@ -482,7 +482,7 @@ static void sch_atm_dequeue(unsigned long data) */ while ((skb = qdisc_dequeue(flow->q))) { if (!atm_may_send(flow->vcc, skb->truesize)) { - __skb_queue_tail(&flow->q->requeue, skb); + qdisc_requeue(flow->q, skb); break; } pr_debug("atm_tc_dequeue: sending on class %p\n", flow); diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c index 5598e73..53153ba 100644 --- a/net/sched/sch_hfsc.c +++ b/net/sched/sch_hfsc.c @@ -896,7 +896,7 @@ qdisc_peek_len(struct Qdisc *sch) return 0; } len = qdisc_pkt_len(skb); - __skb_queue_head(&sch->requeue, skb); + qdisc_requeue(sch, skb); return len; } diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c index 17d161b..0fc86b7 100644 --- a/net/sched/sch_netem.c +++ b/net/sched/sch_netem.c @@ -233,7 +233,7 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) */ cb->time_to_send = psched_get_time(); q->counter = 0; - __skb_queue_tail(&q->qdisc->requeue, skb); + qdisc_requeue(q->qdisc, skb); ret = NET_XMIT_SUCCESS; } @@ -282,7 +282,7 @@ static struct sk_buff *netem_dequeue(struct Qdisc *sch) return skb; } - __skb_queue_tail(&q->qdisc->requeue, skb); + qdisc_requeue(q->qdisc, skb); qdisc_watchdog_schedule(&q->watchdog, cb->time_to_send); } diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c index 708e1eb..9f1a9ce 100644 --- a/net/sched/sch_tbf.c +++ b/net/sched/sch_tbf.c @@ -201,7 +201,7 @@ static struct sk_buff *tbf_dequeue(struct Qdisc* sch) (cf. CSZ, HPFQ, HFSC) */ - __skb_queue_tail(&q->qdisc->requeue, skb); + qdisc_requeue(q->qdisc, skb); sch->qstats.overlimits++; } return NULL; -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 12/14] sch_htb: Fix a compiler warning in htb_enqueue(). [not found] <fe92ba9380e7da89b674cc58fcb5bc1dae69e0c6.1223973003.git.jarkao2@gmail.com> ` (10 preceding siblings ...) 2008-10-14 9:55 ` [PATCH 11/14] pkt_sched: Use qdisc_requeue() wrapper instead of open-coding Jarek Poplawski @ 2008-10-14 9:55 ` Jarek Poplawski 2008-10-14 9:55 ` [PATCH 13/14] sch_hfsc: Remove remains of the old requeue code Jarek Poplawski 2008-10-14 9:55 ` [PATCH 14/14] pkt_sched: sch_generic: Purge qdisc->requeue list in qdisc_reset() Jarek Poplawski 13 siblings, 0 replies; 17+ messages in thread From: Jarek Poplawski @ 2008-10-14 9:55 UTC (permalink / raw) To: David Miller; +Cc: netdev Use uninitialized_var(ret) in htb_enqueue() to avoid a compiler warning. Signed-off-by: Jarek Poplawski <jarkao2@gmail.com> --- net/sched/sch_htb.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c index b2f9e96..c0c83c8 100644 --- a/net/sched/sch_htb.c +++ b/net/sched/sch_htb.c @@ -551,7 +551,7 @@ static inline void htb_deactivate(struct htb_sched *q, struct htb_class *cl) static int htb_enqueue(struct sk_buff *skb, struct Qdisc *sch) { - int ret; + int uninitialized_var(ret); struct htb_sched *q = qdisc_priv(sch); struct htb_class *cl = htb_classify(skb, sch, &ret); -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 13/14] sch_hfsc: Remove remains of the old requeue code. [not found] <fe92ba9380e7da89b674cc58fcb5bc1dae69e0c6.1223973003.git.jarkao2@gmail.com> ` (11 preceding siblings ...) 2008-10-14 9:55 ` [PATCH 12/14] sch_htb: Fix a compiler warning in htb_enqueue() Jarek Poplawski @ 2008-10-14 9:55 ` Jarek Poplawski 2008-10-14 9:55 ` [PATCH 14/14] pkt_sched: sch_generic: Purge qdisc->requeue list in qdisc_reset() Jarek Poplawski 13 siblings, 0 replies; 17+ messages in thread From: Jarek Poplawski @ 2008-10-14 9:55 UTC (permalink / raw) To: David Miller; +Cc: netdev sch_hfsc: Remove remains of the old requeue code. Signed-off-by: Jarek Poplawski <jarkao2@gmail.com> --- net/sched/sch_hfsc.c | 7 ------- 1 files changed, 0 insertions(+), 7 deletions(-) diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c index 53153ba..6c16741 100644 --- a/net/sched/sch_hfsc.c +++ b/net/sched/sch_hfsc.c @@ -184,7 +184,6 @@ struct hfsc_sched struct rb_root eligible; /* eligible tree */ struct list_head droplist; /* active leaf class list (for dropping) */ - struct sk_buff_head requeue; /* requeued packet */ struct qdisc_watchdog watchdog; /* watchdog timer */ }; @@ -1435,7 +1434,6 @@ hfsc_init_qdisc(struct Qdisc *sch, struct nlattr *opt) return err; q->eligible = RB_ROOT; INIT_LIST_HEAD(&q->droplist); - skb_queue_head_init(&q->requeue); q->root.cl_common.classid = sch->handle; q->root.refcnt = 1; @@ -1520,7 +1518,6 @@ hfsc_reset_qdisc(struct Qdisc *sch) hlist_for_each_entry(cl, n, &q->clhash.hash[i], cl_common.hnode) hfsc_reset_class(cl); } - __skb_queue_purge(&q->requeue); q->eligible = RB_ROOT; INIT_LIST_HEAD(&q->droplist); qdisc_watchdog_cancel(&q->watchdog); @@ -1545,7 +1542,6 @@ hfsc_destroy_qdisc(struct Qdisc *sch) hfsc_destroy_class(sch, cl); } qdisc_class_hash_destroy(&q->clhash); - __skb_queue_purge(&q->requeue); qdisc_watchdog_cancel(&q->watchdog); } @@ -1612,8 +1608,6 @@ hfsc_dequeue(struct Qdisc *sch) if (sch->q.qlen == 0) return NULL; - if ((skb = __skb_dequeue(&q->requeue))) - goto out; cur_time = psched_get_time(); @@ -1662,7 +1656,6 @@ hfsc_dequeue(struct Qdisc *sch) set_passive(cl); } - out: sch->flags &= ~TCQ_F_THROTTLED; sch->q.qlen--; -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 14/14] pkt_sched: sch_generic: Purge qdisc->requeue list in qdisc_reset(). [not found] <fe92ba9380e7da89b674cc58fcb5bc1dae69e0c6.1223973003.git.jarkao2@gmail.com> ` (12 preceding siblings ...) 2008-10-14 9:55 ` [PATCH 13/14] sch_hfsc: Remove remains of the old requeue code Jarek Poplawski @ 2008-10-14 9:55 ` Jarek Poplawski 13 siblings, 0 replies; 17+ messages in thread From: Jarek Poplawski @ 2008-10-14 9:55 UTC (permalink / raw) To: David Miller; +Cc: netdev pkt_sched: sch_generic: Purge qdisc->requeue list in qdisc_reset(). Signed-off-by: Jarek Poplawski <jarkao2@gmail.com> --- net/sched/sch_generic.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index 9560ea1..eceec2f 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c @@ -504,6 +504,7 @@ void qdisc_reset(struct Qdisc *qdisc) { const struct Qdisc_ops *ops = qdisc->ops; + __skb_queue_purge(&qdisc->requeue); if (ops->reset) ops->reset(qdisc); } -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 17+ messages in thread
end of thread, other threads:[~2008-10-14 18:04 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <fe92ba9380e7da89b674cc58fcb5bc1dae69e0c6.1223973003.git.jarkao2@gmail.com>
2008-10-14 9:53 ` [PATCH 01/14] pkt_sched: Add qdisc_dequeue() helper Jarek Poplawski
2008-10-14 9:53 ` [PATCH 02/14] pkt_sched: Replace all explitic ->dequeue() calls with qdisc_dequeue() Jarek Poplawski
2008-10-14 10:35 ` Jarek Poplawski
2008-10-14 9:53 ` [PATCH 03/14] pkt_sched: Replace explitic ->dequeue() call with qdisc_dequeue() in sch_multiq Jarek Poplawski
2008-10-14 9:53 ` [PATCH 04/14] sch_netem: Use requeue list instead of ops->requeue() Jarek Poplawski
2008-10-14 15:22 ` Stephen Hemminger
2008-10-14 18:04 ` Jarek Poplawski
2008-10-14 9:54 ` [PATCH 05/14] sch_tbf: Use ->requeue queue instead of ops Jarek Poplawski
2008-10-14 9:54 ` [PATCH 06/14] sch_atm: " Jarek Poplawski
2008-10-14 9:54 ` [PATCH 07/14] sch_hfsc: " Jarek Poplawski
2008-10-14 9:54 ` [PATCH 08/14] pkt_sched: Kill qdisc->ops->requeue() Jarek Poplawski
2008-10-14 9:54 ` [PATCH 09/14] pkt_sched: Kill qdisc->ops->requeue() in sch_atm and sch_multiq Jarek Poplawski
2008-10-14 9:55 ` [PATCH 10/14] pkt_sched: Redo qdisc_dequeue() and bring back qdisc_requeue() Jarek Poplawski
2008-10-14 9:55 ` [PATCH 11/14] pkt_sched: Use qdisc_requeue() wrapper instead of open-coding Jarek Poplawski
2008-10-14 9:55 ` [PATCH 12/14] sch_htb: Fix a compiler warning in htb_enqueue() Jarek Poplawski
2008-10-14 9:55 ` [PATCH 13/14] sch_hfsc: Remove remains of the old requeue code Jarek Poplawski
2008-10-14 9:55 ` [PATCH 14/14] pkt_sched: sch_generic: Purge qdisc->requeue list in qdisc_reset() Jarek Poplawski
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).