From nobody Thu Dec 18 18:01:35 2025 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 9AEDDC83F29 for ; Thu, 31 Aug 2023 07:14:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S245516AbjHaHOv (ORCPT ); Thu, 31 Aug 2023 03:14:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60128 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231651AbjHaHOr (ORCPT ); Thu, 31 Aug 2023 03:14:47 -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 A8BEF1A3 for ; Thu, 31 Aug 2023 00:14:44 -0700 (PDT) Received: by mail-yw1-x1149.google.com with SMTP id 00721157ae682-58fbfcb8d90so8350347b3.1 for ; Thu, 31 Aug 2023 00:14:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1693466084; x=1694070884; darn=vger.kernel.org; h=to:from:subject:references:mime-version:message-id:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=nr41kDdDeJzQNFW3nz+BwVQXTEOQ7IBxm5AfGxJhvdk=; b=CDp1t5ekzB1vlkslgmD1Uk/jcoVrl3+7g5PSXl4YozmAl5uDxHIAY9MS+ISesQ3+hc iayCQHlsCEVNC4K5sV47w1YI5OBrwhzYmSdPp0QjdFOSonULeV0BNcZmVzX579f7y8sS BOYazvFmkN5p1HPfXTFUMUChn/wnAa4a2MYbq8E1HQdLmOSs0FU07nlne0o1Mlv6Wts3 6+JeDOIjM9UhX6KK1T1GHFLhKQisvuFHD6rHohmuvzFscwP+TAAWXa1LwnTk0Miy+6gO gGl1R0kFtswnMEOiC+DMPsJykOOZOFOnc3j7vkxCnxGBPhW16R8o1nqs4Gx9IAr1FLSY YsHw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1693466084; x=1694070884; h=to:from:subject:references:mime-version:message-id:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=nr41kDdDeJzQNFW3nz+BwVQXTEOQ7IBxm5AfGxJhvdk=; b=g/i3xT5gNduI10Sx0xXhhEBFGAMZ5PQXATB+FlExMJgUg4p4In2SSNa9RzNAgFPl5k 0NJWmc/P3pLUb6vvPoj19z3T0NXUaub1IywWv4OxTjKdSHvsYXOr76heDf+0dPYxBlcx o4fNzMpQrgfDqZ+S/FPDCEnsTLhPnrLVY6uG40QRcb9syC84AqWBHkrqH6Smcr0YatCd KduLQzpliWKB4Krubkbv/zlGyAXV3EWUyrKmzB2HEde78Ru/nLFY9Fa1iAmLG/c/oe+z AG0fZ8tvosTOKrmZy/1AT4xEeWxkuVRjz8Cxxx+is7Mfqjbi6+wefsfYOLkUQKUyaqaU QcIA== X-Gm-Message-State: AOJu0Yw7KrqjBMxKyDy/1Ql1GCQm36Y7pnKLd40Qlplo7tz5ADudG/fI AgI7CjysxAxqaxNNlcY2Kwve+IiGJyIw X-Google-Smtp-Source: AGHT+IF5RuXo9qTB0bgfsrdHCQZZY+zjteXaXkJaflVMOpRzb34MoLKDR2Dz6HXv+Z6xBHIZ0Y+uYEedugR0 X-Received: from irogers.svl.corp.google.com ([2620:15c:2a3:200:feef:cd5e:6353:57f0]) (user=irogers job=sendgmr) by 2002:a81:af07:0:b0:56d:647:664b with SMTP id n7-20020a81af07000000b0056d0647664bmr125753ywh.5.1693466083950; Thu, 31 Aug 2023 00:14:43 -0700 (PDT) Date: Thu, 31 Aug 2023 00:14:19 -0700 In-Reply-To: <20230831071421.2201358-1-irogers@google.com> Message-Id: <20230831071421.2201358-2-irogers@google.com> Mime-Version: 1.0 References: <20230831071421.2201358-1-irogers@google.com> X-Mailer: git-send-email 2.42.0.rc2.253.gd59a3bf2b4-goog Subject: [PATCH v1 1/3] perf list: Don't print Unit for default_core From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , Kan Liang , Rob Herring , James Clark , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" default_core was added as a way to demark json events whose PMU should be whatever the default core PMU is, previously this had been assumed to be "cpu" but that fails on s390 and ARM. perf list displays the PMU in the event description to save storing it in json, but was still comparing against "cpu" and not "default_core", so update this. Fixes: d2045f87154b ("perf jevents: Use "default_core" for events with no U= nit") Signed-off-by: Ian Rogers Tested-by: Kan Liang --- tools/perf/builtin-list.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/perf/builtin-list.c b/tools/perf/builtin-list.c index 1ac47db4d66a..a343823c8ddf 100644 --- a/tools/perf/builtin-list.c +++ b/tools/perf/builtin-list.c @@ -148,7 +148,7 @@ static void default_print_event(void *ps, const char *p= mu_name, const char *topi char *desc_with_unit =3D NULL; int desc_len =3D -1; =20 - if (pmu_name && strcmp(pmu_name, "cpu")) { + if (pmu_name && strcmp(pmu_name, "default_core")) { desc_len =3D strlen(desc); desc_len =3D asprintf(&desc_with_unit, desc[desc_len - 1] !=3D '.' --=20 2.42.0.rc2.253.gd59a3bf2b4-goog From nobody Thu Dec 18 18:01:35 2025 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 2EF36C83F2B for ; Thu, 31 Aug 2023 07:14:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S245543AbjHaHOy (ORCPT ); Thu, 31 Aug 2023 03:14:54 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60188 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S245210AbjHaHOu (ORCPT ); Thu, 31 Aug 2023 03:14:50 -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 39A33CC5 for ; Thu, 31 Aug 2023 00:14:47 -0700 (PDT) Received: by mail-yb1-xb49.google.com with SMTP id 3f1490d57ef6-d748b6f1077so381957276.1 for ; Thu, 31 Aug 2023 00:14:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1693466086; x=1694070886; darn=vger.kernel.org; h=to:from:subject:references:mime-version:message-id:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=NB1bEEk68L9clRTh/1y8/DGAe5vmtd3xg5rJJg8exGQ=; b=U3QXWtX75Vk62ysY3PsvDtr4km0Q0x/zVhvJCvsCySIN6hREjHf+WPKYg8YxTUxlbN JDj/v1GpV8GiOoaAWfKa2tmOo9aX4Y6cVY608suCWIAfuvgAp83KIHcn5EyI2D8LCK3b WqZLkQF3b5Tx+hyLimuV102+RMHpxTg72Tilfcdqd2MTY7nlQ33p6EpqQwLclx8y5Jvp EQrGSLhTB9GWDqZpeiL5FR6h4fetfJgn+gNBIpzlGiv09SX2ENpqPHe+LpxEBBoBWyC7 g+Z9Iu0dVhpA0tOJemqZaOpG4V3IAUvDHJS6ubtE1XSCynEpOUC3c8pP6lwcTOn2zH4C IljQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1693466086; x=1694070886; h=to:from:subject:references:mime-version:message-id:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=NB1bEEk68L9clRTh/1y8/DGAe5vmtd3xg5rJJg8exGQ=; b=gtpW3j95Yf46FT53nrN72lSEPi7zZM7IEa7FkOtiVYxDLhZVHXnUaV6rIcW/IzmQc3 +wClRiImMrZ4OqJQgm1fVB5/WhShmYGUiWAngu7YEgWCur8E09Eshm2YLoxxauJ1uFS0 TQmRmwnd/jlSGEwuVXQGwj2W82tY1cVJZEXd7Ks9GyBGfaiVIPWcPwPSuxa6iCrIVFEw N6uQhn9tqtY9QUKk2/Psi3KuqRxbBahzGbX9fCQOsC77M1/ECvt0uoBS9/OpKy/x05tx kSG46fO4AWB1kUBdOOhQnYFfk4VcWJRJU9foM5Nl1ucnhLoVBgSnciZQ02U5OeRoxYx5 nFzg== X-Gm-Message-State: AOJu0YyR5zYP/hsqKlzbu9EL+dJT9CHQ2kWOfC2P5sUjQiO9xKf5UASw qNMUed+ujsibqRcxNsb7o+m47s8377lc X-Google-Smtp-Source: AGHT+IFiAhnCHPJZhHHCszMGcWw9cDcgxOBQylSDhdZ9udRXZAU+oCg3AeosZZSmbUJ+BCyopXKmPeu7WjCy X-Received: from irogers.svl.corp.google.com ([2620:15c:2a3:200:feef:cd5e:6353:57f0]) (user=irogers job=sendgmr) by 2002:a25:456:0:b0:d78:3b16:e1f2 with SMTP id 83-20020a250456000000b00d783b16e1f2mr140850ybe.0.1693466086394; Thu, 31 Aug 2023 00:14:46 -0700 (PDT) Date: Thu, 31 Aug 2023 00:14:20 -0700 In-Reply-To: <20230831071421.2201358-1-irogers@google.com> Message-Id: <20230831071421.2201358-3-irogers@google.com> Mime-Version: 1.0 References: <20230831071421.2201358-1-irogers@google.com> X-Mailer: git-send-email 2.42.0.rc2.253.gd59a3bf2b4-goog Subject: [PATCH v1 2/3] perf parse-events: Name the two term enums From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , Kan Liang , Rob Herring , James Clark , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Name the enums used by struct parse_events_term to parse_events__term_val_type and parse_events__term_type. This allows greater compile time error checking. Fix -Wswitch related issues by explicitly listing all enum values prior to default. Add config_term_name to safely look up a parse_events__term_type name, bounds checking the array access first. Add documentation to struct parse_events_terms and reorder to save space. Signed-off-by: Ian Rogers Tested-by: Kan Liang --- tools/perf/util/parse-events.c | 174 ++++++++++++++++++++++++--------- tools/perf/util/parse-events.h | 60 +++++++++--- tools/perf/util/parse-events.l | 2 +- tools/perf/util/parse-events.y | 18 +++- 4 files changed, 187 insertions(+), 67 deletions(-) diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 0b941b58bdc0..51b73207e9f4 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -153,7 +153,7 @@ const char *event_type(int type) return "unknown"; } =20 -static char *get_config_str(struct list_head *head_terms, int type_term) +static char *get_config_str(struct list_head *head_terms, enum parse_event= s__term_type type_term) { struct parse_events_term *term; =20 @@ -722,7 +722,7 @@ int parse_events_add_breakpoint(struct parse_events_sta= te *parse_state, =20 static int check_type_val(struct parse_events_term *term, struct parse_events_error *err, - int type) + enum parse_events__term_val_type type) { if (type =3D=3D term->type_val) return 0; @@ -737,42 +737,49 @@ static int check_type_val(struct parse_events_term *t= erm, return -EINVAL; } =20 -/* - * Update according to parse-events.l - */ -static const char *config_term_names[__PARSE_EVENTS__TERM_TYPE_NR] =3D { - [PARSE_EVENTS__TERM_TYPE_USER] =3D "", - [PARSE_EVENTS__TERM_TYPE_CONFIG] =3D "config", - [PARSE_EVENTS__TERM_TYPE_CONFIG1] =3D "config1", - [PARSE_EVENTS__TERM_TYPE_CONFIG2] =3D "config2", - [PARSE_EVENTS__TERM_TYPE_CONFIG3] =3D "config3", - [PARSE_EVENTS__TERM_TYPE_NAME] =3D "name", - [PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD] =3D "period", - [PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ] =3D "freq", - [PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE] =3D "branch_type", - [PARSE_EVENTS__TERM_TYPE_TIME] =3D "time", - [PARSE_EVENTS__TERM_TYPE_CALLGRAPH] =3D "call-graph", - [PARSE_EVENTS__TERM_TYPE_STACKSIZE] =3D "stack-size", - [PARSE_EVENTS__TERM_TYPE_NOINHERIT] =3D "no-inherit", - [PARSE_EVENTS__TERM_TYPE_INHERIT] =3D "inherit", - [PARSE_EVENTS__TERM_TYPE_MAX_STACK] =3D "max-stack", - [PARSE_EVENTS__TERM_TYPE_MAX_EVENTS] =3D "nr", - [PARSE_EVENTS__TERM_TYPE_OVERWRITE] =3D "overwrite", - [PARSE_EVENTS__TERM_TYPE_NOOVERWRITE] =3D "no-overwrite", - [PARSE_EVENTS__TERM_TYPE_DRV_CFG] =3D "driver-config", - [PARSE_EVENTS__TERM_TYPE_PERCORE] =3D "percore", - [PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT] =3D "aux-output", - [PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE] =3D "aux-sample-size", - [PARSE_EVENTS__TERM_TYPE_METRIC_ID] =3D "metric-id", - [PARSE_EVENTS__TERM_TYPE_RAW] =3D "raw", - [PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE] =3D "legacy-cache", - [PARSE_EVENTS__TERM_TYPE_HARDWARE] =3D "hardware", -}; - static bool config_term_shrinked; =20 +static const char *config_term_name(enum parse_events__term_type term_type) +{ + /* + * Update according to parse-events.l + */ + static const char *config_term_names[__PARSE_EVENTS__TERM_TYPE_NR] =3D { + [PARSE_EVENTS__TERM_TYPE_USER] =3D "", + [PARSE_EVENTS__TERM_TYPE_CONFIG] =3D "config", + [PARSE_EVENTS__TERM_TYPE_CONFIG1] =3D "config1", + [PARSE_EVENTS__TERM_TYPE_CONFIG2] =3D "config2", + [PARSE_EVENTS__TERM_TYPE_CONFIG3] =3D "config3", + [PARSE_EVENTS__TERM_TYPE_NAME] =3D "name", + [PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD] =3D "period", + [PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ] =3D "freq", + [PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE] =3D "branch_type", + [PARSE_EVENTS__TERM_TYPE_TIME] =3D "time", + [PARSE_EVENTS__TERM_TYPE_CALLGRAPH] =3D "call-graph", + [PARSE_EVENTS__TERM_TYPE_STACKSIZE] =3D "stack-size", + [PARSE_EVENTS__TERM_TYPE_NOINHERIT] =3D "no-inherit", + [PARSE_EVENTS__TERM_TYPE_INHERIT] =3D "inherit", + [PARSE_EVENTS__TERM_TYPE_MAX_STACK] =3D "max-stack", + [PARSE_EVENTS__TERM_TYPE_MAX_EVENTS] =3D "nr", + [PARSE_EVENTS__TERM_TYPE_OVERWRITE] =3D "overwrite", + [PARSE_EVENTS__TERM_TYPE_NOOVERWRITE] =3D "no-overwrite", + [PARSE_EVENTS__TERM_TYPE_DRV_CFG] =3D "driver-config", + [PARSE_EVENTS__TERM_TYPE_PERCORE] =3D "percore", + [PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT] =3D "aux-output", + [PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE] =3D "aux-sample-size", + [PARSE_EVENTS__TERM_TYPE_METRIC_ID] =3D "metric-id", + [PARSE_EVENTS__TERM_TYPE_RAW] =3D "raw", + [PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE] =3D "legacy-cache", + [PARSE_EVENTS__TERM_TYPE_HARDWARE] =3D "hardware", + }; + if ((unsigned int)term_type >=3D __PARSE_EVENTS__TERM_TYPE_NR) + return "unknown term"; + + return config_term_names[term_type]; +} + static bool -config_term_avail(int term_type, struct parse_events_error *err) +config_term_avail(enum parse_events__term_type term_type, struct parse_eve= nts_error *err) { char *err_str; =20 @@ -794,13 +801,31 @@ config_term_avail(int term_type, struct parse_events_= error *err) case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD: case PARSE_EVENTS__TERM_TYPE_PERCORE: return true; + case PARSE_EVENTS__TERM_TYPE_USER: + case PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ: + case PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE: + case PARSE_EVENTS__TERM_TYPE_TIME: + case PARSE_EVENTS__TERM_TYPE_CALLGRAPH: + case PARSE_EVENTS__TERM_TYPE_STACKSIZE: + case PARSE_EVENTS__TERM_TYPE_NOINHERIT: + case PARSE_EVENTS__TERM_TYPE_INHERIT: + case PARSE_EVENTS__TERM_TYPE_MAX_STACK: + case PARSE_EVENTS__TERM_TYPE_MAX_EVENTS: + case PARSE_EVENTS__TERM_TYPE_NOOVERWRITE: + case PARSE_EVENTS__TERM_TYPE_OVERWRITE: + case PARSE_EVENTS__TERM_TYPE_DRV_CFG: + case PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT: + case PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE: + case PARSE_EVENTS__TERM_TYPE_RAW: + case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE: + case PARSE_EVENTS__TERM_TYPE_HARDWARE: default: if (!err) return false; =20 /* term_type is validated so indexing is safe */ if (asprintf(&err_str, "'%s' is not usable in 'perf stat'", - config_term_names[term_type]) >=3D 0) + config_term_name(term_type)) >=3D 0) parse_events_error__handle(err, -1, err_str, NULL); return false; } @@ -918,10 +943,14 @@ do { \ return -EINVAL; } break; + case PARSE_EVENTS__TERM_TYPE_DRV_CFG: + case PARSE_EVENTS__TERM_TYPE_USER: + case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE: + case PARSE_EVENTS__TERM_TYPE_HARDWARE: default: parse_events_error__handle(err, term->err_term, - strdup("unknown term"), - parse_events_formats_error_string(NULL)); + strdup(config_term_name(term->type_term)), + parse_events_formats_error_string(NULL)); return -EINVAL; } =20 @@ -1007,10 +1036,26 @@ static int config_term_tracepoint(struct perf_event= _attr *attr, case PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT: case PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE: return config_term_common(attr, term, err); + case PARSE_EVENTS__TERM_TYPE_USER: + case PARSE_EVENTS__TERM_TYPE_CONFIG: + case PARSE_EVENTS__TERM_TYPE_CONFIG1: + case PARSE_EVENTS__TERM_TYPE_CONFIG2: + case PARSE_EVENTS__TERM_TYPE_CONFIG3: + case PARSE_EVENTS__TERM_TYPE_NAME: + case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD: + case PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ: + case PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE: + case PARSE_EVENTS__TERM_TYPE_TIME: + case PARSE_EVENTS__TERM_TYPE_DRV_CFG: + case PARSE_EVENTS__TERM_TYPE_PERCORE: + case PARSE_EVENTS__TERM_TYPE_METRIC_ID: + case PARSE_EVENTS__TERM_TYPE_RAW: + case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE: + case PARSE_EVENTS__TERM_TYPE_HARDWARE: default: if (err) { parse_events_error__handle(err, term->err_term, - strdup("unknown term"), + strdup(config_term_name(term->type_term)), strdup("valid terms: call-graph,stack-size\n")); } return -EINVAL; @@ -1128,6 +1173,16 @@ do { \ ADD_CONFIG_TERM_VAL(AUX_SAMPLE_SIZE, aux_sample_size, term->val.num, term->weak); break; + case PARSE_EVENTS__TERM_TYPE_USER: + case PARSE_EVENTS__TERM_TYPE_CONFIG: + case PARSE_EVENTS__TERM_TYPE_CONFIG1: + case PARSE_EVENTS__TERM_TYPE_CONFIG2: + case PARSE_EVENTS__TERM_TYPE_CONFIG3: + case PARSE_EVENTS__TERM_TYPE_NAME: + case PARSE_EVENTS__TERM_TYPE_METRIC_ID: + case PARSE_EVENTS__TERM_TYPE_RAW: + case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE: + case PARSE_EVENTS__TERM_TYPE_HARDWARE: default: break; } @@ -1157,6 +1212,30 @@ static int get_config_chgs(struct perf_pmu *pmu, str= uct list_head *head_config, case PARSE_EVENTS__TERM_TYPE_CONFIG: bits =3D ~(u64)0; break; + case PARSE_EVENTS__TERM_TYPE_CONFIG1: + case PARSE_EVENTS__TERM_TYPE_CONFIG2: + case PARSE_EVENTS__TERM_TYPE_CONFIG3: + case PARSE_EVENTS__TERM_TYPE_NAME: + case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD: + case PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ: + case PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE: + case PARSE_EVENTS__TERM_TYPE_TIME: + case PARSE_EVENTS__TERM_TYPE_CALLGRAPH: + case PARSE_EVENTS__TERM_TYPE_STACKSIZE: + case PARSE_EVENTS__TERM_TYPE_NOINHERIT: + case PARSE_EVENTS__TERM_TYPE_INHERIT: + case PARSE_EVENTS__TERM_TYPE_MAX_STACK: + case PARSE_EVENTS__TERM_TYPE_MAX_EVENTS: + case PARSE_EVENTS__TERM_TYPE_NOOVERWRITE: + case PARSE_EVENTS__TERM_TYPE_OVERWRITE: + case PARSE_EVENTS__TERM_TYPE_DRV_CFG: + case PARSE_EVENTS__TERM_TYPE_PERCORE: + case PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT: + case PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE: + case PARSE_EVENTS__TERM_TYPE_METRIC_ID: + case PARSE_EVENTS__TERM_TYPE_RAW: + case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE: + case PARSE_EVENTS__TERM_TYPE_HARDWARE: default: break; } @@ -2386,7 +2465,8 @@ static int new_term(struct parse_events_term **_term, } =20 int parse_events_term__num(struct parse_events_term **term, - int type_term, const char *config, u64 num, + enum parse_events__term_type type_term, + const char *config, u64 num, bool no_value, void *loc_term_, void *loc_val_) { @@ -2396,7 +2476,7 @@ int parse_events_term__num(struct parse_events_term *= *term, struct parse_events_term temp =3D { .type_val =3D PARSE_EVENTS__TERM_TYPE_NUM, .type_term =3D type_term, - .config =3D config ? : strdup(config_term_names[type_term]), + .config =3D config ? : strdup(config_term_name(type_term)), .no_value =3D no_value, .err_term =3D loc_term ? loc_term->first_column : 0, .err_val =3D loc_val ? loc_val->first_column : 0, @@ -2406,7 +2486,8 @@ int parse_events_term__num(struct parse_events_term *= *term, } =20 int parse_events_term__str(struct parse_events_term **term, - int type_term, char *config, char *str, + enum parse_events__term_type type_term, + char *config, char *str, void *loc_term_, void *loc_val_) { YYLTYPE *loc_term =3D loc_term_; @@ -2424,11 +2505,12 @@ int parse_events_term__str(struct parse_events_term= **term, } =20 int parse_events_term__term(struct parse_events_term **term, - int term_lhs, int term_rhs, + enum parse_events__term_type term_lhs, + enum parse_events__term_type term_rhs, void *loc_term, void *loc_val) { return parse_events_term__str(term, term_lhs, NULL, - strdup(config_term_names[term_rhs]), + strdup(config_term_name(term_rhs)), loc_term, loc_val); } =20 @@ -2539,7 +2621,7 @@ int parse_events_term__to_strbuf(struct list_head *te= rm_list, struct strbuf *sb) if (ret < 0) return ret; } else if (term->type_term < __PARSE_EVENTS__TERM_TYPE_NR) { - ret =3D strbuf_addf(sb, "%s=3D", config_term_names[term->type_term]); + ret =3D strbuf_addf(sb, "%s=3D", config_term_name(term->type_term)); if (ret < 0) return ret; } @@ -2567,7 +2649,7 @@ static void config_terms_list(char *buf, size_t buf_s= z) =20 buf[0] =3D '\0'; for (i =3D 0; i < __PARSE_EVENTS__TERM_TYPE_NR; i++) { - const char *name =3D config_term_names[i]; + const char *name =3D config_term_name(i); =20 if (!config_term_avail(i, NULL)) continue; diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index 20bdc35d6112..855b0725c5d4 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h @@ -48,12 +48,12 @@ int parse_events_terms(struct list_head *terms, const c= har *str, FILE *input); int parse_filter(const struct option *opt, const char *str, int unset); int exclude_perf(const struct option *opt, const char *arg, int unset); =20 -enum { +enum parse_events__term_val_type { PARSE_EVENTS__TERM_TYPE_NUM, PARSE_EVENTS__TERM_TYPE_STR, }; =20 -enum { +enum parse_events__term_type { PARSE_EVENTS__TERM_TYPE_USER, PARSE_EVENTS__TERM_TYPE_CONFIG, PARSE_EVENTS__TERM_TYPE_CONFIG1, @@ -80,27 +80,54 @@ enum { PARSE_EVENTS__TERM_TYPE_RAW, PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE, PARSE_EVENTS__TERM_TYPE_HARDWARE, - __PARSE_EVENTS__TERM_TYPE_NR, +#define __PARSE_EVENTS__TERM_TYPE_NR (PARSE_EVENTS__TERM_TYPE_HARDWARE + 1) }; =20 struct parse_events_term { + /** @list: The term list the term is a part of. */ + struct list_head list; + /** + * @config: The left-hand side of a term assignment, so the term + * "event=3D8" would have the config be "event" + */ const char *config; + /** + * @val: The right-hand side of a term assignment that can either be a + * string or a number depending on type_val. + */ union { char *str; u64 num; } val; - int type_val; - int type_term; - struct list_head list; - bool used; - bool no_value; - - /* error string indexes for within parsed string */ + /** @type_val: The union variable in val to be used for the term. */ + enum parse_events__term_val_type type_val; + /** + * @type_term: A predefined term type or PARSE_EVENTS__TERM_TYPE_USER + * when not inbuilt. + */ + enum parse_events__term_type type_term; + /** + * @err_term: The column index of the term from parsing, used during + * error output. + */ int err_term; + /** + * @err_val: The column index of the val from parsing, used during error + * output. + */ int err_val; - - /* Coming from implicit alias */ + /** @used: Was the term used during parameterized-eval. */ + bool used; + /** + * @weak: A term from the sysfs or json encoding of an event that + * shouldn't override terms coming from the command line. + */ bool weak; + /** + * @no_value: Is there no value. TODO: this should really be part of + * type_val. + */ + bool no_value; }; =20 struct parse_events_error { @@ -139,14 +166,17 @@ bool parse_events__filter_pmu(const struct parse_even= ts_state *parse_state, void parse_events__shrink_config_terms(void); int parse_events__is_hardcoded_term(struct parse_events_term *term); int parse_events_term__num(struct parse_events_term **term, - int type_term, const char *config, u64 num, + enum parse_events__term_type type_term, + const char *config, u64 num, bool novalue, void *loc_term, void *loc_val); int parse_events_term__str(struct parse_events_term **term, - int type_term, char *config, char *str, + enum parse_events__term_type type_term, + char *config, char *str, void *loc_term, void *loc_val); int parse_events_term__term(struct parse_events_term **term, - int term_lhs, int term_rhs, + enum parse_events__term_type term_lhs, + enum parse_events__term_type term_rhs, void *loc_term, void *loc_val); int parse_events_term__clone(struct parse_events_term **new, struct parse_events_term *term); diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l index 1147084b2c76..4ef4b6f171a0 100644 --- a/tools/perf/util/parse-events.l +++ b/tools/perf/util/parse-events.l @@ -116,7 +116,7 @@ static int tool(yyscan_t scanner, enum perf_tool_event = event) return PE_VALUE_SYM_TOOL; } =20 -static int term(yyscan_t scanner, int type) +static int term(yyscan_t scanner, enum parse_events__term_type type) { YYSTYPE *yylval =3D parse_events_get_lval(scanner); =20 diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index 4a370c36a0d5..534daed91c50 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -777,7 +777,8 @@ PE_TERM_HW PE_TERM '=3D' name_or_legacy { struct parse_events_term *term; - int err =3D parse_events_term__str(&term, (int)$1, NULL, $3, &@1, &@3); + int err =3D parse_events_term__str(&term, (enum parse_events__term_type)$= 1, + /*config=3D*/NULL, $3, &@1, &@3); =20 if (err) { free($3); @@ -789,7 +790,8 @@ PE_TERM '=3D' name_or_legacy PE_TERM '=3D' PE_TERM_HW { struct parse_events_term *term; - int err =3D parse_events_term__str(&term, (int)$1, NULL, $3.str, &@1, &@3= ); + int err =3D parse_events_term__str(&term, (enum parse_events__term_type)$= 1, + /*config=3D*/NULL, $3.str, &@1, &@3); =20 if (err) { free($3.str); @@ -801,7 +803,10 @@ PE_TERM '=3D' PE_TERM_HW PE_TERM '=3D' PE_TERM { struct parse_events_term *term; - int err =3D parse_events_term__term(&term, (int)$1, (int)$3, &@1, &@3); + int err =3D parse_events_term__term(&term, + (enum parse_events__term_type)$1, + (enum parse_events__term_type)$3, + &@1, &@3); =20 if (err) PE_ABORT(err); @@ -812,7 +817,8 @@ PE_TERM '=3D' PE_TERM PE_TERM '=3D' PE_VALUE { struct parse_events_term *term; - int err =3D parse_events_term__num(&term, (int)$1, NULL, $3, false, &@1, = &@3); + int err =3D parse_events_term__num(&term, (enum parse_events__term_type)$= 1, + /*config=3D*/NULL, $3, /*novalue=3D*/false, &@1, &@3); =20 if (err) PE_ABORT(err); @@ -823,7 +829,9 @@ PE_TERM '=3D' PE_VALUE PE_TERM { struct parse_events_term *term; - int err =3D parse_events_term__num(&term, (int)$1, NULL, 1, true, &@1, NU= LL); + int err =3D parse_events_term__num(&term, (enum parse_events__term_type)$= 1, + /*config=3D*/NULL, /*num=3D*/1, /*novalue=3D*/true, + &@1, /*loc_val=3D*/NULL); =20 if (err) PE_ABORT(err); --=20 2.42.0.rc2.253.gd59a3bf2b4-goog From nobody Thu Dec 18 18:01:35 2025 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 7EA86C83F2B for ; Thu, 31 Aug 2023 07:14:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1343765AbjHaHO6 (ORCPT ); Thu, 31 Aug 2023 03:14:58 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33796 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S245389AbjHaHOw (ORCPT ); Thu, 31 Aug 2023 03:14:52 -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 9A0C2CC5 for ; Thu, 31 Aug 2023 00:14:49 -0700 (PDT) Received: by mail-yb1-xb4a.google.com with SMTP id 3f1490d57ef6-d7493303b5cso373779276.2 for ; Thu, 31 Aug 2023 00:14:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1693466089; x=1694070889; darn=vger.kernel.org; h=to:from:subject:references:mime-version:message-id:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=l5R5LTR1o+O1ggaXGLd8xlIboaGHj+v+QmwBBnwG6HY=; b=Cq7lo1IsSWnaAKZ03XF+9nF2kWY28QTYe5oNRGuEcHsNbGNvP7TdnDOGPIRTfHrttJ VPHFS5994RjABbYdG2WHEXx9uGCqCkyaIZViCcvri1mVjhvnwjRt6MuphLdDV3zWylqq zPLypU1yIusm7/jnz9sa66XxDNPJRgB5526iQTwwIcvSot/EgLKgM+elkXV6GoP4r+Xw T9YV6MixOAN+iXObYa1iJpKtIUnYssDC7IjYGO8eet7SWPtBDlhod1qLN7yPjLmnXkP0 yvFb+os9FinfF72UVvEaoIz7nn/TNX4oTjPGb4XanKs2opcSFa8Y8QA90a5FAjRmUDaB NJKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1693466089; x=1694070889; h=to:from:subject:references:mime-version:message-id:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=l5R5LTR1o+O1ggaXGLd8xlIboaGHj+v+QmwBBnwG6HY=; b=lKLYNaJVg20xFhpXebL5qR/YQfDIivnJFOqaf4051HcMT4miBqboyRXtpr80OtHRPp 3m9kKj7X9uFPUL9FIo/kPBUXD0MlnEQ3UrlUl7GjLynARjWgclO+YPjFuHyq+qPBHuoI AnXRhIu0mHZNvwnuvOug8b+tPXzwa62x9ECG/lr31uT9UjmcCYVkKdqcD9LmtGc1h+2F Fz9EYmaA2QeZHHuJVAPMbktfG9ji2NrCN1F8NF0KMSPHTNhaJME2Ldk53C/aCDfW5Kv7 6R/shHTIrmmMA1K8YKX4qq72QkciATpIioKJYxxsbDCPLw3YlSiQBwOtCFfN40hxxwdT SGCg== X-Gm-Message-State: AOJu0YwUda9Kiw55HWXpGrKjxSD7S5BetcNu8XS4gGLqo0fvZgK0bfTm dWH6cOrgxqkEALB2aG5R4BnAe/1tCgeN X-Google-Smtp-Source: AGHT+IFiIX1fcSRdJtWjhfy1sxtZ93298AD9cMAT4KuCQqTCkhOqdD4bkF/mJIFj3cYchCpTNuQwbz7hzFY4 X-Received: from irogers.svl.corp.google.com ([2620:15c:2a3:200:feef:cd5e:6353:57f0]) (user=irogers job=sendgmr) by 2002:a25:dc84:0:b0:d72:8661:ee29 with SMTP id y126-20020a25dc84000000b00d728661ee29mr123139ybe.2.1693466088813; Thu, 31 Aug 2023 00:14:48 -0700 (PDT) Date: Thu, 31 Aug 2023 00:14:21 -0700 In-Reply-To: <20230831071421.2201358-1-irogers@google.com> Message-Id: <20230831071421.2201358-4-irogers@google.com> Mime-Version: 1.0 References: <20230831071421.2201358-1-irogers@google.com> X-Mailer: git-send-email 2.42.0.rc2.253.gd59a3bf2b4-goog Subject: [PATCH v1 3/3] perf parse-events: Fix propagation of term's no_value when cloning From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , Kan Liang , Rob Herring , James Clark , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org 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 no_value field in parse_events_term indicates that the val variable isn't used, the case for an event name. Cloning wasn't propagating this, making cloned event name terms appearing to have a constant assinged to them. Working around the bug would check for a value of 1 assigned to value, but then this meant a user value of 1 couldn't be differentiated causing the value to be lost in debug printing and perf list. The change fixes the cloning and updates the "val.num =3D=3D/!=3D 1" tests to use no_value instead. To better check the no_value is set appropriately parameter comments are added for constant values. This found that no_value wasn't set correctly in parse_events_multi_pmu_add, which matters now that no_value is used to indicate an event name. Fixes: 7a6e91644708 ("perf parse-events: Make common term list to strbuf he= lper") Fixes: 99e7138eb789 ("perf tools: Fail on using multiple bits long terms wi= thout value") Signed-off-by: Ian Rogers Tested-by: Kan Liang --- tools/perf/util/parse-events.c | 29 +++++++++++++---------------- tools/perf/util/parse-events.y | 9 +++++---- tools/perf/util/pmu.c | 2 +- 3 files changed, 19 insertions(+), 21 deletions(-) diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 51b73207e9f4..68fe2c4ff49f 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -1510,8 +1510,8 @@ int parse_events_multi_pmu_add(struct parse_events_st= ate *parse_state, =20 if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, - config, 1, false, NULL, - NULL) < 0) { + config, /*num=3D*/1, /*novalue=3D*/true, + loc, /*loc_val=3D*/NULL) < 0) { zfree(&config); goto out_err; } @@ -2482,7 +2482,7 @@ int parse_events_term__num(struct parse_events_term *= *term, .err_val =3D loc_val ? loc_val->first_column : 0, }; =20 - return new_term(term, &temp, NULL, num); + return new_term(term, &temp, /*str=3D*/NULL, num); } =20 int parse_events_term__str(struct parse_events_term **term, @@ -2501,7 +2501,7 @@ int parse_events_term__str(struct parse_events_term *= *term, .err_val =3D loc_val ? loc_val->first_column : 0, }; =20 - return new_term(term, &temp, str, 0); + return new_term(term, &temp, str, /*num=3D*/0); } =20 int parse_events_term__term(struct parse_events_term **term, @@ -2518,26 +2518,21 @@ int parse_events_term__clone(struct parse_events_te= rm **new, struct parse_events_term *term) { char *str; - struct parse_events_term temp =3D { - .type_val =3D term->type_val, - .type_term =3D term->type_term, - .config =3D NULL, - .err_term =3D term->err_term, - .err_val =3D term->err_val, - }; + struct parse_events_term temp =3D *term; =20 + temp.used =3D false; if (term->config) { temp.config =3D strdup(term->config); if (!temp.config) return -ENOMEM; } if (term->type_val =3D=3D PARSE_EVENTS__TERM_TYPE_NUM) - return new_term(new, &temp, NULL, term->val.num); + return new_term(new, &temp, /*str=3D*/NULL, term->val.num); =20 str =3D strdup(term->val.str); if (!str) return -ENOMEM; - return new_term(new, &temp, str, 0); + return new_term(new, &temp, str, /*num=3D*/0); } =20 void parse_events_term__delete(struct parse_events_term *term) @@ -2611,20 +2606,22 @@ int parse_events_term__to_strbuf(struct list_head *= term_list, struct strbuf *sb) first =3D false; =20 if (term->type_val =3D=3D PARSE_EVENTS__TERM_TYPE_NUM) - if (term->type_term =3D=3D PARSE_EVENTS__TERM_TYPE_USER && term->val.nu= m =3D=3D 1) + if (term->no_value) { + assert(term->type_term =3D=3D PARSE_EVENTS__TERM_TYPE_USER); ret =3D strbuf_addf(sb, "%s", term->config); - else + } else ret =3D strbuf_addf(sb, "%s=3D%#"PRIx64, term->config, term->val.num); else if (term->type_val =3D=3D PARSE_EVENTS__TERM_TYPE_STR) { if (term->config) { ret =3D strbuf_addf(sb, "%s=3D", term->config); if (ret < 0) return ret; - } else if (term->type_term < __PARSE_EVENTS__TERM_TYPE_NR) { + } else if ((unsigned int)term->type_term < __PARSE_EVENTS__TERM_TYPE_NR= ) { ret =3D strbuf_addf(sb, "%s=3D", config_term_name(term->type_term)); if (ret < 0) return ret; } + assert(!term->no_value); ret =3D strbuf_addf(sb, "%s", term->val.str); } if (ret < 0) diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index 534daed91c50..4a305df61f74 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -712,7 +712,7 @@ name_or_raw '=3D' PE_VALUE { struct parse_events_term *term; int err =3D parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, - $1, $3, false, &@1, &@3); + $1, $3, /*novalue=3D*/false, &@1, &@3); =20 if (err) { free($1); @@ -739,7 +739,7 @@ PE_LEGACY_CACHE { struct parse_events_term *term; int err =3D parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_LEGACY_= CACHE, - $1, 1, true, &@1, NULL); + $1, /*num=3D*/1, /*novalue=3D*/true, &@1, /*loc_val=3D*/NULL); =20 if (err) { free($1); @@ -752,7 +752,7 @@ PE_NAME { struct parse_events_term *term; int err =3D parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, - $1, 1, true, &@1, NULL); + $1, /*num=3D*/1, /*novalue=3D*/true, &@1, /*loc_val=3D*/NULL); =20 if (err) { free($1); @@ -765,7 +765,8 @@ PE_TERM_HW { struct parse_events_term *term; int err =3D parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_HARDWAR= E, - $1.str, $1.num & 255, false, &@1, NULL); + $1.str, $1.num & 255, /*novalue=3D*/false, + &@1, /*loc_val=3D*/NULL); =20 if (err) { free($1.str); diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index 152cda84f273..d85602aa4b9f 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -1396,7 +1396,7 @@ static struct perf_pmu_alias *pmu_find_alias(struct p= erf_pmu *pmu, return NULL; =20 if (term->type_val =3D=3D PARSE_EVENTS__TERM_TYPE_NUM) { - if (term->val.num !=3D 1) + if (!term->no_value) return NULL; if (pmu_find_format(&pmu->format, term->config)) return NULL; --=20 2.42.0.rc2.253.gd59a3bf2b4-goog