From nobody Thu Oct 2 18:06:26 2025 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A7B8F2E888C for ; Sun, 14 Sep 2025 18:12:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757873527; cv=none; b=klwn3+VEXVtLeBdZElbPkUvHdXgl04bfioKx0N9Ei7UVexOPhbUiI8MnQeh02BDXjBl7GZXh7h7nXpEKufZs3sRMatYAjcB5ThaJseRy4KP6oegcpsD7Spec5TeIs+1nNETpuEfEz68gM3Apes6Ljx9w4XvZKVsi1aSqCs4u0J4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757873527; c=relaxed/simple; bh=YGMlOPsQY0hS1FbIjoAhFgk7taxcZ7ly+5Y8Bc8jJm0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=mnp93HV+09Bzaxkhu7HR1nbrrIg2nsBtcy4Ihiy/h160Y+lS58IEtHrKR+gVLAw/TWpGQsELQ5yV+O0YeRpLKdn1C1A0XvfJv3LRgw/G9BlIMHRXVBDXXHDoNhP+3w8YgfKYVhCgckzRCG4qO+/XdgOWJSMvi9OTBDlA2fnjxEQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=BWmgaa1K; arc=none smtp.client-ip=209.85.214.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="BWmgaa1K" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2665df2e24aso4189845ad.2 for ; Sun, 14 Sep 2025 11:12:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1757873524; x=1758478324; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=K3HS3F+a4MkqhTUFmgS8wFSMiMxKWwkY+tvpDfXEhKQ=; b=BWmgaa1KkPS3L1L+tNcphgf2Lo1b2dEBgZ3NtkfFs7e8txBXqsgt/pDDZ+e47/taC3 XchD4y0EvX+PySQq4NxSlgDra98p6I25ok0EsgrKnnrzQunN+7zSDkAEj9gzRCnTzI0S Wp1j/3Of3OPEI3poWX2gZK+gF9Bp5oCqenUn+eRY/6x8R/1/wZrrN9QWJGL+eDnbEWKG 8eahSJPgyd6U4FvM5lHxSmtTeDadzpyOp7wsCud+wxgFRkiP8EzrtBR6cKch719GCJ7Z CpCOtltsXmORk6x+J9h+GxY0AnRG1D8ujsC1x9fm8WjRJYy72fYM+q4pZfGyYNTQDoao 4lzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757873524; x=1758478324; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=K3HS3F+a4MkqhTUFmgS8wFSMiMxKWwkY+tvpDfXEhKQ=; b=qAUqp3TBgIhccPakvaLW5Fue5EVVu+xTydcdYKLut6G94b8isvDm7nLGWFwyZqZb03 ZF5bLdy/rqP06forICs+2/qsPoKEg/h+Hep4ZEi41Rq5SrzXk/ukQUWHpEeks+AEHKuK CVOHh8+CrHdQm1pE06AIUziOIEdl7xkZ5cbRaQILQeFNydepOmknOcK+C5Qk50gqKnSx HAVYzzhKhUo9XaJml8iIW5IAemvl5N29scTPSWiQUV81bapd+xI6ECyvuaZS4fnXZVgn IE2RTyBOBZOluvXEAw7iFsSa/HMPeFGTOi3ReocYMds6tqgxx8rfiRgj8YG7fUaJtx3v OIMw== X-Forwarded-Encrypted: i=1; AJvYcCU1eRmgg06NjTgeu/MfTeAuP/gYhY3U4i/u2S3uo19o2M6s9JBadisbBPs6elBGiYieDvS4MS2JiOVoPcg=@vger.kernel.org X-Gm-Message-State: AOJu0YzQv7naj28bb88eLuT92mLZHbhOEXPmkRAGuwCiRCDCBIMilQhq ud2Apkqcw9hp0qctkMgJ/6E6eyfpDpNkFlqFdOaJzdvA/37uUazqaWO3C86MAVHdLU5/qP7lxRl bWrYl7CIL+g== X-Google-Smtp-Source: AGHT+IGsh3vLBHwnJUL4win41JQSrMrRhUFPE3RQXe7UrnWY8LOHLtjzbWd1BgEnWyAkK84QSxjvjAV2Xfyw X-Received: from plbnb15.prod.google.com ([2002:a17:903:15cf:b0:24c:af07:f077]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:f78c:b0:25d:89ca:35d4 with SMTP id d9443c01a7336-25d89ca40fdmr106751025ad.4.1757873524153; Sun, 14 Sep 2025 11:12:04 -0700 (PDT) Date: Sun, 14 Sep 2025 11:11:20 -0700 In-Reply-To: <20250914181121.1952748-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250914181121.1952748-1-irogers@google.com> X-Mailer: git-send-email 2.51.0.384.g4c02a37b29-goog Message-ID: <20250914181121.1952748-21-irogers@google.com> Subject: [PATCH v4 20/21] perf parse-events: Add HW_CYCLES_STR as default cycles event string From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , James Clark , Xu Yang , Thomas Falcon , Andi Kleen , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, bpf@vger.kernel.org, Atish Patra , Beeman Strong , Leo Yan , Vince Weaver Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" ARM managed to significantly overload the meaning of the "cycles" event in their PMU kernel drivers through sysfs. In the tool use "cpu-cycles" on ARM to avoid wildcard matching on different PMUS. This is most commonly done in test code. Signed-off-by: Ian Rogers --- tools/perf/builtin-stat.c | 4 +- tools/perf/tests/code-reading.c | 4 +- tools/perf/tests/keep-tracking.c | 2 +- tools/perf/tests/parse-events.c | 100 ++++++++++++++-------------- tools/perf/tests/perf-time-to-tsc.c | 2 +- tools/perf/tests/switch-tracking.c | 2 +- tools/perf/util/evlist.c | 2 +- tools/perf/util/parse-events.h | 10 +++ tools/perf/util/perf_api_probe.c | 4 +- 9 files changed, 71 insertions(+), 59 deletions(-) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 2c38dd98f6ca..9f522b787ad5 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -1957,7 +1957,7 @@ static int add_default_events(void) "cpu-migrations," "page-faults," "instructions," - "cycles," + HW_CYCLES_STR "," "stalled-cycles-frontend," "stalled-cycles-backend," "branches," @@ -2043,7 +2043,7 @@ static int add_default_events(void) * Make at least one event non-skippable so fatal errors are visible. * 'cycles' always used to be default and non-skippable, so use that. */ - if (strcmp("cycles", evsel__name(evsel))) + if (strcmp(HW_CYCLES_STR, evsel__name(evsel))) evsel->skippable =3D true; } } diff --git a/tools/perf/tests/code-reading.c b/tools/perf/tests/code-readin= g.c index 9c2091310191..baa44918f555 100644 --- a/tools/perf/tests/code-reading.c +++ b/tools/perf/tests/code-reading.c @@ -649,7 +649,9 @@ static int do_test_code_reading(bool try_kcore) struct map *map; bool have_vmlinux, have_kcore; struct dso *dso; - const char *events[] =3D { "cycles", "cycles:u", "cpu-clock", "cpu-clock:= u", NULL }; + const char *events[] =3D { + HW_CYCLES_STR, HW_CYCLES_STR ":u", "cpu-clock", "cpu-clock:u", NULL + }; int evidx =3D 0; struct perf_env host_env; =20 diff --git a/tools/perf/tests/keep-tracking.c b/tools/perf/tests/keep-track= ing.c index eafb49eb0b56..d54ddb4db47b 100644 --- a/tools/perf/tests/keep-tracking.c +++ b/tools/perf/tests/keep-tracking.c @@ -90,7 +90,7 @@ static int test__keep_tracking(struct test_suite *test __= maybe_unused, int subte perf_evlist__set_maps(&evlist->core, cpus, threads); =20 CHECK__(parse_event(evlist, "dummy:u")); - CHECK__(parse_event(evlist, "cycles:u")); + CHECK__(parse_event(evlist, HW_CYCLES_STR ":u")); =20 evlist__config(evlist, &opts, NULL); =20 diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-event= s.c index 4e55b0d295bd..7d59648a0591 100644 --- a/tools/perf/tests/parse-events.c +++ b/tools/perf/tests/parse-events.c @@ -198,7 +198,7 @@ static int test__checkevent_symbolic_name_config(struct= evlist *evlist) TEST_ASSERT_VAL("wrong number of entries", 0 !=3D evlist->core.nr_entries= ); =20 perf_evlist__for_each_evsel(&evlist->core, evsel) { - int ret =3D assert_hw(evsel, PERF_COUNT_HW_CPU_CYCLES, "cycles"); + int ret =3D assert_hw(evsel, PERF_COUNT_HW_CPU_CYCLES, HW_CYCLES_STR); =20 if (ret) return ret; @@ -884,7 +884,7 @@ static int test__group1(struct evlist *evlist) =20 /* cycles:upp */ evsel =3D evsel__next(evsel); - ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles"); + ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, HW_CYCLES_STR); if (ret) return ret; =20 @@ -948,7 +948,7 @@ static int test__group2(struct evlist *evlist) continue; } /* cycles:k */ - ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles"); + ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, HW_CYCLES_STR); if (ret) return ret; =20 @@ -1085,7 +1085,7 @@ static int test__group4(struct evlist *evlist __maybe= _unused) =20 /* cycles:u + p */ evsel =3D leader =3D (i =3D=3D 0 ? evlist__first(evlist) : evsel__next(e= vsel)); - ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles"); + ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, HW_CYCLES_STR); if (ret) return ret; =20 @@ -1133,7 +1133,7 @@ static int test__group5(struct evlist *evlist __maybe= _unused) for (int i =3D 0; i < num_core_entries(); i++) { /* cycles + G */ evsel =3D leader =3D (i =3D=3D 0 ? evlist__first(evlist) : evsel__next(e= vsel)); - ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles"); + ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, HW_CYCLES_STR); if (ret) return ret; =20 @@ -1168,7 +1168,7 @@ static int test__group5(struct evlist *evlist __maybe= _unused) for (int i =3D 0; i < num_core_entries(); i++) { /* cycles:G */ evsel =3D leader =3D evsel__next(evsel); - ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles"); + ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, HW_CYCLES_STR); if (ret) return ret; =20 @@ -1202,7 +1202,7 @@ static int test__group5(struct evlist *evlist __maybe= _unused) for (int i =3D 0; i < num_core_entries(); i++) { /* cycles */ evsel =3D evsel__next(evsel); - ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles"); + ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, HW_CYCLES_STR); if (ret) return ret; =20 @@ -1231,7 +1231,7 @@ static int test__group_gh1(struct evlist *evlist) =20 /* cycles + :H group modifier */ evsel =3D leader =3D (i =3D=3D 0 ? evlist__first(evlist) : evsel__next(e= vsel)); - ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles"); + ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, HW_CYCLES_STR); if (ret) return ret; =20 @@ -1278,7 +1278,7 @@ static int test__group_gh2(struct evlist *evlist) =20 /* cycles + :G group modifier */ evsel =3D leader =3D (i =3D=3D 0 ? evlist__first(evlist) : evsel__next(e= vsel)); - ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles"); + ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, HW_CYCLES_STR); if (ret) return ret; =20 @@ -1325,7 +1325,7 @@ static int test__group_gh3(struct evlist *evlist) =20 /* cycles:G + :u group modifier */ evsel =3D leader =3D (i =3D=3D 0 ? evlist__first(evlist) : evsel__next(e= vsel)); - ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles"); + ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, HW_CYCLES_STR); if (ret) return ret; =20 @@ -1372,7 +1372,7 @@ static int test__group_gh4(struct evlist *evlist) =20 /* cycles:G + :uG group modifier */ evsel =3D leader =3D (i =3D=3D 0 ? evlist__first(evlist) : evsel__next(e= vsel)); - ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles"); + ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, HW_CYCLES_STR); if (ret) return ret; =20 @@ -1417,7 +1417,7 @@ static int test__leader_sample1(struct evlist *evlist) =20 /* cycles - sampling group leader */ evsel =3D leader =3D (i =3D=3D 0 ? evlist__first(evlist) : evsel__next(e= vsel)); - ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles"); + ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, HW_CYCLES_STR); if (ret) return ret; =20 @@ -1540,7 +1540,7 @@ static int test__pinned_group(struct evlist *evlist) =20 /* cycles - group leader */ evsel =3D leader =3D (i =3D=3D 0 ? evlist__first(evlist) : evsel__next(e= vsel)); - ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles"); + ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, HW_CYCLES_STR); if (ret) return ret; =20 @@ -1594,7 +1594,7 @@ static int test__exclusive_group(struct evlist *evlis= t) =20 /* cycles - group leader */ evsel =3D leader =3D (i =3D=3D 0 ? evlist__first(evlist) : evsel__next(e= vsel)); - ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles"); + ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, HW_CYCLES_STR); if (ret) return ret; =20 @@ -1759,7 +1759,7 @@ static int test__checkevent_raw_pmu(struct evlist *ev= list) static int test__sym_event_slash(struct evlist *evlist) { struct evsel *evsel =3D evlist__first(evlist); - int ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles"); + int ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, HW_CYCLES_S= TR); =20 if (ret) return ret; @@ -1771,7 +1771,7 @@ static int test__sym_event_slash(struct evlist *evlis= t) static int test__sym_event_dc(struct evlist *evlist) { struct evsel *evsel =3D evlist__first(evlist); - int ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles"); + int ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, HW_CYCLES_S= TR); =20 if (ret) return ret; @@ -1783,7 +1783,7 @@ static int test__sym_event_dc(struct evlist *evlist) static int test__term_equal_term(struct evlist *evlist) { struct evsel *evsel =3D evlist__first(evlist); - int ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles"); + int ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, HW_CYCLES_S= TR); =20 if (ret) return ret; @@ -1795,7 +1795,7 @@ static int test__term_equal_term(struct evlist *evlis= t) static int test__term_equal_legacy(struct evlist *evlist) { struct evsel *evsel =3D evlist__first(evlist); - int ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles"); + int ret =3D assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, HW_CYCLES_S= TR); =20 if (ret) return ret; @@ -2006,27 +2006,27 @@ static const struct evlist_test test__events[] =3D { /* 7 */ }, { - .name =3D "{instructions:k,cycles:upp}", + .name =3D "{instructions:k," HW_CYCLES_STR ":upp}", .check =3D test__group1, /* 8 */ }, { - .name =3D "{faults:k,branches}:u,cycles:k", + .name =3D "{faults:k,branches}:u," HW_CYCLES_STR ":k", .check =3D test__group2, /* 9 */ }, { - .name =3D "group1{syscalls:sys_enter_openat:H,cycles:kppp},group2{cycle= s,1:3}:G,instructions:u", + .name =3D "group1{syscalls:sys_enter_openat:H," HW_CYCLES_STR ":kppp},g= roup2{" HW_CYCLES_STR ",1:3}:G,instructions:u", .check =3D test__group3, /* 0 */ }, { - .name =3D "{cycles:u,instructions:kp}:p", + .name =3D "{" HW_CYCLES_STR ":u,instructions:kp}:p", .check =3D test__group4, /* 1 */ }, { - .name =3D "{cycles,instructions}:G,{cycles:G,instructions:G},cycles", + .name =3D "{" HW_CYCLES_STR ",instructions}:G,{" HW_CYCLES_STR ":G,inst= ructions:G}," HW_CYCLES_STR, .check =3D test__group5, /* 2 */ }, @@ -2036,27 +2036,27 @@ static const struct evlist_test test__events[] =3D { /* 3 */ }, { - .name =3D "{cycles,cache-misses:G}:H", + .name =3D "{" HW_CYCLES_STR ",cache-misses:G}:H", .check =3D test__group_gh1, /* 4 */ }, { - .name =3D "{cycles,cache-misses:H}:G", + .name =3D "{" HW_CYCLES_STR ",cache-misses:H}:G", .check =3D test__group_gh2, /* 5 */ }, { - .name =3D "{cycles:G,cache-misses:H}:u", + .name =3D "{" HW_CYCLES_STR ":G,cache-misses:H}:u", .check =3D test__group_gh3, /* 6 */ }, { - .name =3D "{cycles:G,cache-misses:H}:uG", + .name =3D "{" HW_CYCLES_STR ":G,cache-misses:H}:uG", .check =3D test__group_gh4, /* 7 */ }, { - .name =3D "{cycles,cache-misses,branch-misses}:S", + .name =3D "{" HW_CYCLES_STR ",cache-misses,branch-misses}:S", .check =3D test__leader_sample1, /* 8 */ }, @@ -2071,7 +2071,7 @@ static const struct evlist_test test__events[] =3D { /* 0 */ }, { - .name =3D "{cycles,cache-misses,branch-misses}:D", + .name =3D "{" HW_CYCLES_STR ",cache-misses,branch-misses}:D", .check =3D test__pinned_group, /* 1 */ }, @@ -2109,7 +2109,7 @@ static const struct evlist_test test__events[] =3D { /* 6 */ }, { - .name =3D "task-clock:P,cycles", + .name =3D "task-clock:P," HW_CYCLES_STR, .check =3D test__checkevent_precise_max_modifier, /* 7 */ }, @@ -2140,17 +2140,17 @@ static const struct evlist_test test__events[] =3D { /* 2 */ }, { - .name =3D "cycles/name=3D'COMPLEX_CYCLES_NAME:orig=3Dcycles,desc=3Dchip= -clock-ticks'/Duk", + .name =3D HW_CYCLES_STR "/name=3D'COMPLEX_CYCLES_NAME:orig=3Dcycles,des= c=3Dchip-clock-ticks'/Duk", .check =3D test__checkevent_complex_name, /* 3 */ }, { - .name =3D "cycles//u", + .name =3D HW_CYCLES_STR "//u", .check =3D test__sym_event_slash, /* 4 */ }, { - .name =3D "cycles:k", + .name =3D HW_CYCLES_STR ":k", .check =3D test__sym_event_dc, /* 5 */ }, @@ -2160,17 +2160,17 @@ static const struct evlist_test test__events[] =3D { /* 6 */ }, { - .name =3D "{cycles,cache-misses,branch-misses}:e", + .name =3D "{" HW_CYCLES_STR ",cache-misses,branch-misses}:e", .check =3D test__exclusive_group, /* 7 */ }, { - .name =3D "cycles/name=3Dname/", + .name =3D HW_CYCLES_STR "/name=3Dname/", .check =3D test__term_equal_term, /* 8 */ }, { - .name =3D "cycles/name=3Dl1d/", + .name =3D HW_CYCLES_STR "/name=3Dl1d/", .check =3D test__term_equal_legacy, /* 9 */ }, @@ -2311,7 +2311,7 @@ static const struct evlist_test test__events_pmu[] = =3D { /* 9 */ }, { - .name =3D "cpu/cycles,period=3D100000,config2/", + .name =3D "cpu/" HW_CYCLES_STR ",period=3D100000,config2/", .valid =3D test__pmu_cpu_valid, .check =3D test__checkevent_symbolic_name_config, /* 0 */ @@ -2335,43 +2335,43 @@ static const struct evlist_test test__events_pmu[] = =3D { /* 3 */ }, { - .name =3D "{cpu/instructions/k,cpu/cycles/upp}", + .name =3D "{cpu/instructions/k,cpu/" HW_CYCLES_STR "/upp}", .valid =3D test__pmu_cpu_valid, .check =3D test__group1, /* 4 */ }, { - .name =3D "{cpu/cycles/u,cpu/instructions/kp}:p", + .name =3D "{cpu/" HW_CYCLES_STR "/u,cpu/instructions/kp}:p", .valid =3D test__pmu_cpu_valid, .check =3D test__group4, /* 5 */ }, { - .name =3D "{cpu/cycles/,cpu/cache-misses/G}:H", + .name =3D "{cpu/" HW_CYCLES_STR "/,cpu/cache-misses/G}:H", .valid =3D test__pmu_cpu_valid, .check =3D test__group_gh1, /* 6 */ }, { - .name =3D "{cpu/cycles/,cpu/cache-misses/H}:G", + .name =3D "{cpu/" HW_CYCLES_STR "/,cpu/cache-misses/H}:G", .valid =3D test__pmu_cpu_valid, .check =3D test__group_gh2, /* 7 */ }, { - .name =3D "{cpu/cycles/G,cpu/cache-misses/H}:u", + .name =3D "{cpu/" HW_CYCLES_STR "/G,cpu/cache-misses/H}:u", .valid =3D test__pmu_cpu_valid, .check =3D test__group_gh3, /* 8 */ }, { - .name =3D "{cpu/cycles/G,cpu/cache-misses/H}:uG", + .name =3D "{cpu/" HW_CYCLES_STR "/G,cpu/cache-misses/H}:uG", .valid =3D test__pmu_cpu_valid, .check =3D test__group_gh4, /* 9 */ }, { - .name =3D "{cpu/cycles/,cpu/cache-misses/,cpu/branch-misses/}:S", + .name =3D "{cpu/" HW_CYCLES_STR "/,cpu/cache-misses/,cpu/branch-misses/= }:S", .valid =3D test__pmu_cpu_valid, .check =3D test__leader_sample1, /* 0 */ @@ -2389,7 +2389,7 @@ static const struct evlist_test test__events_pmu[] = =3D { /* 2 */ }, { - .name =3D "{cpu/cycles/,cpu/cache-misses/,cpu/branch-misses/}:D", + .name =3D "{cpu/" HW_CYCLES_STR "/,cpu/cache-misses/,cpu/branch-misses/= }:D", .valid =3D test__pmu_cpu_valid, .check =3D test__pinned_group, /* 3 */ @@ -2407,13 +2407,13 @@ static const struct evlist_test test__events_pmu[] = =3D { /* 5 */ }, { - .name =3D "cpu/cycles/u", + .name =3D "cpu/" HW_CYCLES_STR "/u", .valid =3D test__pmu_cpu_valid, .check =3D test__sym_event_slash, /* 6 */ }, { - .name =3D "cpu/cycles/k", + .name =3D "cpu/" HW_CYCLES_STR "/k", .valid =3D test__pmu_cpu_valid, .check =3D test__sym_event_dc, /* 7 */ @@ -2425,19 +2425,19 @@ static const struct evlist_test test__events_pmu[] = =3D { /* 8 */ }, { - .name =3D "{cpu/cycles/,cpu/cache-misses/,cpu/branch-misses/}:e", + .name =3D "{cpu/" HW_CYCLES_STR "/,cpu/cache-misses/,cpu/branch-misses/= }:e", .valid =3D test__pmu_cpu_valid, .check =3D test__exclusive_group, /* 9 */ }, { - .name =3D "cpu/cycles,name=3Dname/", + .name =3D "cpu/" HW_CYCLES_STR ",name=3Dname/", .valid =3D test__pmu_cpu_valid, .check =3D test__term_equal_term, /* 0 */ }, { - .name =3D "cpu/cycles,name=3Dl1d/", + .name =3D "cpu/" HW_CYCLES_STR ",name=3Dl1d/", .valid =3D test__pmu_cpu_valid, .check =3D test__term_equal_legacy, /* 1 */ diff --git a/tools/perf/tests/perf-time-to-tsc.c b/tools/perf/tests/perf-ti= me-to-tsc.c index d4437410c99f..7ebcb1f004b2 100644 --- a/tools/perf/tests/perf-time-to-tsc.c +++ b/tools/perf/tests/perf-time-to-tsc.c @@ -101,7 +101,7 @@ static int test__perf_time_to_tsc(struct test_suite *te= st __maybe_unused, int su =20 perf_evlist__set_maps(&evlist->core, cpus, threads); =20 - CHECK__(parse_event(evlist, "cycles:u")); + CHECK__(parse_event(evlist, HW_CYCLES_STR ":u")); =20 evlist__config(evlist, &opts, NULL); =20 diff --git a/tools/perf/tests/switch-tracking.c b/tools/perf/tests/switch-t= racking.c index 5be294014d3b..ad3a87978c0d 100644 --- a/tools/perf/tests/switch-tracking.c +++ b/tools/perf/tests/switch-tracking.c @@ -332,7 +332,7 @@ static int process_events(struct evlist *evlist, static int test__switch_tracking(struct test_suite *test __maybe_unused, i= nt subtest __maybe_unused) { const char *sched_switch =3D "sched:sched_switch"; - const char *cycles =3D "cycles:u"; + const char *cycles =3D HW_CYCLES_STR ":u"; struct switch_tracking switch_tracking =3D { .tids =3D NULL, }; struct record_opts opts =3D { .mmap_pages =3D UINT_MAX, diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index e8217efdda53..d7e935faeda0 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c @@ -112,7 +112,7 @@ struct evlist *evlist__new_default(void) char buf[256]; int err; =20 - snprintf(buf, sizeof(buf), "%s/cycles/%s", pmu->name, + snprintf(buf, sizeof(buf), "%s/%s/%s", pmu->name, HW_CYCLES_STR, can_profile_kernel ? "P" : "Pu"); err =3D parse_event(evlist, buf); if (err) { diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index db92cd67bc0f..304676bf32dd 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h @@ -20,6 +20,16 @@ struct option; struct perf_pmu; struct strbuf; =20 +/* + * The name used for the "cycles" event. A different event name is used on= ARM + * as many ARM PMUs define a "cycles" event. + */ +#if defined(__aarch64__) || defined(__arm__) +#define HW_CYCLES_STR "cpu-cycles" +#else +#define HW_CYCLES_STR "cycles" +#endif + const char *event_type(size_t type); =20 /* Arguments encoded in opt->value. */ diff --git a/tools/perf/util/perf_api_probe.c b/tools/perf/util/perf_api_pr= obe.c index 6ecf38314f01..693bb5891bc4 100644 --- a/tools/perf/util/perf_api_probe.c +++ b/tools/perf/util/perf_api_probe.c @@ -74,9 +74,9 @@ static bool perf_probe_api(setup_probe_fn_t fn) if (!ret) return true; =20 - pmu =3D perf_pmus__scan_core(/*pmu=3D*/NULL); + pmu =3D perf_pmus__find_core_pmu(); if (pmu) { - const char *try[] =3D {"cycles", "instructions", NULL}; + const char *try[] =3D {HW_CYCLES_STR, "instructions", NULL}; char buf[256]; int i =3D 0; =20 --=20 2.51.0.384.g4c02a37b29-goog