netdev
[Top] [All Lists]

Re: [PATCH] loop unrolling in net/sched/sch_generic.c

To: "David S. Miller" <davem@xxxxxxxxxxxxx>, tgraf@xxxxxxx
Subject: Re: [PATCH] loop unrolling in net/sched/sch_generic.c
From: Eric Dumazet <dada1@xxxxxxxxxxxxx>
Date: Wed, 06 Jul 2005 01:16:02 +0200
Cc: netdev@xxxxxxxxxxx
In-reply-to: <20050705.143548.28788459.davem@xxxxxxxxxxxxx>
References: <20050705173411.GK16076@xxxxxxxxxxxxxx> <20050705.142210.14973612.davem@xxxxxxxxxxxxx> <20050705213355.GM16076@xxxxxxxxxxxxxx> <20050705.143548.28788459.davem@xxxxxxxxxxxxx>
Sender: netdev-bounce@xxxxxxxxxxx
User-agent: Mozilla Thunderbird 1.0 (Windows/20041206)
David S. Miller a écrit :
From: Thomas Graf <tgraf@xxxxxxx>
Date: Tue, 5 Jul 2005 23:33:55 +0200


* David S. Miller <20050705.142210.14973612.davem@xxxxxxxxxxxxx> 2005-07-05 
14:22

So I'll apply the original unrolling patch for now.

The patch must be changed to use __qdisc_dequeue_head() instead of
__skb_dequeue() or we screw up the backlog.


Ok, good thing the patch didn't apply correctly anyways :)


Oh well, I was unaware of last changes in 2.6.13-rc1 :(

Given the fact that the PFIFO_FAST_BANDS macro was introduced, I wonder if the 
patch should be this one or not...
Should we assume PFIFO_FAST_BANDS will stay at 3 or what ?

[NET] : unroll a small loop in pfifo_fast_dequeue(). Compiler generates better 
code.
    oprofile says this function uses now 0.29% instead of 1.22 %, on a x86_64 
target.

Signed-off-by: Eric Dumazet <dada1@xxxxxxxxxxxxx>

--- linux-2.6.13-rc1/net/sched/sch_generic.c    2005-07-06 00:46:53.000000000 
+0200
+++ linux-2.6.13-rc1-ed/net/sched/sch_generic.c 2005-07-06 01:05:04.000000000 
+0200
@@ -328,18 +328,31 @@
 
 static struct sk_buff *pfifo_fast_dequeue(struct Qdisc* qdisc)
 {
-       int prio;
        struct sk_buff_head *list = qdisc_priv(qdisc);
 
-       for (prio = 0; prio < PFIFO_FAST_BANDS; prio++, list++) {
-               struct sk_buff *skb = __qdisc_dequeue_head(qdisc, list);
-               if (skb) {
-                       qdisc->q.qlen--;
-                       return skb;
+#if PFIFO_FAST_BANDS == 3
+       for (;;) {
+               if (!skb_queue_empty(list))
+                       break;
+               list++;
+               if (!skb_queue_empty(list))
+                       break;
+               list++;
+               if (!skb_queue_empty(list))
+                       break;
+               return NULL;
                }
-       }
-
-       return NULL;
+#else
+       int prio;
+       for (prio = 0;; list++) {
+               if (!skb_queue_empty(list))
+                       break;
+               if (++prio == PFIFO_FAST_BANDS)
+                       return NULL;
+               }
+#endif
+       qdisc->q.qlen--;
+       return __qdisc_dequeue_head(qdisc, list);
 }
 
 static int pfifo_fast_requeue(struct sk_buff *skb, struct Qdisc* qdisc)
<Prev in Thread] Current Thread [Next in Thread>