Skip to content

Commit

Permalink
net_sched: fix order of queue length updates in qdisc_replace()
Browse files Browse the repository at this point in the history
This important to call qdisc_tree_reduce_backlog() after changing queue
length. Parent qdisc should deactivate class in ->qlen_notify() called from
qdisc_tree_reduce_backlog() but this happens only if qdisc->q.qlen in zero.

Missed class deactivations leads to crashes/warnings at picking packets
from empty qdisc and corrupting state at reactivating this class in future.

Signed-off-by: Konstantin Khlebnikov <[email protected]>
Fixes: 86a7996 ("net_sched: introduce qdisc_replace() helper")
Acked-by: Cong Wang <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
koct9i authored and davem330 committed Aug 21, 2017
1 parent 49bf4b3 commit 68a66d1
Showing 1 changed file with 4 additions and 1 deletion.
5 changes: 4 additions & 1 deletion include/net/sch_generic.h
Original file line number Diff line number Diff line change
Expand Up @@ -806,8 +806,11 @@ static inline struct Qdisc *qdisc_replace(struct Qdisc *sch, struct Qdisc *new,
old = *pold;
*pold = new;
if (old != NULL) {
qdisc_tree_reduce_backlog(old, old->q.qlen, old->qstats.backlog);
unsigned int qlen = old->q.qlen;
unsigned int backlog = old->qstats.backlog;

qdisc_reset(old);
qdisc_tree_reduce_backlog(old, qlen, backlog);
}
sch_tree_unlock(sch);

Expand Down

0 comments on commit 68a66d1

Please sign in to comment.