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)
|