aboutsummaryrefslogtreecommitdiffstats
path: root/net/sched/sch_generic.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/sched/sch_generic.c')
-rw-r--r--net/sched/sch_generic.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c
index 0d21b567ff27..6cfb6e9038c2 100644
--- a/net/sched/sch_generic.c
+++ b/net/sched/sch_generic.c
@@ -466,7 +466,7 @@ static const u8 prio2band[TC_PRIO_MAX + 1] = {
466 */ 466 */
467struct pfifo_fast_priv { 467struct pfifo_fast_priv {
468 u32 bitmap; 468 u32 bitmap;
469 struct sk_buff_head q[PFIFO_FAST_BANDS]; 469 struct qdisc_skb_head q[PFIFO_FAST_BANDS];
470}; 470};
471 471
472/* 472/*
@@ -477,7 +477,7 @@ struct pfifo_fast_priv {
477 */ 477 */
478static const int bitmap2band[] = {-1, 0, 1, 0, 2, 0, 1, 0}; 478static const int bitmap2band[] = {-1, 0, 1, 0, 2, 0, 1, 0};
479 479
480static inline struct sk_buff_head *band2list(struct pfifo_fast_priv *priv, 480static inline struct qdisc_skb_head *band2list(struct pfifo_fast_priv *priv,
481 int band) 481 int band)
482{ 482{
483 return priv->q + band; 483 return priv->q + band;
@@ -486,10 +486,10 @@ static inline struct sk_buff_head *band2list(struct pfifo_fast_priv *priv,
486static int pfifo_fast_enqueue(struct sk_buff *skb, struct Qdisc *qdisc, 486static int pfifo_fast_enqueue(struct sk_buff *skb, struct Qdisc *qdisc,
487 struct sk_buff **to_free) 487 struct sk_buff **to_free)
488{ 488{
489 if (skb_queue_len(&qdisc->q) < qdisc_dev(qdisc)->tx_queue_len) { 489 if (qdisc->q.qlen < qdisc_dev(qdisc)->tx_queue_len) {
490 int band = prio2band[skb->priority & TC_PRIO_MAX]; 490 int band = prio2band[skb->priority & TC_PRIO_MAX];
491 struct pfifo_fast_priv *priv = qdisc_priv(qdisc); 491 struct pfifo_fast_priv *priv = qdisc_priv(qdisc);
492 struct sk_buff_head *list = band2list(priv, band); 492 struct qdisc_skb_head *list = band2list(priv, band);
493 493
494 priv->bitmap |= (1 << band); 494 priv->bitmap |= (1 << band);
495 qdisc->q.qlen++; 495 qdisc->q.qlen++;
@@ -505,11 +505,16 @@ static struct sk_buff *pfifo_fast_dequeue(struct Qdisc *qdisc)
505 int band = bitmap2band[priv->bitmap]; 505 int band = bitmap2band[priv->bitmap];
506 506
507 if (likely(band >= 0)) { 507 if (likely(band >= 0)) {
508 struct sk_buff_head *list = band2list(priv, band); 508 struct qdisc_skb_head *qh = band2list(priv, band);
509 struct sk_buff *skb = __qdisc_dequeue_head(qdisc, list); 509 struct sk_buff *skb = __qdisc_dequeue_head(qh);
510
511 if (likely(skb != NULL)) {
512 qdisc_qstats_backlog_dec(qdisc, skb);
513 qdisc_bstats_update(qdisc, skb);
514 }
510 515
511 qdisc->q.qlen--; 516 qdisc->q.qlen--;
512 if (skb_queue_empty(list)) 517 if (qh->qlen == 0)
513 priv->bitmap &= ~(1 << band); 518 priv->bitmap &= ~(1 << band);
514 519
515 return skb; 520 return skb;
@@ -524,9 +529,9 @@ static struct sk_buff *pfifo_fast_peek(struct Qdisc *qdisc)
524 int band = bitmap2band[priv->bitmap]; 529 int band = bitmap2band[priv->bitmap];
525 530
526 if (band >= 0) { 531 if (band >= 0) {
527 struct sk_buff_head *list = band2list(priv, band); 532 struct qdisc_skb_head *qh = band2list(priv, band);
528 533
529 return skb_peek(list); 534 return qh->head;
530 } 535 }
531 536
532 return NULL; 537 return NULL;
@@ -564,7 +569,7 @@ static int pfifo_fast_init(struct Qdisc *qdisc, struct nlattr *opt)
564 struct pfifo_fast_priv *priv = qdisc_priv(qdisc); 569 struct pfifo_fast_priv *priv = qdisc_priv(qdisc);
565 570
566 for (prio = 0; prio < PFIFO_FAST_BANDS; prio++) 571 for (prio = 0; prio < PFIFO_FAST_BANDS; prio++)
567 __skb_queue_head_init(band2list(priv, prio)); 572 qdisc_skb_head_init(band2list(priv, prio));
568 573
569 /* Can by-pass the queue discipline */ 574 /* Can by-pass the queue discipline */
570 qdisc->flags |= TCQ_F_CAN_BYPASS; 575 qdisc->flags |= TCQ_F_CAN_BYPASS;
@@ -612,7 +617,8 @@ struct Qdisc *qdisc_alloc(struct netdev_queue *dev_queue,
612 sch = (struct Qdisc *) QDISC_ALIGN((unsigned long) p); 617 sch = (struct Qdisc *) QDISC_ALIGN((unsigned long) p);
613 sch->padded = (char *) sch - (char *) p; 618 sch->padded = (char *) sch - (char *) p;
614 } 619 }
615 skb_queue_head_init(&sch->q); 620 qdisc_skb_head_init(&sch->q);
621 spin_lock_init(&sch->q.lock);
616 622
617 spin_lock_init(&sch->busylock); 623 spin_lock_init(&sch->busylock);
618 lockdep_set_class(&sch->busylock, 624 lockdep_set_class(&sch->busylock,