diff options
author | WANG Cong <xiyou.wangcong@gmail.com> | 2016-06-03 18:05:57 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-06-06 21:14:29 -0400 |
commit | a27758ffaf96f89002129eedb2cc172d254099f8 (patch) | |
tree | a773e569d26b1c5b364d12cd69a76615d3090af7 /net | |
parent | 1957598840f47d42bb0b7f8a871717a780708686 (diff) |
net_sched: keep backlog updated with qlen
For gso_skb we only update qlen, backlog should be updated too.
Note, it is correct to just update these stats at one layer,
because the gso_skb is cached there.
Reported-by: Stas Nichiporovich <stasn77@gmail.com>
Fixes: 2ccccf5fb43f ("net_sched: update hierarchical backlog too")
Cc: Jamal Hadi Salim <jhs@mojatatu.com>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/sched/sch_generic.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index 269dd71b3828..f9e0e9c03d0a 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c | |||
@@ -49,6 +49,7 @@ static inline int dev_requeue_skb(struct sk_buff *skb, struct Qdisc *q) | |||
49 | { | 49 | { |
50 | q->gso_skb = skb; | 50 | q->gso_skb = skb; |
51 | q->qstats.requeues++; | 51 | q->qstats.requeues++; |
52 | qdisc_qstats_backlog_inc(q, skb); | ||
52 | q->q.qlen++; /* it's still part of the queue */ | 53 | q->q.qlen++; /* it's still part of the queue */ |
53 | __netif_schedule(q); | 54 | __netif_schedule(q); |
54 | 55 | ||
@@ -92,6 +93,7 @@ static struct sk_buff *dequeue_skb(struct Qdisc *q, bool *validate, | |||
92 | txq = skb_get_tx_queue(txq->dev, skb); | 93 | txq = skb_get_tx_queue(txq->dev, skb); |
93 | if (!netif_xmit_frozen_or_stopped(txq)) { | 94 | if (!netif_xmit_frozen_or_stopped(txq)) { |
94 | q->gso_skb = NULL; | 95 | q->gso_skb = NULL; |
96 | qdisc_qstats_backlog_dec(q, skb); | ||
95 | q->q.qlen--; | 97 | q->q.qlen--; |
96 | } else | 98 | } else |
97 | skb = NULL; | 99 | skb = NULL; |