diff options
Diffstat (limited to 'net/sched/sch_cbq.c')
-rw-r--r-- | net/sched/sch_cbq.c | 43 |
1 files changed, 5 insertions, 38 deletions
diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c index 03e389e8d945..3a9569a3396c 100644 --- a/net/sched/sch_cbq.c +++ b/net/sched/sch_cbq.c | |||
@@ -405,40 +405,6 @@ cbq_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
405 | return ret; | 405 | return ret; |
406 | } | 406 | } |
407 | 407 | ||
408 | static int | ||
409 | cbq_requeue(struct sk_buff *skb, struct Qdisc *sch) | ||
410 | { | ||
411 | struct cbq_sched_data *q = qdisc_priv(sch); | ||
412 | struct cbq_class *cl; | ||
413 | int ret; | ||
414 | |||
415 | if ((cl = q->tx_class) == NULL) { | ||
416 | kfree_skb(skb); | ||
417 | sch->qstats.drops++; | ||
418 | return NET_XMIT_CN; | ||
419 | } | ||
420 | q->tx_class = NULL; | ||
421 | |||
422 | cbq_mark_toplevel(q, cl); | ||
423 | |||
424 | #ifdef CONFIG_NET_CLS_ACT | ||
425 | q->rx_class = cl; | ||
426 | cl->q->__parent = sch; | ||
427 | #endif | ||
428 | if ((ret = cl->q->ops->requeue(skb, cl->q)) == 0) { | ||
429 | sch->q.qlen++; | ||
430 | sch->qstats.requeues++; | ||
431 | if (!cl->next_alive) | ||
432 | cbq_activate_class(cl); | ||
433 | return 0; | ||
434 | } | ||
435 | if (net_xmit_drop_count(ret)) { | ||
436 | sch->qstats.drops++; | ||
437 | cl->qstats.drops++; | ||
438 | } | ||
439 | return ret; | ||
440 | } | ||
441 | |||
442 | /* Overlimit actions */ | 408 | /* Overlimit actions */ |
443 | 409 | ||
444 | /* TC_CBQ_OVL_CLASSIC: (default) penalize leaf class by adding offtime */ | 410 | /* TC_CBQ_OVL_CLASSIC: (default) penalize leaf class by adding offtime */ |
@@ -1669,7 +1635,8 @@ static int cbq_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new, | |||
1669 | #endif | 1635 | #endif |
1670 | } | 1636 | } |
1671 | sch_tree_lock(sch); | 1637 | sch_tree_lock(sch); |
1672 | *old = xchg(&cl->q, new); | 1638 | *old = cl->q; |
1639 | cl->q = new; | ||
1673 | qdisc_tree_decrease_qlen(*old, (*old)->q.qlen); | 1640 | qdisc_tree_decrease_qlen(*old, (*old)->q.qlen); |
1674 | qdisc_reset(*old); | 1641 | qdisc_reset(*old); |
1675 | sch_tree_unlock(sch); | 1642 | sch_tree_unlock(sch); |
@@ -1810,8 +1777,8 @@ cbq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct nlattr **t | |||
1810 | cbq_deactivate_class(cl); | 1777 | cbq_deactivate_class(cl); |
1811 | 1778 | ||
1812 | if (rtab) { | 1779 | if (rtab) { |
1813 | rtab = xchg(&cl->R_tab, rtab); | 1780 | qdisc_put_rtab(cl->R_tab); |
1814 | qdisc_put_rtab(rtab); | 1781 | cl->R_tab = rtab; |
1815 | } | 1782 | } |
1816 | 1783 | ||
1817 | if (tb[TCA_CBQ_LSSOPT]) | 1784 | if (tb[TCA_CBQ_LSSOPT]) |
@@ -2066,7 +2033,7 @@ static struct Qdisc_ops cbq_qdisc_ops __read_mostly = { | |||
2066 | .priv_size = sizeof(struct cbq_sched_data), | 2033 | .priv_size = sizeof(struct cbq_sched_data), |
2067 | .enqueue = cbq_enqueue, | 2034 | .enqueue = cbq_enqueue, |
2068 | .dequeue = cbq_dequeue, | 2035 | .dequeue = cbq_dequeue, |
2069 | .requeue = cbq_requeue, | 2036 | .peek = qdisc_peek_dequeued, |
2070 | .drop = cbq_drop, | 2037 | .drop = cbq_drop, |
2071 | .init = cbq_init, | 2038 | .init = cbq_init, |
2072 | .reset = cbq_reset, | 2039 | .reset = cbq_reset, |