From: Eric Dumazet <dada1@cosmosbay•com>
To: Thomas Graf <tgraf@suug•ch>
Cc: "David S. Miller" <davem@davemloft•net>, netdev@oss•sgi.com
Subject: Re: [PATCH] loop unrolling in net/sched/sch_generic.c
Date: Wed, 06 Jul 2005 02:32:24 +0200 [thread overview]
Message-ID: <42CB2698.2080904@cosmosbay.com> (raw)
In-Reply-To: <20050705234104.GR16076@postel.suug.ch>
Thomas Graf a écrit :
> I still think we can fix this performance issue without manually
> unrolling the loop or we should at least try to. In the end gcc
> should notice the constant part of the loop and move it out so
> basically the only difference should the additional prio++ and
> possibly a failing branch prediction.
>
> What about this? I'm still not sure where exactly all the time
> is lost so this is a shot in the dark.
>
> Index: net-2.6/net/sched/sch_generic.c
> ===================================================================
> --- net-2.6.orig/net/sched/sch_generic.c
> +++ net-2.6/net/sched/sch_generic.c
> @@ -330,10 +330,11 @@ static struct sk_buff *pfifo_fast_dequeu
> {
> int prio;
> struct sk_buff_head *list = qdisc_priv(qdisc);
> + struct sk_buff *skb;
>
> - for (prio = 0; prio < PFIFO_FAST_BANDS; prio++, list++) {
> - struct sk_buff *skb = __qdisc_dequeue_head(qdisc, list);
> - if (skb) {
> + for (prio = 0; prio < PFIFO_FAST_BANDS; prio++) {
> + if (!skb_queue_empty(list + prio)) {
> + skb = __qdisc_dequeue_head(qdisc, list);
> qdisc->q.qlen--;
> return skb;
> }
>
>
Hum... shouldnt it be :
+ skb = __qdisc_dequeue_head(qdisc, list + prio);
?
Anyway, the branches misprediction come from the fact that most of packets are queued in the prio=2 list.
So each time this function is called, a non unrolled version has to pay 2 to 5 branches misprediction.
if ((!skb_queue_empty(list + prio)) /* branch not taken, mispredict when prio=0 */
if ((!skb_queue_empty(list + prio)) /* branch not taken, mispredict when prio=1 */
if ((!skb_queue_empty(list + prio)) /* branch taken (or not if queue is really empty), mispredict when prio=2 */
Maybe we can rewrite the whole thing without branches, examining prio from PFIFO_FAST_BANDS-1 down to 0, at least for modern cpu with
conditional mov (cmov)
struct sk_buff_head *best = NULL;
struct sk_buff_head *list = qdisc_priv(qdisc)+PFIFO_FAST_BANDS-1;
if (skb_queue_empty(list)) best = list ;
list--;
if (skb_queue_empty(list)) best = list ;
list--;
if (skb_queue_empty(list)) best = list ;
if (best != NULL) {
qdisc->q.qlen--;
return __qdisc_dequeue_head(qdisc, best);
}
This version should have one branch.
I will test this after some sleep :)
See you
Eric
next prev parent reply other threads:[~2005-07-06 0:32 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-05-11 21:15 [TG3]: Add hw coalescing infrastructure David S. Miller
2005-05-11 21:17 ` Michael Chan
2005-05-12 2:28 ` David S. Miller
2005-05-12 7:53 ` Robert Olsson
2005-06-22 15:25 ` [TG3]: About " Eric Dumazet
2005-06-22 19:03 ` Michael Chan
2005-07-04 21:22 ` Eric Dumazet
2005-07-04 21:26 ` David S. Miller
2005-07-04 21:39 ` Eric Dumazet
2005-07-04 21:49 ` David S. Miller
2005-07-04 22:31 ` Eric Dumazet
2005-07-04 22:47 ` David S. Miller
2005-07-04 22:55 ` Eric Dumazet
2005-07-04 22:57 ` Eric Dumazet
2005-07-04 23:01 ` David S. Miller
2005-07-05 7:38 ` [PATCH] loop unrolling in net/sched/sch_generic.c Eric Dumazet
2005-07-05 11:51 ` Thomas Graf
2005-07-05 12:03 ` Thomas Graf
2005-07-05 13:04 ` Eric Dumazet
2005-07-05 13:48 ` Thomas Graf
2005-07-05 15:58 ` Eric Dumazet
2005-07-05 17:34 ` Thomas Graf
2005-07-05 21:22 ` David S. Miller
2005-07-05 21:33 ` Thomas Graf
2005-07-05 21:35 ` David S. Miller
2005-07-05 23:16 ` Eric Dumazet
2005-07-05 23:41 ` Thomas Graf
2005-07-05 23:45 ` David S. Miller
2005-07-05 23:55 ` Thomas Graf
2005-07-06 0:32 ` Eric Dumazet [this message]
2005-07-06 0:51 ` Thomas Graf
2005-07-06 1:04 ` Eric Dumazet
2005-07-06 1:07 ` Thomas Graf
2005-07-06 0:53 ` Eric Dumazet
2005-07-06 1:02 ` Thomas Graf
2005-07-06 1:09 ` Eric Dumazet
2005-07-06 12:42 ` Thomas Graf
2005-07-07 21:17 ` David S. Miller
2005-07-07 21:34 ` Thomas Graf
2005-07-07 22:24 ` David S. Miller
[not found] ` <42CE22CE.7030902@cosmosbay.com>
2005-07-08 7:30 ` David S. Miller
2005-07-08 8:19 ` Eric Dumazet
2005-07-08 11:08 ` Arnaldo Carvalho de Melo
2005-07-12 4:02 ` David S. Miller
2005-07-05 21:26 ` David S. Miller
2005-07-28 15:52 ` [PATCH] Add prefetches in net/ipv4/route.c Eric Dumazet
2005-07-28 19:39 ` David S. Miller
2005-07-28 20:56 ` Eric Dumazet
2005-07-28 20:58 ` David S. Miller
2005-07-28 21:24 ` Eric Dumazet
2005-07-28 22:44 ` David S. Miller
2005-07-29 14:50 ` Robert Olsson
2005-07-29 17:06 ` Rick Jones
2005-07-29 17:44 ` Robert Olsson
2005-07-29 17:57 ` Eric Dumazet
2005-07-29 18:25 ` Rick Jones
2005-07-31 3:52 ` David S. Miller
[not found] ` <42EDDA50.4010405@cosmosbay.com>
2005-08-01 15:39 ` David S. Miller
2005-07-31 3:51 ` David S. Miller
2005-07-31 3:44 ` David S. Miller
2005-07-04 23:00 ` [TG3]: About hw coalescing infrastructure David S. Miller
2005-07-05 16:14 ` Eric Dumazet
2005-07-04 22:47 ` Eric Dumazet
[not found] <C925F8B43D79CC49ACD0601FB68FF50C045E0FB0@orsmsx408>
2005-07-07 22:30 ` [PATCH] loop unrolling in net/sched/sch_generic.c David S. Miller
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=42CB2698.2080904@cosmosbay.com \
--to=dada1@cosmosbay$(echo .)com \
--cc=davem@davemloft$(echo .)net \
--cc=netdev@oss$(echo .)sgi.com \
--cc=tgraf@suug$(echo .)ch \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
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