On Tue, 2015-07-21 at 06:04 -0400, Jamal Hadi Salim wrote: > It is worrisome to fix the core code for this. The root cause seems to > be codel. Dont have time but in general, reset would be something like: > > struct fq_codel_sched_data *q = qdisc_priv(sch); > qdisc_reset(q) This only works for very simple qdisc with one queue. > > or something along those lines... > But certainly dequeue semantics dont seem right there.. Well, reset() is trivial to implement like this while (skb = local_dequeue(sch)) { kfree_skb(skb); } And I guess I copy/pasted sfq code here, because I was lazy. But yes, qdisc_tree_decrease_qlen() would have to be not called. It seems I coded fq_reset() differently. Alex, please try instead : diff --git a/net/sched/sch_fq_codel.c b/net/sched/sch_fq_codel.c index 21ca33c9f036..3f0320ab6029 100644 --- a/net/sched/sch_fq_codel.c +++ b/net/sched/sch_fq_codel.c @@ -288,10 +288,21 @@ begin: static void fq_codel_reset(struct Qdisc *sch) { - struct sk_buff *skb; + struct fq_codel_sched_data *q = qdisc_priv(sch); + int i; - while ((skb = fq_codel_dequeue(sch)) != NULL) - kfree_skb(skb); + INIT_LIST_HEAD(&q->new_flows); + INIT_LIST_HEAD(&q->old_flows); + for (i = 0; i < q->flows_cnt; i++) { + struct fq_codel_flow *flow = q->flows + i; + + while (flow->head) + kfree_skb(dequeue_head(flow)); + + INIT_LIST_HEAD(&flow->flowchain); + } + memset(q->backlogs, 0, q->flows_cnt * sizeof(u32)); + sch->q.qlen = 0; } static const struct nla_policy fq_codel_policy[TCA_FQ_CODEL_MAX + 1] = { -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html