diff options
Diffstat (limited to 'net/sched/sch_generic.c')
-rw-r--r-- | net/sched/sch_generic.c | 28 |
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 | */ |
467 | struct pfifo_fast_priv { | 467 | struct 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 | */ |
478 | static const int bitmap2band[] = {-1, 0, 1, 0, 2, 0, 1, 0}; | 478 | static const int bitmap2band[] = {-1, 0, 1, 0, 2, 0, 1, 0}; |
479 | 479 | ||
480 | static inline struct sk_buff_head *band2list(struct pfifo_fast_priv *priv, | 480 | static 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, | |||
486 | static int pfifo_fast_enqueue(struct sk_buff *skb, struct Qdisc *qdisc, | 486 | static 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, |