diff options
author | Thomas Graf <tgraf@suug.ch> | 2005-07-18 13:30:53 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2005-07-18 13:30:53 -0700 |
commit | 452f299da3253f65020143f743c2e207b752547b (patch) | |
tree | 56f02114d9e65d60c0f3a0658602e7e193f226bd | |
parent | d7c7ed4dbc66c5f4dfa5615cdfc5009af3b3b137 (diff) | |
download | op-kernel-dev-452f299da3253f65020143f743c2e207b752547b.zip op-kernel-dev-452f299da3253f65020143f743c2e207b752547b.tar.gz |
[PKT_SCHED]: Reduce branch mispredictions in pfifo_fast_dequeue
The current call to __qdisc_dequeue_head leads to a branch
misprediction for every loop iteration, the fact that the
most common priority is 2 makes this even worse. This issue
has been brought up by Eric Dumazet <dada1@cosmosbay.com>
but unlike his solution which was to manually unroll the loop,
this approach preserves the possibility to increase the number
of bands at compile time.
Signed-off-by: Thomas Graf <tgraf@suug.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/sched/sch_generic.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index 73e218e..8edefd5d 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c @@ -331,11 +331,10 @@ 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) { + for (prio = 0; prio < PFIFO_FAST_BANDS; prio++) { + if (!skb_queue_empty(list + prio)) { qdisc->q.qlen--; - return skb; + return __qdisc_dequeue_head(qdisc, list + prio); } } |