* [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
* [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
* [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
* 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
* 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
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).