diff mbox series

net_sched: always reset qdisc backlog in qdisc_reset()

Message ID 150591153693.113604.8604505743746410801.stgit@buzz
State Accepted, archived
Delegated to: David Miller
Headers show
Series net_sched: always reset qdisc backlog in qdisc_reset() | expand

Commit Message

Konstantin Khlebnikov Sept. 20, 2017, 12:45 p.m. UTC
SKB stored in qdisc->gso_skb also counted into backlog.

Some qdiscs don't reset backlog to zero in ->reset(),
for example sfq just dequeue and free all queued skb.

Signed-off-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>
Fixes: 2ccccf5fb43f ("net_sched: update hierarchical backlog too")
---
 net/sched/sch_generic.c |    1 +
 1 file changed, 1 insertion(+)

Comments

Cong Wang Sept. 20, 2017, 11:26 p.m. UTC | #1
On Wed, Sep 20, 2017 at 5:45 AM, Konstantin Khlebnikov
<khlebnikov@yandex-team.ru> wrote:
> SKB stored in qdisc->gso_skb also counted into backlog.
>
> Some qdiscs don't reset backlog to zero in ->reset(),
> for example sfq just dequeue and free all queued skb.
>
> Signed-off-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>
> Fixes: 2ccccf5fb43f ("net_sched: update hierarchical backlog too")

Looks good.

sch->qstats.backlog = 0 can be removed from each ->reset()
after this patch.
David Miller Sept. 21, 2017, 6:57 p.m. UTC | #2
From: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>
Date: Wed, 20 Sep 2017 15:45:36 +0300

> SKB stored in qdisc->gso_skb also counted into backlog.
> 
> Some qdiscs don't reset backlog to zero in ->reset(),
> for example sfq just dequeue and free all queued skb.
> 
> Signed-off-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>
> Fixes: 2ccccf5fb43f ("net_sched: update hierarchical backlog too")

Applied and queued up for -stable.
diff mbox series

Patch

diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c
index 92237e75dbbc..bf8c81e07c70 100644
--- a/net/sched/sch_generic.c
+++ b/net/sched/sch_generic.c
@@ -685,6 +685,7 @@  void qdisc_reset(struct Qdisc *qdisc)
 		qdisc->gso_skb = NULL;
 	}
 	qdisc->q.qlen = 0;
+	qdisc->qstats.backlog = 0;
 }
 EXPORT_SYMBOL(qdisc_reset);