From: Jarek Poplawski <jarkao2@gmail.com>
To: Patrick McHardy <kaber@trash.net>
Cc: David Miller <davem@davemloft.net>,
netdev@vger.kernel.org, Herbert Xu <herbert@gondor.apana.org.au>,
Stephen Hemminger <shemminger@vyatta.com>
Subject: [PATCH] pkt_sched: sch_netem: Limit packet re-ordering functionality to tfifo qdisc.
Date: Fri, 17 Oct 2008 22:12:10 +0200 [thread overview]
Message-ID: <20081017201210.GA2527@ami.dom.local> (raw)
In-Reply-To: <48F89D33.9090809@trash.net>
On Fri, Oct 17, 2008 at 04:12:03PM +0200, Patrick McHardy wrote:
> Jarek Poplawski wrote:
>> On Fri, Oct 17, 2008 at 02:33:23PM +0200, Patrick McHardy wrote:
>>>> @@ -233,7 +233,9 @@ 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);
>>>> + q->qdisc->flags |= TCQ_F_REQUEUE;
>>>> + ret = qdisc_equeue(skb, q->qdisc);
>>>> + q->qdisc->flags &= ~TCQ_F_REQUEUE;
>>> Well, the inner qdisc would still need to logic to order packets
>>> apprioriately.
>>
>> I'm not sure I was understood: the idea is to do something like
>> in this example in tfifo_enqueue() in all leaf qdiscs like fifo
>> etc. too, so to redirect their ->enqueue() to their ->requeue()
>> which usually is qdisc_requeue() (or to it directly if needed).
>
> Yes, I misunderstood this, I though the intention was to get
> rid of requeue entirely.
I was less ambitious and thought about simplifying this at least, but
if you think we can go further, it's OK with me. Then we can do it
only in tfifo. If qdisc_requeue() does the proper logic for it now,
I guess it should be enough to open code this into tfifo_enqueue()
(so we could kill qdisc_requeue() later). Using this TCQ_F_REQUEUE
flag only for this looks a bit wasteful, but I can't see anything
smarter at the moment.
>>> Its probably not that hard, but as I said, I don't
>>> think its necessary at all. It only makes a difference with a
>>> non-work-conserving inner qdisc, but a lot of the functionality of
>>> netem requires the inner tfifo anyways and rate-limiting is usually
>>> done on top of netem. So I would suggest so either hard-wire the
>>> tfifo qdisc or at least make the assumption that inner qdiscs are
>>> work-conserving.
I think Stephen could be interested with this change so I added him to Cc.
Thanks,
Jarek P.
------------------->
pkt_sched: sch_netem: Limit packet re-ordering functionality to tfifo qdisc.
After introducing qdisc->ops->peek() method the only remaining user of
qdisc->ops->requeue() is netem_enqueue() using this for packet
re-ordering. According to Patrick McHardy: "a lot of the functionality
of netem requires the inner tfifo anyways and rate-limiting is usually
done on top of netem. So I would suggest so either hard-wire the tfifo
qdisc or at least make the assumption that inner qdiscs are work-
conserving." This patch tries the former.
Signed-off-by: Jarek Poplawski <jarkao2@gmail.com>
---
include/net/sch_generic.h | 1 +
net/sched/sch_netem.c | 18 +++++++++++++++++-
2 files changed, 18 insertions(+), 1 deletions(-)
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h
index 9dcb5bf..9157766 100644
--- a/include/net/sch_generic.h
+++ b/include/net/sch_generic.h
@@ -45,6 +45,7 @@ struct Qdisc
#define TCQ_F_BUILTIN 1
#define TCQ_F_THROTTLED 2
#define TCQ_F_INGRESS 4
+#define TCQ_F_REQUEUE 8
int padded;
struct Qdisc_ops *ops;
struct qdisc_size_table *stab;
diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c
index 3080bd6..a30f5b6 100644
--- a/net/sched/sch_netem.c
+++ b/net/sched/sch_netem.c
@@ -233,7 +233,14 @@ 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);
+ q->qdisc->flags |= TCQ_F_REQUEUE;
+ ret = qdisc_enqueue(skb, q->qdisc);
+ if (unlikely(q->qdisc->flags & TCQ_F_REQUEUE)) {
+ q->qdisc->flags &= ~TCQ_F_REQUEUE;
+ if (net_ratelimit())
+ printk(KERN_WARNING "netem_enqueue: re-ordering"
+ " unsupported; use default (tfifo) qdisc.");
+ }
}
if (likely(ret == NET_XMIT_SUCCESS)) {
@@ -478,6 +485,15 @@ static int tfifo_enqueue(struct sk_buff *nskb, struct Qdisc *sch)
psched_time_t tnext = netem_skb_cb(nskb)->time_to_send;
struct sk_buff *skb;
+ if (sch->flags & TCQ_F_REQUEUE) {
+ sch->flags &= ~TCQ_F_REQUEUE;
+ __skb_queue_head(list, nskb);
+ sch->qstats.backlog += qdisc_pkt_len(nskb);
+ sch->qstats.requeues++;
+
+ return NET_XMIT_SUCCESS;
+ }
+
if (likely(skb_queue_len(list) < q->limit)) {
/* Optimize for add at tail */
if (likely(skb_queue_empty(list) || tnext >= q->oldest)) {
next prev parent reply other threads:[~2008-10-17 20:10 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-10-16 9:46 [PATCH 0/6] Add qdisc->ops->peek() support Jarek Poplawski
2008-10-16 12:38 ` Patrick McHardy
2008-10-16 13:08 ` Jarek Poplawski
2008-10-16 22:09 ` Jarek Poplawski
2008-10-17 12:33 ` Patrick McHardy
2008-10-17 13:03 ` Jarek Poplawski
2008-10-17 14:12 ` Patrick McHardy
2008-10-17 20:12 ` Jarek Poplawski [this message]
2008-10-21 23:36 ` [PATCH] pkt_sched: sch_netem: Limit packet re-ordering functionality to tfifo qdisc David Miller
2008-10-21 23:51 ` Stephen Hemminger
2008-10-22 5:37 ` Jarek Poplawski
2008-10-22 16:00 ` Patrick McHardy
2008-10-22 16:49 ` Jarek Poplawski
2008-10-22 17:32 ` Patrick McHardy
2008-10-22 17:53 ` [RFC] " Jarek Poplawski
2008-10-22 15:57 ` [PATCH] " Patrick McHardy
2008-10-22 16:00 ` Patrick McHardy
2008-10-17 20:45 ` [PATCH 0/6] Add qdisc->ops->peek() support Jarek Poplawski
2008-10-21 23:43 ` David Miller
2008-10-22 16:01 ` Patrick McHardy
2008-10-22 16:04 ` Patrick McHardy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20081017201210.GA2527@ami.dom.local \
--to=jarkao2@gmail.com \
--cc=davem@davemloft.net \
--cc=herbert@gondor.apana.org.au \
--cc=kaber@trash.net \
--cc=netdev@vger.kernel.org \
--cc=shemminger@vyatta.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).