From nobody Thu Apr 9 09:25:03 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 07B89ECAAA1 for ; Tue, 30 Aug 2022 16:49:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230205AbiH3QtO (ORCPT ); Tue, 30 Aug 2022 12:49:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33410 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229633AbiH3QtL (ORCPT ); Tue, 30 Aug 2022 12:49:11 -0400 Received: from mail-yw1-x114a.google.com (mail-yw1-x114a.google.com [IPv6:2607:f8b0:4864:20::114a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 25449BA162 for ; Tue, 30 Aug 2022 09:49:04 -0700 (PDT) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-33daeaa6b8eso182133007b3.7 for ; Tue, 30 Aug 2022 09:49:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc; bh=TTzZt2MqnQlXfvTzLI7MzZx0sdeqXflvaM4OPZwrit0=; b=LWxnDRkDBU9PC3Z/RMXD1/pPx+42f81N9G3pjnaKh9jFYWInA7UDNwGH9Vl49dOcQo OtWlvneeBw9GZQEfAqvQjVlm2WCpZPVdUsWuoQRARR1izk+d1ZO4ziXPNLckOZ3ivBVz 1/LazNhdZ5T/wNLJOwbtNzkE3jUOVDYK6VLIVGPyGqjWjgr6uUsSBWHfPIuu/i5RdFR1 fS40Bji8+JWHv33iYInieIbyOSeETu1GHZ6tUfgoRGWy40+SPCvirpEkrVJtDFsKX6pF 4EszuIGn5zlvk9NUI0w8D4pQlcj9GZbzbaEuhVMtr4NK0HOuWSyvYZv6CwakKx+x15OS JMeA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc; bh=TTzZt2MqnQlXfvTzLI7MzZx0sdeqXflvaM4OPZwrit0=; b=BvZZ5cSlCdtLuJtJZ3WjGlPUKIp3e4uRwOGdEXHHmQhd1ci/apGi3xxFHUnCUbhHCt eKPpVr4b49Z+6kSBhJzhnsOB2/QTr7q6iRIHXjhrnq4p3mHNnFqikRW5rmTH63VKwfba 9LvLsF5/gW2XpUXVAX7tS1BUm7NqjZR98tmrdydA2F7TM36XrpTyM5DwJ/FwcvvGDjtE 89K0ET4u9lGjD4sKRF4z6kJ273FrcrQOBqw97RpmUton1CUKEpaDP7k8goqJMHXBxpYV 52AFU/ZIeW+ckF8wo1NG8DTJ2PItZNG3t+vCQ3dzwNIwA2AjgcbVvT5JTr8llQSeRXaC GS7Q== X-Gm-Message-State: ACgBeo1CQN4XLa6C8ag2014tMJKcBaz0I8bbQtYblB3hgF/EPCYDlN2J NyJucA+4C8JQegeKss4WnKn2JoGNjQer X-Google-Smtp-Source: AA6agR52AWfpqQYvl/0z5UzBgsYu7Z5fc3HvzYVDoiN8Fqg2ln6CV35ottUScDetIIkDMxxA+Y/suIv+rG7X X-Received: from irogers.svl.corp.google.com ([2620:15c:2d4:203:902c:b0fa:dec9:8767]) (user=irogers job=sendgmr) by 2002:a05:6902:1143:b0:695:7755:2acb with SMTP id p3-20020a056902114300b0069577552acbmr12618883ybu.48.1661878143376; Tue, 30 Aug 2022 09:49:03 -0700 (PDT) Date: Tue, 30 Aug 2022 09:48:39 -0700 In-Reply-To: <20220830164846.401143-1-irogers@google.com> Message-Id: <20220830164846.401143-2-irogers@google.com> Mime-Version: 1.0 References: <20220830164846.401143-1-irogers@google.com> X-Mailer: git-send-email 2.37.2.672.g94769d06f0-goog Subject: [PATCH v1 1/8] perf smt: Tidy header guard add SPDX From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Andi Kleen , Kan Liang , Thomas Richter , James Clark , Miaoqian Lin , John Garry , Zhengjun Xing , Florian Fischer , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, perry.taylor@intel.com, caleb.biggers@intel.com, kshipra.bopardikar@intel.com Cc: Stephane Eranian , Ian Rogers Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Make the header guard consistent with others. Signed-off-by: Ian Rogers --- tools/perf/util/smt.c | 1 + tools/perf/util/smt.h | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/perf/util/smt.c b/tools/perf/util/smt.c index 2b0a36ebf27a..8fed03283c85 100644 --- a/tools/perf/util/smt.c +++ b/tools/perf/util/smt.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0-only #include #include #include diff --git a/tools/perf/util/smt.h b/tools/perf/util/smt.h index b8414b7bcbc8..a98d65808f6a 100644 --- a/tools/perf/util/smt.h +++ b/tools/perf/util/smt.h @@ -1,6 +1,7 @@ -#ifndef SMT_H -#define SMT_H 1 +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __SMT_H +#define __SMT_H 1 =20 int smt_on(void); =20 -#endif +#endif /* __SMT_H */ --=20 2.37.2.672.g94769d06f0-goog From nobody Thu Apr 9 09:25:03 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 788D1ECAAD1 for ; Tue, 30 Aug 2022 16:49:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230153AbiH3Qt3 (ORCPT ); Tue, 30 Aug 2022 12:49:29 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33754 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230171AbiH3Qt0 (ORCPT ); Tue, 30 Aug 2022 12:49:26 -0400 Received: from mail-yw1-x1149.google.com (mail-yw1-x1149.google.com [IPv6:2607:f8b0:4864:20::1149]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 533F1C6B7D for ; Tue, 30 Aug 2022 09:49:10 -0700 (PDT) Received: by mail-yw1-x1149.google.com with SMTP id 00721157ae682-33dce8cae71so183002937b3.8 for ; Tue, 30 Aug 2022 09:49:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc; bh=FIhE9np411d4p3gN9blVTRPdzI3E6ppyXBOT6UPFbR4=; b=OB9LHc8+8o4/iZ0pku4OGrdZbF6yK0SRgaoyCd1QczBcJO/t3tAbU3x/u16rFi6MUs movMoeOJ+FEdjpK3a7cvjtczSoz0sUB4UOCyo484agRRkmpcnekDO6t/TyXwtT+kcNt7 RU6rdtTzp4zAk5j2tjFJ5/MMHobhdviXUreRR8aiFbr4V9mpRA+oUy6gajOepvZ28dYp J+s5cZ30KE9zhdJtEVpUat8aZaRIbXLqOazxoQA/ZUTCA90ZBGi+tqXUVgb/Z0Z36n9Q STSIFswLJqCToWbeoXSPlSKmGrNnWoC3dIj/bd6RkOkd11uwM1gO1uz52IqrpMjhAiq6 qz/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc; bh=FIhE9np411d4p3gN9blVTRPdzI3E6ppyXBOT6UPFbR4=; b=3t28ZSUGpA+tOwkhrBSqrKiXhtugUrgGY4Sr8cbq4yBWBnMe1HcpbeeZAbKUoXyEJF G3r09hqE0qIs/neqiYuwJfq8iBqJ1srdbqvk3Ho7pl7Yc+/xNuZoUI3oKakqDOS1zs90 AuhxMMzYHL/3aQmoyQBcXDwPnuKrjJ/BSL5JQKA2aSttWL3LzzVP+GQgoX9oERR5+NA6 KN9cw7eQo/JFoQZY4R3/vBXCxX3RLdsXJXH0aR1dsVMh95QEempcavGUPO/FJmWJOJvu D1UjbT9Qy54gezuxfHsa1eZrmKw9qJfRBuiTvqbBC2I2mPMs1qR/RqOIsKFm//UhjXX+ Vctw== X-Gm-Message-State: ACgBeo2ooyFogEtiz01lRuK9+jP2XANnLWJiMNzAtKBdrr88HRo7Khe1 lWRzqeBvYxuB4i+cPidAU15lFveWKh93 X-Google-Smtp-Source: AA6agR60NLTVro4NGYnyxknnlRFNT4NfEDW+vIPr4CfSzsgb8ynaczdPxrSsjF2yG4pOZQ0thLLj35ZsE/Of X-Received: from irogers.svl.corp.google.com ([2620:15c:2d4:203:902c:b0fa:dec9:8767]) (user=irogers job=sendgmr) by 2002:a25:1f89:0:b0:696:4d6e:62aa with SMTP id f131-20020a251f89000000b006964d6e62aamr12438386ybf.373.1661878149113; Tue, 30 Aug 2022 09:49:09 -0700 (PDT) Date: Tue, 30 Aug 2022 09:48:40 -0700 In-Reply-To: <20220830164846.401143-1-irogers@google.com> Message-Id: <20220830164846.401143-3-irogers@google.com> Mime-Version: 1.0 References: <20220830164846.401143-1-irogers@google.com> X-Mailer: git-send-email 2.37.2.672.g94769d06f0-goog Subject: [PATCH v1 2/8] perf metric: Return early if no CPU PMU table exists From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Andi Kleen , Kan Liang , Thomas Richter , James Clark , Miaoqian Lin , John Garry , Zhengjun Xing , Florian Fischer , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, perry.taylor@intel.com, caleb.biggers@intel.com, kshipra.bopardikar@intel.com Cc: Stephane Eranian , Ian Rogers Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Previous behavior is to segfault if there is no CPU PMU table and a metric is sought. To reproduce compile with NO_JEVENTS=3D1 then request a metric, for example, "perf stat -M IPC true". Fixes: 00facc760903 ("perf jevents: Switch build to use jevents.py") Signed-off-by: Ian Rogers --- tools/perf/util/metricgroup.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c index ad5cacdecd81..18aae040d61d 100644 --- a/tools/perf/util/metricgroup.c +++ b/tools/perf/util/metricgroup.c @@ -1655,6 +1655,9 @@ int metricgroup__parse_groups(const struct option *op= t, struct evlist *perf_evlist =3D *(struct evlist **)opt->value; const struct pmu_events_table *table =3D pmu_events_table__find(); =20 + if (!table) + return -EINVAL; + return parse_groups(perf_evlist, str, metric_no_group, metric_no_merge, NULL, metric_events, table); } --=20 2.37.2.672.g94769d06f0-goog From nobody Thu Apr 9 09:25:03 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id DE1F8ECAAD1 for ; Tue, 30 Aug 2022 16:49:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230255AbiH3Qtf (ORCPT ); Tue, 30 Aug 2022 12:49:35 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33814 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230226AbiH3Qta (ORCPT ); Tue, 30 Aug 2022 12:49:30 -0400 Received: from mail-yw1-x114a.google.com (mail-yw1-x114a.google.com [IPv6:2607:f8b0:4864:20::114a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EC831CCE1C for ; Tue, 30 Aug 2022 09:49:16 -0700 (PDT) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-33dce8cae71so183004777b3.8 for ; Tue, 30 Aug 2022 09:49:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc; bh=odHu9oIdvGG5Uqss/fdCBkUP/s7a3MyMjrudizWvuiM=; b=YqaB/84L6355lUp5qA3G0U1TjM6sLP6qlWRS90aHbw+JCID++v+ocFenvaXukcRZiz btEjNZ3jE5bZwwC20MfuhJ0MLicERf+azMwjwY04ynDTGtmg5phjXV82ZKYQVsHxcAlK eXyy9LBy3yWhKs2plbSsBL3wXLcsUv7i7zHgS5qnLEMQFItk6ifWkXsjklnQCf5Qx77k 3dRPNSdqnHVtyCgNPMw7SdAxw01UnEZT8wfnsySTEtVw3M+H+GJZv5gWJf15zhGmtbhh S2P0WuabjciP8msWLGYRjgApvAMAzHiE/qeoolHc0Gug1fMjX+s5Pexz7YKxgw7VCVw0 LWCw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc; bh=odHu9oIdvGG5Uqss/fdCBkUP/s7a3MyMjrudizWvuiM=; b=3OrJTr3PZbRPuAoYloCcq8CPAADv/oRxg1TPLtlJ+wOV8FgmTngFcBmSDAMlW/Xnqs DaFW3uw8g00ww+q3xhTfLlEtuOkATGM09VbOIe0F/4wdCLNm0teh6hN/2K0Q2mnksSm0 2SNraf3rNQ2muxSqcDiVuFUeqMZHkWVfU7FbSMCvEtXYC4KL/LynkjkDpxiyebWdfNtf t3a34ZDhiM+TEj77tGTemqVRCdVxVLlI5hycrfUcFWrh+4c6cxY8nQMkqkjQW9hfh+rI E7B3UCrXemiDV94bkHBhdDDUgBXU0Cal5wJ3BF0JOcJAgcSceEtRO/teoOva9hMYggxH r0pg== X-Gm-Message-State: ACgBeo2hK0CGNnQGrfOaauD9i3rUtKHe1eT4Fkk7AcjaEvdJkNMGvAe+ CBqLqV0k7vzUiO2fuhvXIjW5S3DB9Y1W X-Google-Smtp-Source: AA6agR7X9hKxwDIGVbB6qPRnX3EOKZxMUd5dAbThYH3DDmSTRtjl079C74XG6sfYzgdS/gfe7Y0MmIGx06Ik X-Received: from irogers.svl.corp.google.com ([2620:15c:2d4:203:902c:b0fa:dec9:8767]) (user=irogers job=sendgmr) by 2002:a25:4110:0:b0:696:4e11:3b9 with SMTP id o16-20020a254110000000b006964e1103b9mr11849466yba.287.1661878156138; Tue, 30 Aug 2022 09:49:16 -0700 (PDT) Date: Tue, 30 Aug 2022 09:48:41 -0700 In-Reply-To: <20220830164846.401143-1-irogers@google.com> Message-Id: <20220830164846.401143-4-irogers@google.com> Mime-Version: 1.0 References: <20220830164846.401143-1-irogers@google.com> X-Mailer: git-send-email 2.37.2.672.g94769d06f0-goog Subject: [PATCH v1 3/8] perf expr: Move the scanner_ctx into the parse_ctx From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Andi Kleen , Kan Liang , Thomas Richter , James Clark , Miaoqian Lin , John Garry , Zhengjun Xing , Florian Fischer , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, perry.taylor@intel.com, caleb.biggers@intel.com, kshipra.bopardikar@intel.com Cc: Stephane Eranian , Ian Rogers Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" We currently maintain the two independently and copy from one to the other. This is a burden when additional scanner context values are necessary, so combine them. Signed-off-by: Ian Rogers --- tools/perf/tests/expr.c | 2 +- tools/perf/util/expr.c | 7 ++----- tools/perf/util/expr.h | 10 +++++----- tools/perf/util/metricgroup.c | 4 ++-- tools/perf/util/stat-shadow.c | 2 +- 5 files changed, 11 insertions(+), 14 deletions(-) diff --git a/tools/perf/tests/expr.c b/tools/perf/tests/expr.c index 2efe9e3a63b8..7ca5e37de560 100644 --- a/tools/perf/tests/expr.c +++ b/tools/perf/tests/expr.c @@ -133,7 +133,7 @@ static int test__expr(struct test_suite *t __maybe_unus= ed, int subtest __maybe_u (void **)&val_ptr)); =20 expr__ctx_clear(ctx); - ctx->runtime =3D 3; + ctx->sctx.runtime =3D 3; TEST_ASSERT_VAL("find ids", expr__find_ids("EVENT1\\,param\\=3D?@ + EVENT2\\,param\\=3D?@", NULL, ctx) =3D=3D 0); diff --git a/tools/perf/util/expr.c b/tools/perf/util/expr.c index c15a9852fa41..00bde682e743 100644 --- a/tools/perf/util/expr.c +++ b/tools/perf/util/expr.c @@ -310,7 +310,7 @@ struct expr_parse_ctx *expr__ctx_new(void) free(ctx); return NULL; } - ctx->runtime =3D 0; + ctx->sctx.runtime =3D 0; =20 return ctx; } @@ -344,16 +344,13 @@ static int __expr__parse(double *val, struct expr_parse_ctx *ctx, const char *expr, bool compute_ids) { - struct expr_scanner_ctx scanner_ctx =3D { - .runtime =3D ctx->runtime, - }; YY_BUFFER_STATE buffer; void *scanner; int ret; =20 pr_debug2("parsing metric: %s\n", expr); =20 - ret =3D expr_lex_init_extra(&scanner_ctx, &scanner); + ret =3D expr_lex_init_extra(&ctx->sctx, &scanner); if (ret) return ret; =20 diff --git a/tools/perf/util/expr.h b/tools/perf/util/expr.h index bd2116983bbb..de9b886ec49a 100644 --- a/tools/perf/util/expr.h +++ b/tools/perf/util/expr.h @@ -13,17 +13,17 @@ =20 struct metric_ref; =20 +struct expr_scanner_ctx { + int runtime; +}; + struct expr_parse_ctx { struct hashmap *ids; - int runtime; + struct expr_scanner_ctx sctx; }; =20 struct expr_id_data; =20 -struct expr_scanner_ctx { - int runtime; -}; - struct hashmap *ids__new(void); void ids__free(struct hashmap *ids); int ids__insert(struct hashmap *ids, const char *id); diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c index 18aae040d61d..b144c3e35264 100644 --- a/tools/perf/util/metricgroup.c +++ b/tools/perf/util/metricgroup.c @@ -215,7 +215,7 @@ static struct metric *metric__new(const struct pmu_even= t *pe, } m->metric_expr =3D pe->metric_expr; m->metric_unit =3D pe->unit; - m->pctx->runtime =3D runtime; + m->pctx->sctx.runtime =3D runtime; m->has_constraint =3D metric_no_group || metricgroup__has_constraint(pe); m->metric_refs =3D NULL; m->evlist =3D NULL; @@ -1626,7 +1626,7 @@ static int parse_groups(struct evlist *perf_evlist, c= onst char *str, } expr->metric_unit =3D m->metric_unit; expr->metric_events =3D metric_events; - expr->runtime =3D m->pctx->runtime; + expr->runtime =3D m->pctx->sctx.runtime; list_add(&expr->nd, &me->head); } =20 diff --git a/tools/perf/util/stat-shadow.c b/tools/perf/util/stat-shadow.c index 979c8cb918f7..1439acd109db 100644 --- a/tools/perf/util/stat-shadow.c +++ b/tools/perf/util/stat-shadow.c @@ -911,7 +911,7 @@ static void generic_metric(struct perf_stat_config *con= fig, if (!pctx) return; =20 - pctx->runtime =3D runtime; + pctx->sctx.runtime =3D runtime; i =3D prepare_metric(metric_events, metric_refs, pctx, cpu_map_idx, st); if (i < 0) { expr__ctx_free(pctx); --=20 2.37.2.672.g94769d06f0-goog From nobody Thu Apr 9 09:25:03 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 451A1ECAAD8 for ; Tue, 30 Aug 2022 16:49:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230293AbiH3Qtt (ORCPT ); Tue, 30 Aug 2022 12:49:49 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34146 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230041AbiH3Qto (ORCPT ); Tue, 30 Aug 2022 12:49:44 -0400 Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 59F32B6D08 for ; Tue, 30 Aug 2022 09:49:24 -0700 (PDT) Received: by mail-yb1-xb49.google.com with SMTP id n16-20020a258d10000000b0068df1e297c0so171834ybl.15 for ; Tue, 30 Aug 2022 09:49:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc; bh=UUVPQFoHB4SWNXVjnYdqps9D8vjoKXb+eUEK4kYsPDY=; b=COs46NUpjp4Yte74wDg1/odWFzJUV7jAt3zpJRCqIY02yX9ausfsQfvjUlbGQl3f02 ItysQbeKJ0jGa1lQ62ak1VCH0ToVtRnVX2LXkSLPxGaV33UCDj3znT5TGIOMCvb7ETre ONrbfUylCSA5fU5v3NkZuF/GyNbBkz+bAmFHoDeHrZLyxrBwDIinQefO6c+lWHWtZs9X n+cvC6dwpeZMPIBNsYS/jwefRZJ64a2FMSpGJElTmJRPxwNONiJCx17oIrNcGgVjChd4 a5t/85hiHyjUQHCmkt5K2OSlLAM50mke+1aSHuVsfwSvxpNVpzDdWvlJSHxDY2BJjYO+ 6I2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc; bh=UUVPQFoHB4SWNXVjnYdqps9D8vjoKXb+eUEK4kYsPDY=; b=LrqLcA2GRP2kk3ppx0Hnz7e2LYnA9476M+OhLkH0DuNFi+qIOwF3yC/vckFeLVrxOj cjGB9pvl9j4ZBNCq1nIMcZlFbvnEdSj0zeIW41fUo39IytoBZpnEZA/cKd5UIE4RLC8x TgkwjO6cvo3rZBNhc2wrx0RHPf2tz50nNaiV//YTqSSZhcvhV3bp1XdwucffQRVGQok1 F0tzDt9X3GAGrH7u+RiEEWizkMPcIHhQfpMjaOD+lgIH1xK2P/YkcUcJSqRug8TztU3x koArbVJFwgy94lv7fDuN7n9XradFvSqji1gM5Dts89wiMXEoAfhLQpFEcIEp/mChejLs uaJw== X-Gm-Message-State: ACgBeo2UODh6/4l3eMbCJVI8De3Gu0oDb43FJlVVtkfkw2epbNIMkMma WdksIYYsnrsVwim3dVySVqOlRUZsdiZm X-Google-Smtp-Source: AA6agR6ejKKMnALfMTb+Uq2QIuTOe4fgEpnF47oNN5AqXYHOwcaTrWguvq9WPjPtJsSUOSMxFYrVkkAFwSfv X-Received: from irogers.svl.corp.google.com ([2620:15c:2d4:203:902c:b0fa:dec9:8767]) (user=irogers job=sendgmr) by 2002:a0d:c681:0:b0:33c:2e21:4756 with SMTP id i123-20020a0dc681000000b0033c2e214756mr14585065ywd.467.1661878163051; Tue, 30 Aug 2022 09:49:23 -0700 (PDT) Date: Tue, 30 Aug 2022 09:48:42 -0700 In-Reply-To: <20220830164846.401143-1-irogers@google.com> Message-Id: <20220830164846.401143-5-irogers@google.com> Mime-Version: 1.0 References: <20220830164846.401143-1-irogers@google.com> X-Mailer: git-send-email 2.37.2.672.g94769d06f0-goog Subject: [PATCH v1 4/8] perf smt: Compute SMT from topology From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Andi Kleen , Kan Liang , Thomas Richter , James Clark , Miaoqian Lin , John Garry , Zhengjun Xing , Florian Fischer , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, perry.taylor@intel.com, caleb.biggers@intel.com, kshipra.bopardikar@intel.com Cc: Stephane Eranian , Ian Rogers Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The topology records sibling threads. Rather than computing SMT using siblings in sysfs, reuse the values in topology. This only applies when the file smt/active isn't available. Signed-off-by: Ian Rogers --- tools/perf/tests/expr.c | 24 ++++++---- tools/perf/util/cputopo.c | 15 +++++++ tools/perf/util/cputopo.h | 2 + tools/perf/util/expr.c | 9 ++-- tools/perf/util/smt.c | 95 ++++----------------------------------- tools/perf/util/smt.h | 5 ++- 6 files changed, 49 insertions(+), 101 deletions(-) diff --git a/tools/perf/tests/expr.c b/tools/perf/tests/expr.c index 7ca5e37de560..db736ed49556 100644 --- a/tools/perf/tests/expr.c +++ b/tools/perf/tests/expr.c @@ -1,4 +1,5 @@ // SPDX-License-Identifier: GPL-2.0 +#include "util/cputopo.h" #include "util/debug.h" #include "util/expr.h" #include "util/header.h" @@ -154,15 +155,20 @@ static int test__expr(struct test_suite *t __maybe_un= used, int subtest __maybe_u (void **)&val_ptr)); =20 /* Only EVENT1 or EVENT2 need be measured depending on the value of smt_o= n. */ - expr__ctx_clear(ctx); - TEST_ASSERT_VAL("find ids", - expr__find_ids("EVENT1 if #smt_on else EVENT2", - NULL, ctx) =3D=3D 0); - TEST_ASSERT_VAL("find ids", hashmap__size(ctx->ids) =3D=3D 1); - TEST_ASSERT_VAL("find ids", hashmap__find(ctx->ids, - smt_on() ? "EVENT1" : "EVENT2", - (void **)&val_ptr)); - + { + struct cpu_topology *topology =3D cpu_topology__new(); + bool smton =3D smt_on(topology); + + cpu_topology__delete(topology); + expr__ctx_clear(ctx); + TEST_ASSERT_VAL("find ids", + expr__find_ids("EVENT1 if #smt_on else EVENT2", + NULL, ctx) =3D=3D 0); + TEST_ASSERT_VAL("find ids", hashmap__size(ctx->ids) =3D=3D 1); + TEST_ASSERT_VAL("find ids", hashmap__find(ctx->ids, + smton ? "EVENT1" : "EVENT2", + (void **)&val_ptr)); + } /* The expression is a constant 1.0 without needing to evaluate EVENT1. */ expr__ctx_clear(ctx); TEST_ASSERT_VAL("find ids", diff --git a/tools/perf/util/cputopo.c b/tools/perf/util/cputopo.c index d275d843c155..511002e52714 100644 --- a/tools/perf/util/cputopo.c +++ b/tools/perf/util/cputopo.c @@ -157,6 +157,21 @@ void cpu_topology__delete(struct cpu_topology *tp) free(tp); } =20 +bool cpu_topology__smt_on(const struct cpu_topology *topology) +{ + for (u32 i =3D 0; i < topology->core_cpus_lists; i++) { + const char *cpu_list =3D topology->core_cpus_list[i]; + + /* + * If there is a need to separate siblings in a core then SMT is + * enabled. + */ + if (strchr(cpu_list, ',') || strchr(cpu_list, '-')) + return true; + } + return false; +} + static bool has_die_topology(void) { char filename[MAXPATHLEN]; diff --git a/tools/perf/util/cputopo.h b/tools/perf/util/cputopo.h index 854e18f9041e..469db775a13c 100644 --- a/tools/perf/util/cputopo.h +++ b/tools/perf/util/cputopo.h @@ -58,6 +58,8 @@ struct hybrid_topology { =20 struct cpu_topology *cpu_topology__new(void); void cpu_topology__delete(struct cpu_topology *tp); +/* Determine from the core list whether SMT was enabled. */ +bool cpu_topology__smt_on(const struct cpu_topology *topology); =20 struct numa_topology *numa_topology__new(void); void numa_topology__delete(struct numa_topology *tp); diff --git a/tools/perf/util/expr.c b/tools/perf/util/expr.c index 00bde682e743..8aa7dafa18b3 100644 --- a/tools/perf/util/expr.c +++ b/tools/perf/util/expr.c @@ -412,11 +412,6 @@ double expr__get_literal(const char *literal) static struct cpu_topology *topology; double result =3D NAN; =20 - if (!strcasecmp("#smt_on", literal)) { - result =3D smt_on() > 0 ? 1.0 : 0.0; - goto out; - } - if (!strcmp("#num_cpus", literal)) { result =3D cpu__max_present_cpu().cpu; goto out; @@ -440,6 +435,10 @@ double expr__get_literal(const char *literal) goto out; } } + if (!strcasecmp("#smt_on", literal)) { + result =3D smt_on(topology) ? 1.0 : 0.0; + goto out; + } if (!strcmp("#num_packages", literal)) { result =3D topology->package_cpus_lists; goto out; diff --git a/tools/perf/util/smt.c b/tools/perf/util/smt.c index 8fed03283c85..ce90c4ee4138 100644 --- a/tools/perf/util/smt.c +++ b/tools/perf/util/smt.c @@ -1,100 +1,23 @@ // SPDX-License-Identifier: GPL-2.0-only -#include -#include -#include -#include +#include #include "api/fs/fs.h" +#include "cputopo.h" #include "smt.h" =20 -/** - * hweight_str - Returns the number of bits set in str. Stops at first non= -hex - * or ',' character. - */ -static int hweight_str(char *str) -{ - int result =3D 0; - - while (*str) { - switch (*str++) { - case '0': - case ',': - break; - case '1': - case '2': - case '4': - case '8': - result++; - break; - case '3': - case '5': - case '6': - case '9': - case 'a': - case 'A': - case 'c': - case 'C': - result +=3D 2; - break; - case '7': - case 'b': - case 'B': - case 'd': - case 'D': - case 'e': - case 'E': - result +=3D 3; - break; - case 'f': - case 'F': - result +=3D 4; - break; - default: - goto done; - } - } -done: - return result; -} - -int smt_on(void) +bool smt_on(const struct cpu_topology *topology) { static bool cached; - static int cached_result; - int cpu; - int ncpu; + static bool cached_result; + int fs_value; =20 if (cached) return cached_result; =20 - if (sysfs__read_int("devices/system/cpu/smt/active", &cached_result) >=3D= 0) { - cached =3D true; - return cached_result; - } - - cached_result =3D 0; - ncpu =3D sysconf(_SC_NPROCESSORS_CONF); - for (cpu =3D 0; cpu < ncpu; cpu++) { - unsigned long long siblings; - char *str; - size_t strlen; - char fn[256]; + if (sysfs__read_int("devices/system/cpu/smt/active", &fs_value) >=3D 0) + cached_result =3D (fs_value =3D=3D 1); + else + cached_result =3D cpu_topology__smt_on(topology); =20 - snprintf(fn, sizeof fn, - "devices/system/cpu/cpu%d/topology/thread_siblings", cpu); - if (sysfs__read_str(fn, &str, &strlen) < 0) { - snprintf(fn, sizeof fn, - "devices/system/cpu/cpu%d/topology/core_cpus", cpu); - if (sysfs__read_str(fn, &str, &strlen) < 0) - continue; - } - /* Entry is hex, but does not have 0x, so need custom parser */ - siblings =3D hweight_str(str); - free(str); - if (siblings > 1) { - cached_result =3D 1; - break; - } - } cached =3D true; return cached_result; } diff --git a/tools/perf/util/smt.h b/tools/perf/util/smt.h index a98d65808f6a..e26999c6b8d4 100644 --- a/tools/perf/util/smt.h +++ b/tools/perf/util/smt.h @@ -2,6 +2,9 @@ #ifndef __SMT_H #define __SMT_H 1 =20 -int smt_on(void); +struct cpu_topology; + +/* Returns true if SMT (aka hyperthreading) is enabled. */ +bool smt_on(const struct cpu_topology *topology); =20 #endif /* __SMT_H */ --=20 2.37.2.672.g94769d06f0-goog From nobody Thu Apr 9 09:25:03 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id EC9DDECAAA1 for ; Tue, 30 Aug 2022 16:50:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230350AbiH3QuB (ORCPT ); Tue, 30 Aug 2022 12:50:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34694 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230041AbiH3Qtw (ORCPT ); Tue, 30 Aug 2022 12:49:52 -0400 Received: from mail-yw1-x1149.google.com (mail-yw1-x1149.google.com [IPv6:2607:f8b0:4864:20::1149]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BC64FC59CC for ; Tue, 30 Aug 2022 09:49:30 -0700 (PDT) Received: by mail-yw1-x1149.google.com with SMTP id 00721157ae682-340ae84fb7dso151270487b3.17 for ; Tue, 30 Aug 2022 09:49:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc; bh=DV+gDUOPXsEDpKSEUMrteZ0JJtXsJvhmDLffo2hWpR8=; b=FHB7PM2j7Xeb6mu0pXr6OabKqA+ucAkaLujSNh8phIUwCsHQ/Bx6cVqqzkC/bbQDc+ zJg39zJWO3ca5WcRBFATR+1rxH7/BC/iYXV0UsOrgkYAE1hK8W6O2NyhP7jgqfpS2QtL 0pzhYGvRsbWUxXcR3hyEqyawnT2qUxI3KfX8sfU3/9k+o1iAyrGSYkw+XY5KhJbr5iT8 6HcJQlciQakfpYFGLW5kNXPmt7xguF/L0k9YlEmqDcGb+js73xZASRIeZMJ0ry/WRUEQ siNMSUGK/R15Np7WfDqyImSiDh3PHvrnMnoOFV7Pl9RAV4FOeX29rI0vp04Zu9WXOwD5 rToA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc; bh=DV+gDUOPXsEDpKSEUMrteZ0JJtXsJvhmDLffo2hWpR8=; b=PZvQKXB4OBGtcexynsniqU4nOWxD6w2pU+eaNY7pkbpJ8EClg0dXHia5v7WILETZvI TXUXoZn3S18eraL2RawJcacT3vOeOe4TpkhI8o7+o8c9VlKf3H91nXXUz4KIyXpbiWmN pBtk63ozMTMBEMa7KSw9ENBaXsbMiEYwyVez92NaoQxzHVTrV4flrE4+x+9UZgldCwLP PCgbxiWHViw3WzM9oj7mkN8r+ECtP053MFD283YAwzjJMvMWCiAteG9MNMCw8ClsyMIq CKILkToDLUJT+bhqI5VRrbFi1r+SPeMFRSQzFRglokGyxQJfEQqFg6qHbyy4JXKKpqcZ z/bw== X-Gm-Message-State: ACgBeo3m4JZunTsQzKYwo64HE9J9n/rHeewp4hVHBezV292HT5w4AzNU TaarIiX6iYm1XdTWUnEVn3d4l3Ckmkfd X-Google-Smtp-Source: AA6agR7wqSfk4V3dmq5v75RMPfe9d60+K2s+ywCgsnrfucZ88FHMG8JTsA+1F2a1F5BmMiDY/XMFKV9wml6b X-Received: from irogers.svl.corp.google.com ([2620:15c:2d4:203:902c:b0fa:dec9:8767]) (user=irogers job=sendgmr) by 2002:a25:e6c1:0:b0:696:5017:2020 with SMTP id d184-20020a25e6c1000000b0069650172020mr11854378ybh.49.1661878170007; Tue, 30 Aug 2022 09:49:30 -0700 (PDT) Date: Tue, 30 Aug 2022 09:48:43 -0700 In-Reply-To: <20220830164846.401143-1-irogers@google.com> Message-Id: <20220830164846.401143-6-irogers@google.com> Mime-Version: 1.0 References: <20220830164846.401143-1-irogers@google.com> X-Mailer: git-send-email 2.37.2.672.g94769d06f0-goog Subject: [PATCH v1 5/8] perf topology: Add core_wide From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Andi Kleen , Kan Liang , Thomas Richter , James Clark , Miaoqian Lin , John Garry , Zhengjun Xing , Florian Fischer , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, perry.taylor@intel.com, caleb.biggers@intel.com, kshipra.bopardikar@intel.com Cc: Stephane Eranian , Ian Rogers Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" It is possible to optimize metrics when all SMT threads (CPUs) on a core are measuring events in system wide mode. For example, TMA metrics defines CORE_CLKS for Sandybrdige as: if SMT is disabled: CPU_CLK_UNHALTED.THREAD if SMT is enabled and recording on all SMT threads: CPU_CLK_UNHALTED.THREAD_ANY / 2 if SMT is enabled and not recording on all SMT threads: (CPU_CLK_UNHALTED.THREAD/2)* (1+CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE/CPU_CLK_UNHALTED.REF_XCLK ) That is two more events are necessary when not gathering counts on all SMT threads. To distinguish all SMT threads on a core vs system wide (all CPUs) call the new property core wide. Add a core wide test that determines the property from user requested CPUs, the topology and system wide. System wide is required as other processes running on a SMT thread will change the counts. Signed-off-by: Ian Rogers --- tools/perf/util/cputopo.c | 46 +++++++++++++++++++++++++++++++++++++++ tools/perf/util/cputopo.h | 3 +++ tools/perf/util/smt.c | 14 ++++++++++++ tools/perf/util/smt.h | 7 ++++++ 4 files changed, 70 insertions(+) diff --git a/tools/perf/util/cputopo.c b/tools/perf/util/cputopo.c index 511002e52714..1a3ff6449158 100644 --- a/tools/perf/util/cputopo.c +++ b/tools/perf/util/cputopo.c @@ -172,6 +172,52 @@ bool cpu_topology__smt_on(const struct cpu_topology *t= opology) return false; } =20 +bool cpu_topology__core_wide(const struct cpu_topology *topology, + const char *user_requested_cpu_list) +{ + struct perf_cpu_map *user_requested_cpus; + + /* + * If user_requested_cpu_list is empty then all CPUs are recorded and so + * core_wide is true. + */ + if (!user_requested_cpu_list) + return true; + + user_requested_cpus =3D perf_cpu_map__new(user_requested_cpu_list); + /* Check that every user requested CPU is the complete set of SMT threads= on a core. */ + for (u32 i =3D 0; i < topology->core_cpus_lists; i++) { + const char *core_cpu_list =3D topology->core_cpus_list[i]; + struct perf_cpu_map *core_cpus =3D perf_cpu_map__new(core_cpu_list); + struct perf_cpu cpu; + int idx; + bool has_first, first =3D true; + + perf_cpu_map__for_each_cpu(cpu, idx, core_cpus) { + if (first) { + has_first =3D perf_cpu_map__has(user_requested_cpus, cpu); + first =3D false; + } else { + /* + * If the first core CPU is user requested then + * all subsequent CPUs in the core must be user + * requested too. If the first CPU isn't user + * requested then none of the others must be + * too. + */ + if (perf_cpu_map__has(user_requested_cpus, cpu) !=3D has_first) { + perf_cpu_map__put(core_cpus); + perf_cpu_map__put(user_requested_cpus); + return false; + } + } + } + perf_cpu_map__put(core_cpus); + } + perf_cpu_map__put(user_requested_cpus); + return true; +} + static bool has_die_topology(void) { char filename[MAXPATHLEN]; diff --git a/tools/perf/util/cputopo.h b/tools/perf/util/cputopo.h index 469db775a13c..969e5920a00e 100644 --- a/tools/perf/util/cputopo.h +++ b/tools/perf/util/cputopo.h @@ -60,6 +60,9 @@ struct cpu_topology *cpu_topology__new(void); void cpu_topology__delete(struct cpu_topology *tp); /* Determine from the core list whether SMT was enabled. */ bool cpu_topology__smt_on(const struct cpu_topology *topology); +/* Are the sets of SMT siblings all enabled or all disabled in user_reques= ted_cpus. */ +bool cpu_topology__core_wide(const struct cpu_topology *topology, + const char *user_requested_cpu_list); =20 struct numa_topology *numa_topology__new(void); void numa_topology__delete(struct numa_topology *tp); diff --git a/tools/perf/util/smt.c b/tools/perf/util/smt.c index ce90c4ee4138..994e9e418227 100644 --- a/tools/perf/util/smt.c +++ b/tools/perf/util/smt.c @@ -21,3 +21,17 @@ bool smt_on(const struct cpu_topology *topology) cached =3D true; return cached_result; } + +bool core_wide(bool system_wide, const char *user_requested_cpu_list, + const struct cpu_topology *topology) +{ + /* If not everything running on a core is being recorded then we can't us= e core_wide. */ + if (!system_wide) + return false; + + /* Cheap case that SMT is disabled and therefore we're inherently core_wi= de. */ + if (!smt_on(topology)) + return true; + + return cpu_topology__core_wide(topology, user_requested_cpu_list); +} diff --git a/tools/perf/util/smt.h b/tools/perf/util/smt.h index e26999c6b8d4..ae9095f2c38c 100644 --- a/tools/perf/util/smt.h +++ b/tools/perf/util/smt.h @@ -7,4 +7,11 @@ struct cpu_topology; /* Returns true if SMT (aka hyperthreading) is enabled. */ bool smt_on(const struct cpu_topology *topology); =20 +/* + * Returns true when system wide and all SMT threads for a core are in the + * user_requested_cpus map. + */ +bool core_wide(bool system_wide, const char *user_requested_cpu_list, + const struct cpu_topology *topology); + #endif /* __SMT_H */ --=20 2.37.2.672.g94769d06f0-goog From nobody Thu Apr 9 09:25:03 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 675B7ECAAD8 for ; Tue, 30 Aug 2022 16:50:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230092AbiH3QuU (ORCPT ); Tue, 30 Aug 2022 12:50:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35570 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230329AbiH3QuC (ORCPT ); Tue, 30 Aug 2022 12:50:02 -0400 Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E8763B8F16 for ; Tue, 30 Aug 2022 09:49:43 -0700 (PDT) Received: by mail-yb1-xb4a.google.com with SMTP id s15-20020a5b044f000000b00680c4eb89f1so170325ybp.7 for ; Tue, 30 Aug 2022 09:49:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc; bh=UaYLGnXSHOjhMWZ30heQH6ZXdh5cOP0FJqcTp4jtF4w=; b=oTN9KhHjcP0AfblEbs3Q7NbkeKAyOaKREksXavFwUQxmsgajHOMpG8RNoVjleKBAgM Ebs10bqWy1dYxrCQvDyivOwPcvK0DV6slhJSpIKoxwAWlQkcXCS3SPhlnR3Q58E3rjxy 9LefxvaqfDh3W8r0VBvBnqIT7mfPHvR2uqwQXQR9aP5bx/06QW6MxhipI7jztgL2T9ra 6TPP+Xa2mZEJzzUP8NTo1kC98RGLYfl+v9r26juXPkh4LduIGJtnqIaA7JWKMZNtsXc9 TSmciWithtMWhS9Uyn5OqIV+pkoOLtUKzu2yFOiMVieu42u+26PQzW/jZEGz9LJDHR4S jLiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc; bh=UaYLGnXSHOjhMWZ30heQH6ZXdh5cOP0FJqcTp4jtF4w=; b=mwRxAr3yLCZVtg/WNckorjZGObFq5yKmfpGaNoiiPPCLMsIUgn3D5Vdkp6AztsDB6+ dbmc1Pd5aW+zi5JQIDJ3Q2Mzgvm4IZ/OYSpzG4MtEBIOpomnZJVy6zxLnXxLwfKWEkba r+YTcOUMJ23cSTUi92Oceodmqb0PQ1pAEMOE7bXIszM2u0dsb6K7rx7smNoGGo5V1KI+ jTGLjgtuaseA8K/NURtLfsjRpds4oKOqfItvmoUQZMJlIqNHZ9IfoBYRmCts83pR0tc6 6zXkoiSGyzp7YlSZFPiMyMmCOCmuqC+OjDFzAYtH0htsO7tG5jD0MmwIbR4kmrrqYj88 nzRQ== X-Gm-Message-State: ACgBeo39JoslByYeu2D3DASfk1AZsnJztxF4+c6kUjIpglwHaKvWLoN/ PB87y0QwbUjeV3eoAr8VxE03B15UqL7q X-Google-Smtp-Source: AA6agR6J1O+V+Nt9fLvS8RK117oZYQF/w6JmVykwj5TdihpD8bEuo6Mwfx2VdXnkW03hDBYVcuAqjfMvlXkv X-Received: from irogers.svl.corp.google.com ([2620:15c:2d4:203:902c:b0fa:dec9:8767]) (user=irogers job=sendgmr) by 2002:a5b:e8c:0:b0:696:4b76:3c with SMTP id z12-20020a5b0e8c000000b006964b76003cmr12540073ybr.168.1661878177917; Tue, 30 Aug 2022 09:49:37 -0700 (PDT) Date: Tue, 30 Aug 2022 09:48:44 -0700 In-Reply-To: <20220830164846.401143-1-irogers@google.com> Message-Id: <20220830164846.401143-7-irogers@google.com> Mime-Version: 1.0 References: <20220830164846.401143-1-irogers@google.com> X-Mailer: git-send-email 2.37.2.672.g94769d06f0-goog Subject: [PATCH v1 6/8] perf stat: Delay metric parsing From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Andi Kleen , Kan Liang , Thomas Richter , James Clark , Miaoqian Lin , John Garry , Zhengjun Xing , Florian Fischer , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, perry.taylor@intel.com, caleb.biggers@intel.com, kshipra.bopardikar@intel.com Cc: Stephane Eranian , Ian Rogers Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Having metric parsing as part of argument processing causes issues as flags like metric-no-group may be specified later. It also denies the opportunity to optimize the events on SMT systems where fewer events may be possible if we know the target is system-wide. Move metric parsing to after command line option parsing. Because of how stat runs this moves the parsing after record/report which fail to work with metrics currently anyway. Signed-off-by: Ian Rogers --- tools/perf/builtin-stat.c | 48 ++++++++++++++++++++++++----------- tools/perf/util/metricgroup.c | 3 +-- tools/perf/util/metricgroup.h | 2 +- 3 files changed, 35 insertions(+), 18 deletions(-) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 7fb81a44672d..c813b1aa7d7c 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -191,6 +191,7 @@ static bool append_file; static bool interval_count; static const char *output_name; static int output_fd; +static char *metrics; =20 struct perf_stat { bool record; @@ -1147,14 +1148,21 @@ static int enable_metric_only(const struct option *= opt __maybe_unused, return 0; } =20 -static int parse_metric_groups(const struct option *opt, +static int append_metric_groups(const struct option *opt __maybe_unused, const char *str, int unset __maybe_unused) { - return metricgroup__parse_groups(opt, str, - stat_config.metric_no_group, - stat_config.metric_no_merge, - &stat_config.metric_events); + if (metrics) { + char *tmp; + + if (asprintf(&tmp, "%s,%s", metrics, str) < 0) + return -ENOMEM; + free(metrics); + metrics =3D tmp; + } else { + metrics =3D strdup(str); + } + return 0; } =20 static int parse_control_option(const struct option *opt, @@ -1298,7 +1306,7 @@ static struct option stat_options[] =3D { "measure SMI cost"), OPT_CALLBACK('M', "metrics", &evsel_list, "metric/metric group list", "monitor specified metrics or metric groups (separated by ,)", - parse_metric_groups), + append_metric_groups), OPT_BOOLEAN_FLAG(0, "all-kernel", &stat_config.all_kernel, "Configure all used events to run in kernel space.", PARSE_OPT_EXCLUSIVE), @@ -1791,11 +1799,9 @@ static int add_default_attributes(void) * on an architecture test for such a metric name. */ if (metricgroup__has_metric("transaction")) { - struct option opt =3D { .value =3D &evsel_list }; - - return metricgroup__parse_groups(&opt, "transaction", + return metricgroup__parse_groups(evsel_list, "transaction", stat_config.metric_no_group, - stat_config.metric_no_merge, + stat_config.metric_no_merge, &stat_config.metric_events); } =20 @@ -2260,8 +2266,6 @@ int cmd_stat(int argc, const char **argv) argc =3D parse_options_subcommand(argc, argv, stat_options, stat_subcomma= nds, (const char **) stat_usage, PARSE_OPT_STOP_AT_NON_OPTION); - perf_stat__collect_metric_expr(evsel_list); - perf_stat__init_shadow_stats(); =20 if (stat_config.csv_sep) { stat_config.csv_output =3D true; @@ -2428,6 +2432,23 @@ int cmd_stat(int argc, const char **argv) target.system_wide =3D true; } =20 + if ((stat_config.aggr_mode =3D=3D AGGR_THREAD) && (target.system_wide)) + target.per_thread =3D true; + + /* + * Metric parsing needs to be delayed as metrics may optimize events + * knowing the target is system-wide. + */ + if (metrics) { + metricgroup__parse_groups(evsel_list, metrics, + stat_config.metric_no_group, + stat_config.metric_no_merge, + &stat_config.metric_events); + zfree(&metrics); + } + perf_stat__collect_metric_expr(evsel_list); + perf_stat__init_shadow_stats(); + if (add_default_attributes()) goto out; =20 @@ -2447,9 +2468,6 @@ int cmd_stat(int argc, const char **argv) } } =20 - if ((stat_config.aggr_mode =3D=3D AGGR_THREAD) && (target.system_wide)) - target.per_thread =3D true; - if (evlist__fix_hybrid_cpus(evsel_list, target.cpu_list)) { pr_err("failed to use cpu list %s\n", target.cpu_list); goto out; diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c index b144c3e35264..9151346a16ab 100644 --- a/tools/perf/util/metricgroup.c +++ b/tools/perf/util/metricgroup.c @@ -1646,13 +1646,12 @@ static int parse_groups(struct evlist *perf_evlist,= const char *str, return ret; } =20 -int metricgroup__parse_groups(const struct option *opt, +int metricgroup__parse_groups(struct evlist *perf_evlist, const char *str, bool metric_no_group, bool metric_no_merge, struct rblist *metric_events) { - struct evlist *perf_evlist =3D *(struct evlist **)opt->value; const struct pmu_events_table *table =3D pmu_events_table__find(); =20 if (!table) diff --git a/tools/perf/util/metricgroup.h b/tools/perf/util/metricgroup.h index 016b3b1a289a..af9ceadaec0f 100644 --- a/tools/perf/util/metricgroup.h +++ b/tools/perf/util/metricgroup.h @@ -64,7 +64,7 @@ struct metric_expr { struct metric_event *metricgroup__lookup(struct rblist *metric_events, struct evsel *evsel, bool create); -int metricgroup__parse_groups(const struct option *opt, +int metricgroup__parse_groups(struct evlist *perf_evlist, const char *str, bool metric_no_group, bool metric_no_merge, --=20 2.37.2.672.g94769d06f0-goog From nobody Thu Apr 9 09:25:03 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id F110AC0502C for ; Tue, 30 Aug 2022 16:50:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230359AbiH3Qut (ORCPT ); Tue, 30 Aug 2022 12:50:49 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35306 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229732AbiH3QuX (ORCPT ); Tue, 30 Aug 2022 12:50:23 -0400 Received: from mail-yw1-x114a.google.com (mail-yw1-x114a.google.com [IPv6:2607:f8b0:4864:20::114a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B830252FF5 for ; Tue, 30 Aug 2022 09:50:03 -0700 (PDT) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-337ed9110c2so184038727b3.15 for ; Tue, 30 Aug 2022 09:50:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc; bh=ybih/W++IzedfLRtWF8pTNf0vNzfkXAEBkVJkYh/YmU=; b=Rx/CFA62kr6HtuYkmLDK3/7RPV4PTzGmj/vWEzNZfgiRSnvScWrJlAOGS54JeEQHkg c4YJBDgvoMyMS7dbTh7WqVw22EgqlnRWY1AxVYsBNyxmKfuLt0gLYQ82Ux5jH1nU9VSR sv0Y3P9LNqbEybLlHmGghZeXpNBh4MX68sGJ7u+Z9G2ikElv/GyHlNGfXNWMtIAGV/iu Z6igYejHK8xKaD22Jzo/BcdMFGd7K1oK1iyEkzORdjiywEXoVZpX5PzV9vFnvSrcmz4k vyOdoNrbVA+lWBgs9iKbF8bJuVp94Bx7MBw6WTPMrNuq9GSrAsYsczbw4RQKKZ8zFv6p nXpw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc; bh=ybih/W++IzedfLRtWF8pTNf0vNzfkXAEBkVJkYh/YmU=; b=FuFk/f9WQa8BYfv8cNS4QtLbmiKUE5BZ2vYj01PraI9nnnEarBDG/k+kN45ChH1Nco E5Zd9roPhXyOs8jTiDCj6dK73ca9xvJ9E3mcu7ZJx8qS53nk2yr9t02mOniaJJXjiBdX wtl4d0EMr8bAMwgrkYOBNM5BkbBlWMaXcLki1s9hxR1N35KlnE+iRSJbMyec+N8dWnDB Pc5nbmlxt8AWlVooZO1LAYcdA7sG8WIPJ0znfLaJ4j+aTGis/FPcYre6bJlgP8D9Yd1T sxR8ecqVR2Xsi1k6i3pF5/EK0Alu8MI0cuZtn1qDDJd+i1fQC12F50JACRlfJTM4+szB FVpQ== X-Gm-Message-State: ACgBeo1GWLiS4XDGwK5Ukbacd2ipajjy4HlLZ3MFbdT2VWCBhnoI7mLg E5dXhhtHIMTZpWXWuWi9/bF4Pc5pIUEe X-Google-Smtp-Source: AA6agR4uBcZVjvkiDIXW3ma0PTmJMHiWo12t6OfYKS9mQ8xbRtpOH/JF8o8+nvrNN68xr68+hmh5PIdGsPHd X-Received: from irogers.svl.corp.google.com ([2620:15c:2d4:203:902c:b0fa:dec9:8767]) (user=irogers job=sendgmr) by 2002:a25:198b:0:b0:690:65bb:9416 with SMTP id 133-20020a25198b000000b0069065bb9416mr12064827ybz.142.1661878184735; Tue, 30 Aug 2022 09:49:44 -0700 (PDT) Date: Tue, 30 Aug 2022 09:48:45 -0700 In-Reply-To: <20220830164846.401143-1-irogers@google.com> Message-Id: <20220830164846.401143-8-irogers@google.com> Mime-Version: 1.0 References: <20220830164846.401143-1-irogers@google.com> X-Mailer: git-send-email 2.37.2.672.g94769d06f0-goog Subject: [PATCH v1 7/8] perf metrics: Wire up core_wide From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Andi Kleen , Kan Liang , Thomas Richter , James Clark , Miaoqian Lin , John Garry , Zhengjun Xing , Florian Fischer , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, perry.taylor@intel.com, caleb.biggers@intel.com, kshipra.bopardikar@intel.com Cc: Stephane Eranian , Ian Rogers Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Pass state necessary for core_wide into the expression parser. Add system_wide and user_requested_cpu_list to perf_stat_config to make it available at display time. evlist isn't used as the evlist__create_maps, that computes user_requested_cpus, needs the list of events which is generated by the metric. Signed-off-by: Ian Rogers --- tools/perf/builtin-stat.c | 9 ++++ tools/perf/util/expr.c | 10 ++++- tools/perf/util/expr.h | 4 +- tools/perf/util/expr.l | 6 +-- tools/perf/util/metricgroup.c | 82 +++++++++++++++++++++++++++-------- tools/perf/util/metricgroup.h | 2 + tools/perf/util/stat-shadow.c | 11 +++-- tools/perf/util/stat.h | 2 + 8 files changed, 101 insertions(+), 25 deletions(-) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index c813b1aa7d7c..0554ba6547a5 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -1802,6 +1802,8 @@ static int add_default_attributes(void) return metricgroup__parse_groups(evsel_list, "transaction", stat_config.metric_no_group, stat_config.metric_no_merge, + stat_config.user_requested_cpu_list, + stat_config.system_wide, &stat_config.metric_events); } =20 @@ -2435,6 +2437,10 @@ int cmd_stat(int argc, const char **argv) if ((stat_config.aggr_mode =3D=3D AGGR_THREAD) && (target.system_wide)) target.per_thread =3D true; =20 + stat_config.system_wide =3D target.system_wide; + if (target.cpu_list) + stat_config.user_requested_cpu_list =3D strdup(target.cpu_list); + /* * Metric parsing needs to be delayed as metrics may optimize events * knowing the target is system-wide. @@ -2443,6 +2449,8 @@ int cmd_stat(int argc, const char **argv) metricgroup__parse_groups(evsel_list, metrics, stat_config.metric_no_group, stat_config.metric_no_merge, + stat_config.user_requested_cpu_list, + stat_config.system_wide, &stat_config.metric_events); zfree(&metrics); } @@ -2633,6 +2641,7 @@ int cmd_stat(int argc, const char **argv) iostat_release(evsel_list); =20 zfree(&stat_config.walltime_run); + zfree(&stat_config.user_requested_cpu_list); =20 if (smi_cost && smi_reset) sysfs__write_int(FREEZE_ON_SMI_PATH, 0); diff --git a/tools/perf/util/expr.c b/tools/perf/util/expr.c index 8aa7dafa18b3..ce186bf663c4 100644 --- a/tools/perf/util/expr.c +++ b/tools/perf/util/expr.c @@ -310,7 +310,9 @@ struct expr_parse_ctx *expr__ctx_new(void) free(ctx); return NULL; } + ctx->sctx.user_requested_cpu_list =3D NULL; ctx->sctx.runtime =3D 0; + ctx->sctx.system_wide =3D false; =20 return ctx; } @@ -332,6 +334,7 @@ void expr__ctx_free(struct expr_parse_ctx *ctx) struct hashmap_entry *cur; size_t bkt; =20 + free(ctx->sctx.user_requested_cpu_list); hashmap__for_each_entry(ctx->ids, cur, bkt) { free((char *)cur->key); free(cur->value); @@ -407,7 +410,7 @@ double arch_get_tsc_freq(void) } #endif =20 -double expr__get_literal(const char *literal) +double expr__get_literal(const char *literal, const struct expr_scanner_ct= x *ctx) { static struct cpu_topology *topology; double result =3D NAN; @@ -439,6 +442,11 @@ double expr__get_literal(const char *literal) result =3D smt_on(topology) ? 1.0 : 0.0; goto out; } + if (!strcmp("#core_wide", literal)) { + result =3D core_wide(ctx->system_wide, ctx->user_requested_cpu_list, top= ology) + ? 1.0 : 0.0; + goto out; + } if (!strcmp("#num_packages", literal)) { result =3D topology->package_cpus_lists; goto out; diff --git a/tools/perf/util/expr.h b/tools/perf/util/expr.h index de9b886ec49a..32740e4c81ef 100644 --- a/tools/perf/util/expr.h +++ b/tools/perf/util/expr.h @@ -14,7 +14,9 @@ struct metric_ref; =20 struct expr_scanner_ctx { + char *user_requested_cpu_list; int runtime; + bool system_wide; }; =20 struct expr_parse_ctx { @@ -58,6 +60,6 @@ int expr__find_ids(const char *expr, const char *one, =20 double expr_id_data__value(const struct expr_id_data *data); double expr_id_data__source_count(const struct expr_id_data *data); -double expr__get_literal(const char *literal); +double expr__get_literal(const char *literal, const struct expr_scanner_ct= x *ctx); =20 #endif diff --git a/tools/perf/util/expr.l b/tools/perf/util/expr.l index 4dc8edbfd9ce..0168a9637330 100644 --- a/tools/perf/util/expr.l +++ b/tools/perf/util/expr.l @@ -79,11 +79,11 @@ static int str(yyscan_t scanner, int token, int runtime) return token; } =20 -static int literal(yyscan_t scanner) +static int literal(yyscan_t scanner, const struct expr_scanner_ctx *sctx) { YYSTYPE *yylval =3D expr_get_lval(scanner); =20 - yylval->num =3D expr__get_literal(expr_get_text(scanner)); + yylval->num =3D expr__get_literal(expr_get_text(scanner), sctx); if (isnan(yylval->num)) return EXPR_ERROR; =20 @@ -108,7 +108,7 @@ min { return MIN; } if { return IF; } else { return ELSE; } source_count { return SOURCE_COUNT; } -{literal} { return literal(yyscanner); } +{literal} { return literal(yyscanner, sctx); } {number} { return value(yyscanner); } {symbol} { return str(yyscanner, ID, sctx->runtime); } "|" { return '|'; } diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c index 9151346a16ab..f7d93dc02326 100644 --- a/tools/perf/util/metricgroup.c +++ b/tools/perf/util/metricgroup.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include "util.h" @@ -192,7 +193,9 @@ static bool metricgroup__has_constraint(const struct pm= u_event *pe) static struct metric *metric__new(const struct pmu_event *pe, const char *modifier, bool metric_no_group, - int runtime) + int runtime, + const char *user_requested_cpu_list, + bool system_wide) { struct metric *m; =20 @@ -215,7 +218,11 @@ static struct metric *metric__new(const struct pmu_eve= nt *pe, } m->metric_expr =3D pe->metric_expr; m->metric_unit =3D pe->unit; + m->pctx->sctx.user_requested_cpu_list =3D NULL; + if (user_requested_cpu_list) + m->pctx->sctx.user_requested_cpu_list =3D strdup(user_requested_cpu_list= ); m->pctx->sctx.runtime =3D runtime; + m->pctx->sctx.system_wide =3D system_wide; m->has_constraint =3D metric_no_group || metricgroup__has_constraint(pe); m->metric_refs =3D NULL; m->evlist =3D NULL; @@ -874,6 +881,8 @@ struct metricgroup_add_iter_data { int *ret; bool *has_match; bool metric_no_group; + const char *user_requested_cpu_list; + bool system_wide; struct metric *root_metric; const struct visited_metric *visited; const struct pmu_events_table *table; @@ -887,6 +896,8 @@ static int add_metric(struct list_head *metric_list, const struct pmu_event *pe, const char *modifier, bool metric_no_group, + const char *user_requested_cpu_list, + bool system_wide, struct metric *root_metric, const struct visited_metric *visited, const struct pmu_events_table *table); @@ -899,6 +910,8 @@ static int add_metric(struct list_head *metric_list, * @metric_no_group: Should events written to events be grouped "{}" or * global. Grouping is the default but due to multiplexi= ng the * user may override. + * @user_requested_cpu_list: Command line specified CPUs to record on. + * @system_wide: Are events for all processes recorded. * @root_metric: Metrics may reference other metrics to form a tree. In th= is * case the root_metric holds all the IDs and a list of refe= renced * metrics. When adding a root this argument is NULL. @@ -910,6 +923,8 @@ static int add_metric(struct list_head *metric_list, static int resolve_metric(struct list_head *metric_list, const char *modifier, bool metric_no_group, + const char *user_requested_cpu_list, + bool system_wide, struct metric *root_metric, const struct visited_metric *visited, const struct pmu_events_table *table) @@ -956,7 +971,8 @@ static int resolve_metric(struct list_head *metric_list, */ for (i =3D 0; i < pending_cnt; i++) { ret =3D add_metric(metric_list, &pending[i].pe, modifier, metric_no_grou= p, - root_metric, visited, table); + user_requested_cpu_list, system_wide, root_metric, visited, + table); if (ret) break; } @@ -974,6 +990,8 @@ static int resolve_metric(struct list_head *metric_list, * global. Grouping is the default but due to multiplexi= ng the * user may override. * @runtime: A special argument for the parser only known at runtime. + * @user_requested_cpu_list: Command line specified CPUs to record on. + * @system_wide: Are events for all processes recorded. * @root_metric: Metrics may reference other metrics to form a tree. In th= is * case the root_metric holds all the IDs and a list of refe= renced * metrics. When adding a root this argument is NULL. @@ -987,6 +1005,8 @@ static int __add_metric(struct list_head *metric_list, const char *modifier, bool metric_no_group, int runtime, + const char *user_requested_cpu_list, + bool system_wide, struct metric *root_metric, const struct visited_metric *visited, const struct pmu_events_table *table) @@ -1011,7 +1031,8 @@ static int __add_metric(struct list_head *metric_list, * This metric is the root of a tree and may reference other * metrics that are added recursively. */ - root_metric =3D metric__new(pe, modifier, metric_no_group, runtime); + root_metric =3D metric__new(pe, modifier, metric_no_group, runtime, + user_requested_cpu_list, system_wide); if (!root_metric) return -ENOMEM; =20 @@ -1060,8 +1081,9 @@ static int __add_metric(struct list_head *metric_list, ret =3D -EINVAL; } else { /* Resolve referenced metrics. */ - ret =3D resolve_metric(metric_list, modifier, metric_no_group, root_metr= ic, - &visited_node, table); + ret =3D resolve_metric(metric_list, modifier, metric_no_group, + user_requested_cpu_list, system_wide, + root_metric, &visited_node, table); } =20 if (ret) { @@ -1109,6 +1131,8 @@ static int add_metric(struct list_head *metric_list, const struct pmu_event *pe, const char *modifier, bool metric_no_group, + const char *user_requested_cpu_list, + bool system_wide, struct metric *root_metric, const struct visited_metric *visited, const struct pmu_events_table *table) @@ -1119,7 +1143,8 @@ static int add_metric(struct list_head *metric_list, =20 if (!strstr(pe->metric_expr, "?")) { ret =3D __add_metric(metric_list, pe, modifier, metric_no_group, 0, - root_metric, visited, table); + user_requested_cpu_list, system_wide, root_metric, + visited, table); } else { int j, count; =20 @@ -1132,7 +1157,8 @@ static int add_metric(struct list_head *metric_list, =20 for (j =3D 0; j < count && !ret; j++) ret =3D __add_metric(metric_list, pe, modifier, metric_no_group, j, - root_metric, visited, table); + user_requested_cpu_list, system_wide, + root_metric, visited, table); } =20 return ret; @@ -1149,6 +1175,7 @@ static int metricgroup__add_metric_sys_event_iter(con= st struct pmu_event *pe, return 0; =20 ret =3D add_metric(d->metric_list, pe, d->modifier, d->metric_no_group, + d->user_requested_cpu_list, d->system_wide, d->root_metric, d->visited, d->table); if (ret) goto out; @@ -1191,7 +1218,9 @@ struct metricgroup__add_metric_data { struct list_head *list; const char *metric_name; const char *modifier; + const char *user_requested_cpu_list; bool metric_no_group; + bool system_wide; bool has_match; }; =20 @@ -1208,8 +1237,8 @@ static int metricgroup__add_metric_callback(const str= uct pmu_event *pe, =20 data->has_match =3D true; ret =3D add_metric(data->list, pe, data->modifier, data->metric_no_group, - /*root_metric=3D*/NULL, - /*visited_metrics=3D*/NULL, table); + data->user_requested_cpu_list, data->system_wide, + /*root_metric=3D*/NULL, /*visited_metrics=3D*/NULL, table); } return ret; } @@ -1223,12 +1252,16 @@ static int metricgroup__add_metric_callback(const s= truct pmu_event *pe, * @metric_no_group: Should events written to events be grouped "{}" or * global. Grouping is the default but due to multiplexi= ng the * user may override. + * @user_requested_cpu_list: Command line specified CPUs to record on. + * @system_wide: Are events for all processes recorded. * @metric_list: The list that the metric or metric group are added to. * @table: The table that is searched for metrics, most commonly the table= for the * architecture perf is running upon. */ static int metricgroup__add_metric(const char *metric_name, const char *mo= difier, bool metric_no_group, + const char *user_requested_cpu_list, + bool system_wide, struct list_head *metric_list, const struct pmu_events_table *table) { @@ -1242,6 +1275,8 @@ static int metricgroup__add_metric(const char *metric= _name, const char *modifier .metric_name =3D metric_name, .modifier =3D modifier, .metric_no_group =3D metric_no_group, + .user_requested_cpu_list =3D user_requested_cpu_list, + .system_wide =3D system_wide, .has_match =3D false, }; /* @@ -1263,6 +1298,8 @@ static int metricgroup__add_metric(const char *metric= _name, const char *modifier .metric_name =3D metric_name, .modifier =3D modifier, .metric_no_group =3D metric_no_group, + .user_requested_cpu_list =3D user_requested_cpu_list, + .system_wide =3D system_wide, .has_match =3D &has_match, .ret =3D &ret, .table =3D table, @@ -1293,12 +1330,15 @@ static int metricgroup__add_metric(const char *metr= ic_name, const char *modifier * @metric_no_group: Should events written to events be grouped "{}" or * global. Grouping is the default but due to multiplexi= ng the * user may override. + * @user_requested_cpu_list: Command line specified CPUs to record on. + * @system_wide: Are events for all processes recorded. * @metric_list: The list that metrics are added to. * @table: The table that is searched for metrics, most commonly the table= for the * architecture perf is running upon. */ static int metricgroup__add_metric_list(const char *list, bool metric_no_g= roup, - struct list_head *metric_list, + const char *user_requested_cpu_list, + bool system_wide, struct list_head *metric_list, const struct pmu_events_table *table) { char *list_itr, *list_copy, *metric_name, *modifier; @@ -1315,8 +1355,8 @@ static int metricgroup__add_metric_list(const char *l= ist, bool metric_no_group, *modifier++ =3D '\0'; =20 ret =3D metricgroup__add_metric(metric_name, modifier, - metric_no_group, metric_list, - table); + metric_no_group, user_requested_cpu_list, + system_wide, metric_list, table); if (ret =3D=3D -EINVAL) pr_err("Cannot find metric or group `%s'\n", metric_name); =20 @@ -1505,6 +1545,8 @@ static int parse_ids(bool metric_no_merge, struct per= f_pmu *fake_pmu, static int parse_groups(struct evlist *perf_evlist, const char *str, bool metric_no_group, bool metric_no_merge, + const char *user_requested_cpu_list, + bool system_wide, struct perf_pmu *fake_pmu, struct rblist *metric_events_list, const struct pmu_events_table *table) @@ -1518,7 +1560,8 @@ static int parse_groups(struct evlist *perf_evlist, c= onst char *str, if (metric_events_list->nr_entries =3D=3D 0) metricgroup__rblist_init(metric_events_list); ret =3D metricgroup__add_metric_list(str, metric_no_group, - &metric_list, table); + user_requested_cpu_list, + system_wide, &metric_list, table); if (ret) goto out; =20 @@ -1650,6 +1693,8 @@ int metricgroup__parse_groups(struct evlist *perf_evl= ist, const char *str, bool metric_no_group, bool metric_no_merge, + const char *user_requested_cpu_list, + bool system_wide, struct rblist *metric_events) { const struct pmu_events_table *table =3D pmu_events_table__find(); @@ -1657,8 +1702,9 @@ int metricgroup__parse_groups(struct evlist *perf_evl= ist, if (!table) return -EINVAL; =20 - return parse_groups(perf_evlist, str, metric_no_group, - metric_no_merge, NULL, metric_events, table); + return parse_groups(perf_evlist, str, metric_no_group, metric_no_merge, + user_requested_cpu_list, system_wide, + /*fake_pmu=3D*/NULL, metric_events, table); } =20 int metricgroup__parse_groups_test(struct evlist *evlist, @@ -1668,8 +1714,10 @@ int metricgroup__parse_groups_test(struct evlist *ev= list, bool metric_no_merge, struct rblist *metric_events) { - return parse_groups(evlist, str, metric_no_group, - metric_no_merge, &perf_pmu__fake, metric_events, table); + return parse_groups(evlist, str, metric_no_group, metric_no_merge, + /*user_requested_cpu_list=3D*/NULL, + /*system_wide=3D*/false, + &perf_pmu__fake, metric_events, table); } =20 static int metricgroup__has_metric_callback(const struct pmu_event *pe, diff --git a/tools/perf/util/metricgroup.h b/tools/perf/util/metricgroup.h index af9ceadaec0f..732d3a0d3334 100644 --- a/tools/perf/util/metricgroup.h +++ b/tools/perf/util/metricgroup.h @@ -68,6 +68,8 @@ int metricgroup__parse_groups(struct evlist *perf_evlist, const char *str, bool metric_no_group, bool metric_no_merge, + const char *user_requested_cpu_list, + bool system_wide, struct rblist *metric_events); int metricgroup__parse_groups_test(struct evlist *evlist, const struct pmu_events_table *table, diff --git a/tools/perf/util/stat-shadow.c b/tools/perf/util/stat-shadow.c index 1439acd109db..1deb75741df4 100644 --- a/tools/perf/util/stat-shadow.c +++ b/tools/perf/util/stat-shadow.c @@ -911,7 +911,10 @@ static void generic_metric(struct perf_stat_config *co= nfig, if (!pctx) return; =20 + if (config->user_requested_cpu_list) + pctx->sctx.user_requested_cpu_list =3D strdup(config->user_requested_cpu= _list); pctx->sctx.runtime =3D runtime; + pctx->sctx.system_wide =3D config->system_wide; i =3D prepare_metric(metric_events, metric_refs, pctx, cpu_map_idx, st); if (i < 0) { expr__ctx_free(pctx); @@ -1304,7 +1307,8 @@ void perf_stat__print_shadow_stats(struct perf_stat_c= onfig *config, core_bound * 100.); } else if (evsel->metric_expr) { generic_metric(config, evsel->metric_expr, evsel->metric_events, NULL, - evsel->name, evsel->metric_name, NULL, 1, cpu_map_idx, out, st); + evsel->name, evsel->metric_name, NULL, 1, + cpu_map_idx, out, st); } else if (runtime_stat_n(st, STAT_NSECS, cpu_map_idx, &rsd) !=3D 0) { char unit =3D ' '; char unit_buf[10] =3D "/sec"; @@ -1329,8 +1333,9 @@ void perf_stat__print_shadow_stats(struct perf_stat_c= onfig *config, if (num++ > 0) out->new_line(config, ctxp); generic_metric(config, mexp->metric_expr, mexp->metric_events, - mexp->metric_refs, evsel->name, mexp->metric_name, - mexp->metric_unit, mexp->runtime, cpu_map_idx, out, st); + mexp->metric_refs, evsel->name, mexp->metric_name, + mexp->metric_unit, mexp->runtime, + cpu_map_idx, out, st); } } if (num =3D=3D 0) diff --git a/tools/perf/util/stat.h b/tools/perf/util/stat.h index 668250022f8c..72713b344b79 100644 --- a/tools/perf/util/stat.h +++ b/tools/perf/util/stat.h @@ -141,6 +141,8 @@ struct perf_stat_config { bool stop_read_counter; bool quiet; bool iostat_run; + char *user_requested_cpu_list; + bool system_wide; FILE *output; unsigned int interval; unsigned int timeout; --=20 2.37.2.672.g94769d06f0-goog From nobody Thu Apr 9 09:25:03 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 82C6CECAAD1 for ; Tue, 30 Aug 2022 16:50:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230483AbiH3Qux (ORCPT ); Tue, 30 Aug 2022 12:50:53 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35810 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230312AbiH3Qug (ORCPT ); Tue, 30 Aug 2022 12:50:36 -0400 Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0B177D123 for ; Tue, 30 Aug 2022 09:50:07 -0700 (PDT) Received: by mail-yb1-xb49.google.com with SMTP id v5-20020a2583c5000000b006964324be8cso171965ybm.14 for ; Tue, 30 Aug 2022 09:50:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc; bh=hBJ0yO7Shj4BOGRLl4iwSJQIsSnhkgtQ+YJ6SsJa66s=; b=qLhpv1pwxbgqPpQ/o53COjLTCFhozgslqRyNRpITJlmata42GDlLUxhGoYQs+ODC1t 8fT2Qshih9HmV/rWmz320OxcWmiHAJlyFWeZ5ZZn4bUQGNUiZxotR1stKeFzbnY5ZpIN G1LthDIugdVVlBwJdWdv8C82rIECXtDmSp/0giPmpiEUEjNGrzUuFYbIfD8TSbz2xNY2 5rNgIWjMoUwCnoAvub4HPlmth9XcXSQTkKdox5kgwDqjedAvR0y9GZ1kwpn+kwLDOvJ1 ce94hLNJDKiOEWOnbzsy7bmCxCMeRv4ML+AsMNiPHUh2+SWedFGS8Bp8+2tkZBmA5Z/H YYQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc; bh=hBJ0yO7Shj4BOGRLl4iwSJQIsSnhkgtQ+YJ6SsJa66s=; b=2jBkVGlMBX2CrJwDxJ/y58D6orwS5i/DKDySaCBAlmp+xP3erpH0/byHqETn92drUk PAV60xlc9OOToYEnW+dqD67AROn0nFLKQJBMj5nyu5JC4S1+x4ckvJp4dMrk++rGBdKy k9tpcBc3+FY4jW808HUYJP7NfCQ7Fml53uz033XAZ8uXIWAY/NsXXnq5wjGPm6EmCyVe eeaulQB7pJP3i2yJ6xQUI//jLNUVmbyl3GKeNz7MqVsD1/LgL8JkUVF4C2eiIhUhWxGg 8wgdoe07KCMZ2sdkeCi5bG17Ix/9M/Z4J7ZIsqpShdxJWCuqWJtNQVge9LrZmXRjBd/m EG4A== X-Gm-Message-State: ACgBeo1V5L78KYbYujshvXWUL7C/z7Bu1nJCNcbNQ4fQ7wgVrjs9y/zd 5z232uhSPpemMkmZmFbkl7KiEdrU2Euk X-Google-Smtp-Source: AA6agR7UyxomsBLPG4p8omYHrO7FAUbdartUodh6cv14m+BTaKEMB043Thyn84iNKaNbktnxPEd7cmy4vJq+ X-Received: from irogers.svl.corp.google.com ([2620:15c:2d4:203:902c:b0fa:dec9:8767]) (user=irogers job=sendgmr) by 2002:a25:3207:0:b0:69a:ba91:9dd with SMTP id y7-20020a253207000000b0069aba9109ddmr9781255yby.34.1661878191610; Tue, 30 Aug 2022 09:49:51 -0700 (PDT) Date: Tue, 30 Aug 2022 09:48:46 -0700 In-Reply-To: <20220830164846.401143-1-irogers@google.com> Message-Id: <20220830164846.401143-9-irogers@google.com> Mime-Version: 1.0 References: <20220830164846.401143-1-irogers@google.com> X-Mailer: git-send-email 2.37.2.672.g94769d06f0-goog Subject: [PATCH v1 8/8] perf test: Add basic core_wide expression test From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Andi Kleen , Kan Liang , Thomas Richter , James Clark , Miaoqian Lin , John Garry , Zhengjun Xing , Florian Fischer , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, perry.taylor@intel.com, caleb.biggers@intel.com, kshipra.bopardikar@intel.com Cc: Stephane Eranian , Ian Rogers Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add basic test for coverage, similar to #smt_on. Signed-off-by: Ian Rogers --- tools/perf/tests/expr.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tools/perf/tests/expr.c b/tools/perf/tests/expr.c index db736ed49556..8bd719766814 100644 --- a/tools/perf/tests/expr.c +++ b/tools/perf/tests/expr.c @@ -158,6 +158,9 @@ static int test__expr(struct test_suite *t __maybe_unus= ed, int subtest __maybe_u { struct cpu_topology *topology =3D cpu_topology__new(); bool smton =3D smt_on(topology); + bool corewide =3D core_wide(/*system_wide=3D*/false, + /*user_requested_cpus=3D*/false, + topology); =20 cpu_topology__delete(topology); expr__ctx_clear(ctx); @@ -168,6 +171,16 @@ static int test__expr(struct test_suite *t __maybe_unu= sed, int subtest __maybe_u TEST_ASSERT_VAL("find ids", hashmap__find(ctx->ids, smton ? "EVENT1" : "EVENT2", (void **)&val_ptr)); + + expr__ctx_clear(ctx); + TEST_ASSERT_VAL("find ids", + expr__find_ids("EVENT1 if #core_wide else EVENT2", + NULL, ctx) =3D=3D 0); + TEST_ASSERT_VAL("find ids", hashmap__size(ctx->ids) =3D=3D 1); + TEST_ASSERT_VAL("find ids", hashmap__find(ctx->ids, + corewide ? "EVENT1" : "EVENT2", + (void **)&val_ptr)); + } /* The expression is a constant 1.0 without needing to evaluate EVENT1. */ expr__ctx_clear(ctx); --=20 2.37.2.672.g94769d06f0-goog