Convert the "simple" qdiscs to use qdisc_tree_decrease_qlen() where
necessary:
- all graft operations
- destruction of old child qdiscs in prio, red and tbf change operation
- purging of queue in sfq change operation
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
sch_tree_lock(sch);
*old = cl->q;
cl->q = new;
sch_tree_lock(sch);
*old = cl->q;
cl->q = new;
- sch->q.qlen -= (*old)->q.qlen;
+ qdisc_tree_decrease_qlen(*old, (*old)->q.qlen);
qdisc_reset(*old);
sch_tree_unlock(sch);
qdisc_reset(*old);
sch_tree_unlock(sch);
sch_tree_lock(sch);
*old = xchg(&p->q, new);
sch_tree_lock(sch);
*old = xchg(&p->q, new);
+ qdisc_tree_decrease_qlen(*old, (*old)->q.qlen);
sch_tree_unlock(sch);
return 0;
sch_tree_unlock(sch);
return 0;
sch_tree_lock(sch);
*old = xchg(&q->qdisc, new);
sch_tree_lock(sch);
*old = xchg(&q->qdisc, new);
+ qdisc_tree_decrease_qlen(*old, (*old)->q.qlen);
sch_tree_unlock(sch);
return 0;
sch_tree_unlock(sch);
return 0;
for (i=q->bands; i<TCQ_PRIO_BANDS; i++) {
struct Qdisc *child = xchg(&q->queues[i], &noop_qdisc);
for (i=q->bands; i<TCQ_PRIO_BANDS; i++) {
struct Qdisc *child = xchg(&q->queues[i], &noop_qdisc);
- if (child != &noop_qdisc)
+ if (child != &noop_qdisc) {
+ qdisc_tree_decrease_qlen(child, child->q.qlen);
sch_tree_lock(sch);
child = xchg(&q->queues[i], child);
sch_tree_lock(sch);
child = xchg(&q->queues[i], child);
- if (child != &noop_qdisc)
+ if (child != &noop_qdisc) {
+ qdisc_tree_decrease_qlen(child,
+ child->q.qlen);
sch_tree_unlock(sch);
}
}
sch_tree_unlock(sch);
}
}
sch_tree_lock(sch);
*old = q->queues[band];
q->queues[band] = new;
sch_tree_lock(sch);
*old = q->queues[band];
q->queues[band] = new;
- sch->q.qlen -= (*old)->q.qlen;
+ qdisc_tree_decrease_qlen(*old, (*old)->q.qlen);
qdisc_reset(*old);
sch_tree_unlock(sch);
qdisc_reset(*old);
sch_tree_unlock(sch);
sch_tree_lock(sch);
q->flags = ctl->flags;
q->limit = ctl->limit;
sch_tree_lock(sch);
q->flags = ctl->flags;
q->limit = ctl->limit;
+ if (child) {
+ qdisc_tree_decrease_qlen(q->qdisc, q->qdisc->q.qlen);
qdisc_destroy(xchg(&q->qdisc, child));
qdisc_destroy(xchg(&q->qdisc, child));
red_set_parms(&q->parms, ctl->qth_min, ctl->qth_max, ctl->Wlog,
ctl->Plog, ctl->Scell_log,
red_set_parms(&q->parms, ctl->qth_min, ctl->qth_max, ctl->Wlog,
ctl->Plog, ctl->Scell_log,
sch_tree_lock(sch);
*old = xchg(&q->qdisc, new);
sch_tree_lock(sch);
*old = xchg(&q->qdisc, new);
+ qdisc_tree_decrease_qlen(*old, (*old)->q.qlen);
sch_tree_unlock(sch);
return 0;
}
sch_tree_unlock(sch);
return 0;
}
{
struct sfq_sched_data *q = qdisc_priv(sch);
struct tc_sfq_qopt *ctl = RTA_DATA(opt);
{
struct sfq_sched_data *q = qdisc_priv(sch);
struct tc_sfq_qopt *ctl = RTA_DATA(opt);
if (opt->rta_len < RTA_LENGTH(sizeof(*ctl)))
return -EINVAL;
if (opt->rta_len < RTA_LENGTH(sizeof(*ctl)))
return -EINVAL;
if (ctl->limit)
q->limit = min_t(u32, ctl->limit, SFQ_DEPTH);
if (ctl->limit)
q->limit = min_t(u32, ctl->limit, SFQ_DEPTH);
while (sch->q.qlen >= q->limit-1)
sfq_drop(sch);
while (sch->q.qlen >= q->limit-1)
sfq_drop(sch);
+ qdisc_tree_decrease_qlen(sch, qlen - sch->q.qlen);
del_timer(&q->perturb_timer);
if (q->perturb_period) {
del_timer(&q->perturb_timer);
if (q->perturb_period) {
+ if (child) {
+ qdisc_tree_decrease_qlen(q->qdisc, q->qdisc->q.qlen);
qdisc_destroy(xchg(&q->qdisc, child));
qdisc_destroy(xchg(&q->qdisc, child));
q->limit = qopt->limit;
q->mtu = qopt->mtu;
q->max_size = max_size;
q->limit = qopt->limit;
q->mtu = qopt->mtu;
q->max_size = max_size;
sch_tree_lock(sch);
*old = xchg(&q->qdisc, new);
sch_tree_lock(sch);
*old = xchg(&q->qdisc, new);
+ qdisc_tree_decrease_qlen(*old, (*old)->q.qlen);
sch_tree_unlock(sch);
return 0;
sch_tree_unlock(sch);
return 0;