aboutsummaryrefslogtreecommitdiffstats
path: root/net/sched/sch_prio.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/sched/sch_prio.c')
-rw-r--r--net/sched/sch_prio.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/net/sched/sch_prio.c b/net/sched/sch_prio.c
index ea65a87ec22c..94cecef70145 100644
--- a/net/sched/sch_prio.c
+++ b/net/sched/sch_prio.c
@@ -187,7 +187,8 @@ static int prio_tune(struct Qdisc *sch, struct nlattr *opt)
187 memcpy(q->prio2band, qopt->priomap, TC_PRIO_MAX+1); 187 memcpy(q->prio2band, qopt->priomap, TC_PRIO_MAX+1);
188 188
189 for (i=q->bands; i<TCQ_PRIO_BANDS; i++) { 189 for (i=q->bands; i<TCQ_PRIO_BANDS; i++) {
190 struct Qdisc *child = xchg(&q->queues[i], &noop_qdisc); 190 struct Qdisc *child = q->queues[i];
191 q->queues[i] = &noop_qdisc;
191 if (child != &noop_qdisc) { 192 if (child != &noop_qdisc) {
192 qdisc_tree_decrease_qlen(child, child->q.qlen); 193 qdisc_tree_decrease_qlen(child, child->q.qlen);
193 qdisc_destroy(child); 194 qdisc_destroy(child);
@@ -197,18 +198,19 @@ static int prio_tune(struct Qdisc *sch, struct nlattr *opt)
197 198
198 for (i=0; i<q->bands; i++) { 199 for (i=0; i<q->bands; i++) {
199 if (q->queues[i] == &noop_qdisc) { 200 if (q->queues[i] == &noop_qdisc) {
200 struct Qdisc *child; 201 struct Qdisc *child, *old;
201 child = qdisc_create_dflt(qdisc_dev(sch), sch->dev_queue, 202 child = qdisc_create_dflt(qdisc_dev(sch), sch->dev_queue,
202 &pfifo_qdisc_ops, 203 &pfifo_qdisc_ops,
203 TC_H_MAKE(sch->handle, i + 1)); 204 TC_H_MAKE(sch->handle, i + 1));
204 if (child) { 205 if (child) {
205 sch_tree_lock(sch); 206 sch_tree_lock(sch);
206 child = xchg(&q->queues[i], child); 207 old = q->queues[i];
208 q->queues[i] = child;
207 209
208 if (child != &noop_qdisc) { 210 if (old != &noop_qdisc) {
209 qdisc_tree_decrease_qlen(child, 211 qdisc_tree_decrease_qlen(old,
210 child->q.qlen); 212 old->q.qlen);
211 qdisc_destroy(child); 213 qdisc_destroy(old);
212 } 214 }
213 sch_tree_unlock(sch); 215 sch_tree_unlock(sch);
214 } 216 }