From patchwork Tue Jul 21 10:52:25 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 498160 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id BFCA1140DCE for ; Tue, 21 Jul 2015 20:52:35 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=Pm9wRzrB; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754002AbbGUKwb (ORCPT ); Tue, 21 Jul 2015 06:52:31 -0400 Received: from mail-wi0-f176.google.com ([209.85.212.176]:34327 "EHLO mail-wi0-f176.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752858AbbGUKwa (ORCPT ); Tue, 21 Jul 2015 06:52:30 -0400 Received: by wibud3 with SMTP id ud3so110592299wib.1; Tue, 21 Jul 2015 03:52:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:subject:from:to:cc:date:in-reply-to:references :content-type:mime-version:content-transfer-encoding; bh=pT26TTa6a9UOvHbSVmMdXwVxYN/8WpwLc6FyFCJahz0=; b=Pm9wRzrBRDCBmXqEwmNGO0dowySjtMBTp770qH30kT8YyLF5p9c1NOt5HI+3W9sObL dBDDUYvtAB/de0M/LCva1WbMUd4TQWtbgSSrR/i6vOH1Cn+gDnBrUp8TfQXUyMSEAEsR 7POaOwizXm5V3WAuu/t1QGNGlLtsOBnar8ZsuqyY9jPUhTh5KMA1s+xU4OtRQpY6dVzJ FOUJdzXyyZVvHf5rEpEPF0JDltU1+JlKlj62NbCBgzQ8ZWIJY7tT+RoYYq/XJrVo7tQj jmLYdmuzHdGfEqtuUM1gIT982n8G2VDLJt64bJKfxMRl3CaMWnVKXj7LhFnqXulVJdfl 2dcQ== X-Received: by 10.194.184.140 with SMTP id eu12mr64649870wjc.78.1437475948954; Tue, 21 Jul 2015 03:52:28 -0700 (PDT) Received: from [172.28.90.243] ([172.28.90.243]) by smtp.gmail.com with ESMTPSA id e2sm36406344wjw.12.2015.07.21.03.52.26 (version=TLSv1.2 cipher=AES128-GCM-SHA256 bits=128/128); Tue, 21 Jul 2015 03:52:27 -0700 (PDT) Message-ID: <1437475945.9913.7.camel@edumazet-glaptop2.roam.corp.google.com> Subject: Re: [PATCH,v2 net] net: sched: validate that class is found in qdisc_tree_decrease_qlen From: Eric Dumazet To: Jamal Hadi Salim Cc: Alex Gartrell , xiyou.wangcong@gmail.com, davem@davemloft.net, netdev@vger.kernel.org, kernel-team@fb.com, stable@vger.kernel.org Date: Tue, 21 Jul 2015 12:52:25 +0200 In-Reply-To: <55AE1939.105@mojatatu.com> References: <1437421248-2796139-1-git-send-email-agartrell@fb.com> <55AE1939.105@mojatatu.com> X-Mailer: Evolution 3.10.4-0ubuntu2 Mime-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org 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 : --- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html 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] = {