diff options
Diffstat (limited to 'net/sched/sch_prio.c')
| -rw-r--r-- | net/sched/sch_prio.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/net/sched/sch_prio.c b/net/sched/sch_prio.c index 0d4630b155fe..59ef2daf652c 100644 --- a/net/sched/sch_prio.c +++ b/net/sched/sch_prio.c @@ -205,7 +205,7 @@ static int prio_tune(struct Qdisc *sch, struct nlattr *opt) struct Qdisc *child = q->queues[i]; q->queues[i] = &noop_qdisc; if (child != &noop_qdisc) { - qdisc_tree_reduce_backlog(child, child->q.qlen, child->qstats.backlog); + qdisc_tree_decrease_qlen(child, child->q.qlen); qdisc_destroy(child); } } @@ -224,9 +224,8 @@ static int prio_tune(struct Qdisc *sch, struct nlattr *opt) q->queues[i] = child; if (old != &noop_qdisc) { - qdisc_tree_reduce_backlog(old, - old->q.qlen, - old->qstats.backlog); + qdisc_tree_decrease_qlen(old, + old->q.qlen); qdisc_destroy(old); } sch_tree_unlock(sch); @@ -291,7 +290,13 @@ static int prio_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new, if (new == NULL) new = &noop_qdisc; - *old = qdisc_replace(sch, new, &q->queues[band]); + sch_tree_lock(sch); + *old = q->queues[band]; + q->queues[band] = new; + qdisc_tree_decrease_qlen(*old, (*old)->q.qlen); + qdisc_reset(*old); + sch_tree_unlock(sch); + return 0; } |
