aboutsummaryrefslogtreecommitdiffstats
path: root/net/sched/sch_tbf.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/sched/sch_tbf.c')
-rw-r--r--net/sched/sch_tbf.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c
index bb7783d584bb..a2f93c09f3cc 100644
--- a/net/sched/sch_tbf.c
+++ b/net/sched/sch_tbf.c
@@ -236,6 +236,7 @@ static int tbf_change(struct Qdisc* sch, struct nlattr *opt)
236 struct tc_tbf_qopt *qopt; 236 struct tc_tbf_qopt *qopt;
237 struct qdisc_rate_table *rtab = NULL; 237 struct qdisc_rate_table *rtab = NULL;
238 struct qdisc_rate_table *ptab = NULL; 238 struct qdisc_rate_table *ptab = NULL;
239 struct qdisc_rate_table *tmp;
239 struct Qdisc *child = NULL; 240 struct Qdisc *child = NULL;
240 int max_size,n; 241 int max_size,n;
241 242
@@ -284,7 +285,8 @@ static int tbf_change(struct Qdisc* sch, struct nlattr *opt)
284 sch_tree_lock(sch); 285 sch_tree_lock(sch);
285 if (child) { 286 if (child) {
286 qdisc_tree_decrease_qlen(q->qdisc, q->qdisc->q.qlen); 287 qdisc_tree_decrease_qlen(q->qdisc, q->qdisc->q.qlen);
287 qdisc_destroy(xchg(&q->qdisc, child)); 288 qdisc_destroy(q->qdisc);
289 q->qdisc = child;
288 } 290 }
289 q->limit = qopt->limit; 291 q->limit = qopt->limit;
290 q->mtu = qopt->mtu; 292 q->mtu = qopt->mtu;
@@ -292,8 +294,14 @@ static int tbf_change(struct Qdisc* sch, struct nlattr *opt)
292 q->buffer = qopt->buffer; 294 q->buffer = qopt->buffer;
293 q->tokens = q->buffer; 295 q->tokens = q->buffer;
294 q->ptokens = q->mtu; 296 q->ptokens = q->mtu;
295 rtab = xchg(&q->R_tab, rtab); 297
296 ptab = xchg(&q->P_tab, ptab); 298 tmp = q->R_tab;
299 q->R_tab = rtab;
300 rtab = tmp;
301
302 tmp = q->P_tab;
303 q->P_tab = ptab;
304 ptab = tmp;
297 sch_tree_unlock(sch); 305 sch_tree_unlock(sch);
298 err = 0; 306 err = 0;
299done: 307done:
@@ -383,7 +391,8 @@ static int tbf_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,
383 new = &noop_qdisc; 391 new = &noop_qdisc;
384 392
385 sch_tree_lock(sch); 393 sch_tree_lock(sch);
386 *old = xchg(&q->qdisc, new); 394 *old = q->qdisc;
395 q->qdisc = new;
387 qdisc_tree_decrease_qlen(*old, (*old)->q.qlen); 396 qdisc_tree_decrease_qlen(*old, (*old)->q.qlen);
388 qdisc_reset(*old); 397 qdisc_reset(*old);
389 sch_tree_unlock(sch); 398 sch_tree_unlock(sch);