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