Received: by 2002:a05:7412:2a8c:b0:e2:908c:2ebd with SMTP id u12csp2181010rdh; Tue, 26 Sep 2023 15:27:05 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGxvWr/vwbc/NVRP8EIpWNiWz+uEvWcNmRcORRhRctvyv7OEIpkJA2xQMKNYvZ/5cp4FOYH X-Received: by 2002:a17:902:c44b:b0:1c6:d0a:cf01 with SMTP id m11-20020a170902c44b00b001c60d0acf01mr5137470plm.11.1695767225437; Tue, 26 Sep 2023 15:27:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1695767225; cv=none; d=google.com; s=arc-20160816; b=OVfsQMukD0eekaKn/m6fgChwnx3ZHfSjDUqMglp418p+DkfTLpLNPET70oAfKI/u4s bchUz8HA+XFgxODybNGYo8tqxu04Urd47S4GlQLI71zvBItsK9KVf1wqPn+WjgKQpdWp 3a5LwCys5gdT3p3TfRUNPGZ62xKf8X1qxYtsiZ92rMIsRS4RQfHM2NfXSudyGv9EWJA7 NXw5p6CWrwyOK0IiEd25gqY1d9hCG11EnKyCFUtNBgko35XGgucBCA7QmGCZ2+53y2GB MrVObCPl/poRMUWb67hEbg9QB8+D+dhGEv30N/oFBDNtRml17YkU98tMRlD3ucMxw26x QNBA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from :references:cc:to:content-language:subject:user-agent:mime-version :date:message-id:dkim-signature; bh=k4vOOb0IgYLsXfvHEoqfKZSEDK4RrSP3tNFky23cytY=; fh=R1OkhriIwip1F03SPBPuQjbmUJVFiHc78tVoBI9xOtw=; b=vnc5lhCeavIZsi/jtsDy8ZUdJKtjSXbBfSt+GYbAIR60fIwzFCZw+FOh72JLoE18yA +5pvIptaCzS2C1xjgYECxh8wGLMapniFfRHYqzZTytSQMqj/hcZJcj25soysxAxNIChX WTuvJw4CWNWpBDYPLDBhtjG7Ju1/HOfXNFroqgxbwWxD9lYf1jJ4HsRGAzwPLSrt4VVq qA9renqrLiHOW4Y0gLQB1LQa5cLAZE0rgk+rvhRc33Ho6vh12WrCIqEK37/C0pQnel+z g4O3T2EGR/eeo8LEmjfYI1xl4/hktaUlDLLBhPjUjuPUy5uteyotMKiFj6XHjJPqG63f mLyg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Uxfqb+16; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from snail.vger.email (snail.vger.email. [2620:137:e000::3:7]) by mx.google.com with ESMTPS id e17-20020a17090301d100b001c1e1fe16c7si15382542plh.236.2023.09.26.15.27.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Sep 2023 15:27:05 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) client-ip=2620:137:e000::3:7; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Uxfqb+16; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id 4104D81B8966; Tue, 26 Sep 2023 09:21:59 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235260AbjIZQWB (ORCPT + 99 others); Tue, 26 Sep 2023 12:22:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48854 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235240AbjIZQWA (ORCPT ); Tue, 26 Sep 2023 12:22:00 -0400 Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.31]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E35E811F; Tue, 26 Sep 2023 09:21:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1695745313; x=1727281313; h=message-id:date:mime-version:subject:to:cc:references: from:in-reply-to:content-transfer-encoding; bh=hhnhfS38ZgKucCnA9mX/+vZ/cMiuEyg2xb5xDjHZ6Rk=; b=Uxfqb+162p1/8M0R8BS6pUtUY8sFKrUvkm1N0MuSwcvzFjqFI9vHe7ee ZQkH2uMFBN80x7W1L09uS1B+kKG2wsvDsUEmfdJA0p8njXC81mQtPS5TK MS1GtZgT9Ray+608+OUqgZGvDPUhKcA/F4ZKv45UW39wUu4O31JIzM4Um rE7GT52ThkRFauuZknBQkYqjYzFEwYDDZh5aPRpmKWZIF0CLDP/nON4IH BhaZKpVXwHREU7M8tsqUSU2GxiW2/t8ncAZKKllhpFZNvr4HMgPawe1JJ 39FNOEbXSzdL/tJJTNeNtxWij8YwiEijFnlJi9GXIPUsTx0PFctunQnGz g==; X-IronPort-AV: E=McAfee;i="6600,9927,10845"; a="445739291" X-IronPort-AV: E=Sophos;i="6.03,178,1694761200"; d="scan'208";a="445739291" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Sep 2023 09:21:36 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10845"; a="725489437" X-IronPort-AV: E=Sophos;i="6.03,178,1694761200"; d="scan'208";a="725489437" Received: from linux.intel.com ([10.54.29.200]) by orsmga006.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Sep 2023 09:21:36 -0700 Received: from [10.209.130.196] (kliang2-mobl1.ccr.corp.intel.com [10.209.130.196]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by linux.intel.com (Postfix) with ESMTPS id 53773580D9B; Tue, 26 Sep 2023 09:21:34 -0700 (PDT) Message-ID: Date: Tue, 26 Sep 2023 12:21:33 -0400 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.15.1 Subject: Re: [RFC PATCH 14/25] perf stat: Add build string function and topdown events handling in hardware-grouping Content-Language: en-US To: weilin.wang@intel.com, Ian Rogers , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Adrian Hunter Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Perry Taylor , Samantha Alt , Caleb Biggers , Mark Rutland References: <20230925061824.3818631-1-weilin.wang@intel.com> <20230925061824.3818631-15-weilin.wang@intel.com> From: "Liang, Kan" In-Reply-To: <20230925061824.3818631-15-weilin.wang@intel.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-3.5 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF,NICE_REPLY_A, RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_NONE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Tue, 26 Sep 2023 09:21:59 -0700 (PDT) On 2023-09-25 2:18 a.m., weilin.wang@intel.com wrote: > From: Weilin Wang > > Add the function to generate final grouping strings. This function is > very similar to the existing metricgroup__build_event_string() function. > The difference is that the input data includes a list of grouping lists. > > Topdown events need special handling because they are not included in the > pmu-event JSON file. This should be a temporary solution to group topdown > events. Better solution could be using JSON files to cover these events. > > Signed-off-by: Weilin Wang > --- > tools/perf/util/metricgroup.c | 106 +++++++++++++++++++++++++++++++++- > 1 file changed, 103 insertions(+), 3 deletions(-) > > diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c > index 4b1b0470d..797f831e1 100644 > --- a/tools/perf/util/metricgroup.c > +++ b/tools/perf/util/metricgroup.c > @@ -1895,6 +1895,95 @@ static int assign_event_grouping(struct metricgroup__event_info *e, > return ret; > } > > +static int hw_aware_metricgroup__build_event_string(struct list_head *group_strs, > + const char *modifier, > + struct list_head *groups) > +{ > + struct metricgroup__pmu_group_list *p; > + struct metricgroup__group *g; > + struct metricgroup__group_events *ge; > + bool no_group = true; > + int ret = 0; > + > +#define RETURN_IF_NON_ZERO(x) do { if (x) return x; } while (0) > + > + list_for_each_entry(p, groups, nd) { > + list_for_each_entry(g, &p->group_head, nd) { > + struct strbuf *events; > + struct metricgroup__group_strs *new_group_str = malloc(sizeof(struct metricgroup__group_strs)); > + > + if (!new_group_str) > + return -ENOMEM; > + strbuf_init(&new_group_str->grouping_str, 0); > + events = &new_group_str->grouping_str; > + ret = strbuf_addch(events, '{'); > + RETURN_IF_NON_ZERO(ret); > + no_group = true; > + list_for_each_entry(ge, &g->event_head, nd) { > + const char *sep, *rsep, *id = ge->event_name; > + > + pr_debug("found event %s\n", id); > + > + /* Separate events with commas and open the group if necessary. */ > + if (!no_group) { > + ret = strbuf_addch(events, ','); > + RETURN_IF_NON_ZERO(ret); > + } > + /* > + * Encode the ID as an event string. Add a qualifier for > + * metric_id that is the original name except with characters > + * that parse-events can't parse replaced. For example, > + * 'msr@tsc@' gets added as msr/tsc,metric-id=msr!3tsc!3/ > + */ > + sep = strchr(id, '@'); > + if (sep) { > + ret = strbuf_add(events, id, sep - id); > + RETURN_IF_NON_ZERO(ret); > + ret = strbuf_addch(events, '/'); > + RETURN_IF_NON_ZERO(ret); > + rsep = strrchr(sep, '@'); > + ret = strbuf_add(events, sep + 1, rsep - sep - 1); > + RETURN_IF_NON_ZERO(ret); > + ret = strbuf_addstr(events, ",metric-id="); > + RETURN_IF_NON_ZERO(ret); > + sep = rsep; > + } else { > + sep = strchr(id, ':'); > + if (sep) { > + ret = strbuf_add(events, id, sep - id); > + RETURN_IF_NON_ZERO(ret); > + } else { > + ret = strbuf_addstr(events, id); > + RETURN_IF_NON_ZERO(ret); > + } > + ret = strbuf_addstr(events, "/metric-id="); > + RETURN_IF_NON_ZERO(ret); > + } > + ret = encode_metric_id(events, id); > + RETURN_IF_NON_ZERO(ret); > + ret = strbuf_addstr(events, "/"); > + RETURN_IF_NON_ZERO(ret); > + > + if (sep) { > + ret = strbuf_addstr(events, sep + 1); > + RETURN_IF_NON_ZERO(ret); > + } > + if (modifier) { > + ret = strbuf_addstr(events, modifier); > + RETURN_IF_NON_ZERO(ret); > + } > + no_group = false; > + } > + ret = strbuf_addf(events, "}:W"); We may not need :W, since the counter information has already considered in the method. Thanks, Kan > + RETURN_IF_NON_ZERO(ret); > + pr_debug("events-buf: %s\n", events->buf); > + list_add_tail(&new_group_str->nd, group_strs); > + } > + } > + return ret; > +#undef RETURN_IF_NON_ZERO > +} > + > /** > * create_grouping - Create a list of groups and place all the events of > * event_info_list into these groups. > @@ -1906,8 +1995,8 @@ static int assign_event_grouping(struct metricgroup__event_info *e, > */ > static int create_grouping(struct list_head *pmu_info_list, > struct list_head *event_info_list, > - struct list_head *groupings __maybe_unused, > - const char *modifier __maybe_unused) > + struct list_head *groupings, > + const char *modifier) > { > int ret = 0; > struct metricgroup__event_info *e; > @@ -1923,6 +2012,7 @@ static int create_grouping(struct list_head *pmu_info_list, > if (ret) > goto out; > } > + ret = hw_aware_metricgroup__build_event_string(groupings, modifier, &groups); > out: > metricgroup__free_group_list(&groups); > return ret; > @@ -1951,9 +2041,19 @@ static int hw_aware_build_grouping(struct expr_parse_ctx *ctx __maybe_unused, > #define RETURN_IF_NON_ZERO(x) do { if (x) return x; } while (0) > hashmap__for_each_entry(ctx->ids, cur, bkt) { > const char *id = cur->pkey; > + const char *special_pattern = "topdown-"; > > pr_debug("found event %s\n", id); > - > + if (!strncmp(id, special_pattern, strlen(special_pattern))) { > + struct metricgroup__event_info *event; > + event = event_info__new(id, "core", "0", true); > + if (!event) { > + ret = -ENOMEM; > + goto err_out; > + } > + list_add(&event->nd, &event_info_list); > + continue; > + } > ret = get_metricgroup_events(id, etable, &event_info_list); > if (ret) > goto err_out;