From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.1 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 76860C43387 for ; Fri, 18 Jan 2019 01:14:10 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 3412E20657 for ; Fri, 18 Jan 2019 01:14:10 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="vfrIs+dD" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726754AbfARBOI (ORCPT ); Thu, 17 Jan 2019 20:14:08 -0500 Received: from mail-pf1-f196.google.com ([209.85.210.196]:44445 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726398AbfARBOI (ORCPT ); Thu, 17 Jan 2019 20:14:08 -0500 Received: by mail-pf1-f196.google.com with SMTP id u6so5690116pfh.11 for ; Thu, 17 Jan 2019 17:14:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=7zY5skOaLR4vMILqlYoQwttH6Kq1ZixWP4caltaeOWc=; b=vfrIs+dDELUafszPuO2QOc7nHCLXI382m3ClPW+BK+ecEWqnz+bLfFoec4cULESbvt 9yOC50d4upk5gcUxsV7PPbOtqp1zXRMAJoQcv07XS2PfVHAjMY5iPokxnsMyajXSJ3QU Fmh7dtqxeJye4AXzyOk7e2XIe/th2d2HtrZCPpGiFADja2cpfy9F8W+wpdptdsVWfh4P CcZQr/4UC6rAQrZ0rqQwjRK9ROcSaN2T63NLMDiVZ28bu54Qnz42BZtuPG+mw4k1uoPF SHNKlvDqmDYCZQpLWtNpYRBnoGbNOqR10yLRJP8jB3NWWA98jMp1B8mE5mi76w5OgiDy BBXQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=7zY5skOaLR4vMILqlYoQwttH6Kq1ZixWP4caltaeOWc=; b=HfmhO/0G+k/GdrgDKQr4aayPuyAXDkb8BoiHRK00iGarwTRn2weWTCtiBh5G7QfG2K VEJ22JCMFNfqB8kteXS16B4lh01GJECG5geJ6+SntXWCYOCbUSfoZaKAhgpgMAJZPeRm Ng5D1wyQzkPL5RDrWG54iPhjkYbAtH64leOP0zKFoktkXbHnAHbnpi5Wi+FDpGv97/fc pjoZmi4+rf/c3OxJHIwNaWYXTcNfiZoUU153vO9SZrAnRHSVe3PdVXIY3AaKS8/20sk9 a0urtzNbGrr2i3hpnVIEXIKjcRmk0gVyWuG2p5V3JEzZTkcoCBzXfvf0QP1fWrH7gvtS 8PRQ== X-Gm-Message-State: AJcUukcBK95N5fyoW0jbfzn36FZpZfLP7snpAUa/4Q+eSNRgQNzmInes VaInN7IiPFelcrOohDD4ycWOMaxl X-Google-Smtp-Source: ALg8bN4stFGpfiGoRp51fet0swLA67MFrpNiJIHbdNJF/skbT2S0nFBzwCWgRVz8VDpbdvu31sy1lw== X-Received: by 2002:a62:9657:: with SMTP id c84mr17599160pfe.77.1547774047289; Thu, 17 Jan 2019 17:14:07 -0800 (PST) Received: from tw-172-25-17-123.office.twttr.net ([8.25.197.27]) by smtp.gmail.com with ESMTPSA id c4sm7257482pfm.151.2019.01.17.17.14.06 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 17 Jan 2019 17:14:06 -0800 (PST) From: Cong Wang To: netdev@vger.kernel.org Cc: Cong Wang , Jamal Hadi Salim , Jiri Pirko Subject: [Patch net-next] net_sched: add performance counters for basic filter Date: Thu, 17 Jan 2019 17:14:01 -0800 Message-Id: <20190118011401.28220-1-xiyou.wangcong@gmail.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Similar to u32 filter, it is useful to know how many times we reach each basic filter and how many times we pass the ematch attached to it. Sample output: filter protocol arp pref 49152 basic chain 0 filter protocol arp pref 49152 basic chain 0 handle 0x1 (rule hit 3 success 3) action order 1: gact action pass random type none pass val 0 index 1 ref 1 bind 1 installed 81 sec used 4 sec Action statistics: Sent 126 bytes 3 pkt (dropped 0, overlimits 0 requeues 0) backlog 0b 0p requeues 0 Cc: Jamal Hadi Salim Cc: Jiri Pirko Signed-off-by: Cong Wang --- include/uapi/linux/pkt_cls.h | 7 +++++++ net/sched/cls_basic.c | 25 +++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/include/uapi/linux/pkt_cls.h b/include/uapi/linux/pkt_cls.h index 32a3416b51c3..02ac251be8c4 100644 --- a/include/uapi/linux/pkt_cls.h +++ b/include/uapi/linux/pkt_cls.h @@ -333,12 +333,19 @@ enum { /* Basic filter */ +struct tc_basic_pcnt { + __u64 rcnt; + __u64 rhit; +}; + enum { TCA_BASIC_UNSPEC, TCA_BASIC_CLASSID, TCA_BASIC_EMATCHES, TCA_BASIC_ACT, TCA_BASIC_POLICE, + TCA_BASIC_PCNT, + TCA_BASIC_PAD, __TCA_BASIC_MAX }; diff --git a/net/sched/cls_basic.c b/net/sched/cls_basic.c index 6a5dce8baf19..4a57fec6f306 100644 --- a/net/sched/cls_basic.c +++ b/net/sched/cls_basic.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -35,6 +36,7 @@ struct basic_filter { struct tcf_result res; struct tcf_proto *tp; struct list_head link; + struct tc_basic_pcnt __percpu *pf; struct rcu_work rwork; }; @@ -46,8 +48,10 @@ static int basic_classify(struct sk_buff *skb, const struct tcf_proto *tp, struct basic_filter *f; list_for_each_entry_rcu(f, &head->flist, link) { + __this_cpu_inc(f->pf->rcnt); if (!tcf_em_tree_match(skb, &f->ematches, NULL)) continue; + __this_cpu_inc(f->pf->rhit); *res = f->res; r = tcf_exts_exec(skb, &f->exts, res); if (r < 0) @@ -89,6 +93,7 @@ static void __basic_delete_filter(struct basic_filter *f) tcf_exts_destroy(&f->exts); tcf_em_tree_destroy(&f->ematches); tcf_exts_put_net(&f->exts); + free_percpu(f->pf); kfree(f); } @@ -208,6 +213,11 @@ static int basic_change(struct net *net, struct sk_buff *in_skb, if (err) goto errout; fnew->handle = handle; + fnew->pf = alloc_percpu(struct tc_basic_pcnt); + if (!fnew->pf) { + err = -ENOMEM; + goto errout; + } err = basic_set_parms(net, tp, fnew, base, tb, tca[TCA_RATE], ovr, extack); @@ -231,6 +241,7 @@ static int basic_change(struct net *net, struct sk_buff *in_skb, return 0; errout: + free_percpu(fnew->pf); tcf_exts_destroy(&fnew->exts); kfree(fnew); return err; @@ -265,8 +276,10 @@ static void basic_bind_class(void *fh, u32 classid, unsigned long cl) static int basic_dump(struct net *net, struct tcf_proto *tp, void *fh, struct sk_buff *skb, struct tcmsg *t) { + struct tc_basic_pcnt gpf = {}; struct basic_filter *f = fh; struct nlattr *nest; + int cpu; if (f == NULL) return skb->len; @@ -281,6 +294,18 @@ static int basic_dump(struct net *net, struct tcf_proto *tp, void *fh, nla_put_u32(skb, TCA_BASIC_CLASSID, f->res.classid)) goto nla_put_failure; + for_each_possible_cpu(cpu) { + struct tc_basic_pcnt *pf = per_cpu_ptr(f->pf, cpu); + + gpf.rcnt += pf->rcnt; + gpf.rhit += pf->rhit; + } + + if (nla_put_64bit(skb, TCA_BASIC_PCNT, + sizeof(struct tc_basic_pcnt), + &gpf, TCA_BASIC_PAD)) + goto nla_put_failure; + if (tcf_exts_dump(skb, &f->exts) < 0 || tcf_em_tree_dump(skb, &f->ematches, TCA_BASIC_EMATCHES) < 0) goto nla_put_failure; -- 2.20.1