From nobody Fri Dec 19 17:18:16 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 C9826502BE for ; Thu, 6 Nov 2025 23:15:41 +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=1762470943; cv=none; b=kwe482yh34Nml+3SXmQcKt3Mo3zjjYgjMU2owzTdnmvU2ySCZ/1i2jEIcgtRdvqv/dQqL4qR7SAxHqROyw70dkl5JZy2zH7uxW/1xmDzmoF5cPk2uZgjJRXc1jvNhiog5kq5uFHLH9bO0P43yuEJ6Qbbke1ZOEa/eYVCvA7957A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470943; c=relaxed/simple; bh=5gugg7lkraj9TC0kZ6NwAUfMZ08oCZLBOSh79lmJK3Q=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=O8xGGChBcBt+YBrEnnhI8a+cBfV58c3k8zXdKM2rVGl8CuRT6p+8IsoY4fouelU9yuRo81DYrdwNyRl6Pyis+vYmQyuMvOG+YR29rbIoVmOhFl+axXiTJQUtNdXCrm5hhCT1ah+fICNnty+En5Iy+DGGILXf2O9NFy6nV0PH1LI= 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=hsm6YsYe; 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="hsm6YsYe" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-28eb14e3cafso3403585ad.1 for ; Thu, 06 Nov 2025 15:15:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1762470941; x=1763075741; 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=C/I124Vpc3AJUGEYy3T6Y6dhWjIbeIJN7sVjw18uSEg=; b=hsm6YsYebrsApLqQZ1R4ogEje5V6KZoeGcPqApraWZGhKIeidSjAp5HkkSLhKg0u3r 3l8NOT/lxGkuDRFQVk6er49ST3vUhB46RIV8t0mNdxGkY7xhl5wi8QX46i4QRe11lZ04 85qbg0vNOr568eQs1pLFfV3jWFyVCkfVbQgpaM8WvXjoygUEo8Mj/MyoQp1EAsd+SnqL XuqAEHcX9pT/QYYicUuRZLMbDQPzlZTy6NIhD1afaddU0Q8+6UikC/Cj17cOuCTVblst oUavUH84LiU8ApBKDxVZuGs9Ap/y4IXYyYgYI1sossCbuWcF9lbAE185ksZc+b9MNVXY Exww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762470941; x=1763075741; 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=C/I124Vpc3AJUGEYy3T6Y6dhWjIbeIJN7sVjw18uSEg=; b=CDioIx2ELnHHyLbP7X8dT4BkO3sApK8uQyBrc1QMDlyqB6+vRYGGkGpzigjGiyuVzq Sr+BASZGbazSaIqo9sK6um7r5qAtSfOVVzs3DZVdT03cLMNc4gHbAZ7Vku166ia8vvmq AF/HbqzOWS9RQOjkyBituvUZRUSfa2HNlWKj0hRofrsaiaURk+MOPNjhi81ImhSHTZwG H9v+6k/Ke2ZTujCMZGTYpa9PYywrCXw26Mrp4eg5URbwfcmhTaPgfIDSY7+pGzBI/tke yfCfn8dMj0qhH55n/5GPjT3Ct5oQLqVTa8B13XODfXWxwoOwottJpzxdguG3kNBBpey/ 65og== X-Forwarded-Encrypted: i=1; AJvYcCWSisSCPBI5TJpWSIHRgSL08gb0yzs7BFsKv1gOIxprO3R2i2Y5Taf8X0wOQxl1h0pdKuJBIrOhDh40pDI=@vger.kernel.org X-Gm-Message-State: AOJu0YzotRSejOTpUq94qwvnuHX4He7jb1XZxkQPyHIGU5qDEKeEbqOt mKh61airMB2JIIV8/GLoXuU42JKMUjxjf8s2J/6N7OYagtGW5NpzioydQ3ReEfWPhvwTdKCHP7d gsbE8YLsXVg== X-Google-Smtp-Source: AGHT+IFWAGOJ48KGr/bZubRs919U1l6beAvhpsgIKti1gVWuKjyiqbb/+A17mL8pObYJypszWXfoh9f+QrQI X-Received: from dlag14.prod.google.com ([2002:a05:701b:250e:b0:119:9f33:34a2]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:3888:b0:295:24c3:8b49 with SMTP id d9443c01a7336-297c046ad3fmr15373445ad.46.1762470941194; Thu, 06 Nov 2025 15:15:41 -0800 (PST) Date: Thu, 6 Nov 2025 15:14:51 -0800 In-Reply-To: <20251106231508.448793-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: <20251106231508.448793-1-irogers@google.com> X-Mailer: git-send-email 2.51.2.1041.gc1ab5b90ca-goog Message-ID: <20251106231508.448793-2-irogers@google.com> Subject: [PATCH v2 01/18] perf metricgroup: Add care to picking the evsel for displaying a metric From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Xu Yang , Chun-Tse Shao , Thomas Richter , Sumanth Korikkar , Collin Funk , Thomas Falcon , Howard Chu , Dapeng Mi , Levi Yun , Yang Li , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Andi Kleen , Weilin Wang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Rather than using the first evsel in the matched events, try to find the least shared non-tool evsel. The aim is to pick the first evsel that typifies the metric within the list of metrics. This addresses an issue where Default metric group metrics may lose their counter value due to how the stat displaying hides counters for default event/metric output. For a metricgroup like TopdownL1 on an Intel Alderlake the change is, before there are 4 events with metrics: ``` $ perf stat -M topdownL1 -a sleep 1 Performance counter stats for 'system wide': 7,782,334,296 cpu_core/TOPDOWN.SLOTS/ # 10.4 % tma_= bad_speculation # 19.7 % tma_fronten= d_bound 2,668,927,977 cpu_core/topdown-retiring/ # 35.7 % tma_= backend_bound # 34.1 % tma_retiring 803,623,987 cpu_core/topdown-bad-spec/ 167,514,386 cpu_core/topdown-heavy-ops/ 1,555,265,776 cpu_core/topdown-fe-bound/ 2,792,733,013 cpu_core/topdown-be-bound/ 279,769,310 cpu_atom/TOPDOWN_RETIRING.ALL/ # 12.2 % tma_= retiring # 15.1 % tma_bad_spe= culation 457,917,232 cpu_atom/CPU_CLK_UNHALTED.CORE/ # 38.4 % tma_= backend_bound # 34.2 % tma_fronten= d_bound 783,519,226 cpu_atom/TOPDOWN_FE_BOUND.ALL/ 10,790,192 cpu_core/INT_MISC.UOP_DROPPING/ 879,845,633 cpu_atom/TOPDOWN_BE_BOUND.ALL/ ``` After there are 6 events with metrics: ``` $ perf stat -M topdownL1 -a sleep 1 Performance counter stats for 'system wide': 2,377,551,258 cpu_core/TOPDOWN.SLOTS/ # 7.9 % tma_= bad_speculation # 36.4 % tma_fronten= d_bound 480,791,142 cpu_core/topdown-retiring/ # 35.5 % tma_= backend_bound 186,323,991 cpu_core/topdown-bad-spec/ 65,070,590 cpu_core/topdown-heavy-ops/ # 20.1 % tma_= retiring 871,733,444 cpu_core/topdown-fe-bound/ 848,286,598 cpu_core/topdown-be-bound/ 260,936,456 cpu_atom/TOPDOWN_RETIRING.ALL/ # 12.4 % tma_= retiring # 17.6 % tma_bad_spe= culation 419,576,513 cpu_atom/CPU_CLK_UNHALTED.CORE/ 797,132,597 cpu_atom/TOPDOWN_FE_BOUND.ALL/ # 38.0 % tma_= frontend_bound 3,055,447 cpu_core/INT_MISC.UOP_DROPPING/ 671,014,164 cpu_atom/TOPDOWN_BE_BOUND.ALL/ # 32.0 % tma_= backend_bound ``` Signed-off-by: Ian Rogers --- tools/perf/util/metricgroup.c | 48 ++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c index 48936e517803..76092ee26761 100644 --- a/tools/perf/util/metricgroup.c +++ b/tools/perf/util/metricgroup.c @@ -1323,6 +1323,51 @@ static int parse_ids(bool metric_no_merge, bool fake= _pmu, return ret; } =20 +/* How many times will a given evsel be used in a set of metrics? */ +static int count_uses(struct list_head *metric_list, struct evsel *evsel) +{ + const char *metric_id =3D evsel__metric_id(evsel); + struct metric *m; + int uses =3D 0; + + list_for_each_entry(m, metric_list, nd) { + if (hashmap__find(m->pctx->ids, metric_id, NULL)) + uses++; + } + return uses; +} + +/* + * Select the evsel that stat-display will use to trigger shadow/metric + * printing. Pick the least shared non-tool evsel, encouraging metrics to = be + * with a hardware counter that is specific to them. + */ +static struct evsel *pick_display_evsel(struct list_head *metric_list, + struct evsel **metric_events) +{ + struct evsel *selected =3D metric_events[0]; + size_t selected_uses; + bool selected_is_tool; + + if (!selected) + return NULL; + + selected_uses =3D count_uses(metric_list, selected); + selected_is_tool =3D evsel__is_tool(selected); + for (int i =3D 1; metric_events[i]; i++) { + struct evsel *candidate =3D metric_events[i]; + size_t candidate_uses =3D count_uses(metric_list, candidate); + + if ((selected_is_tool && !evsel__is_tool(candidate)) || + (candidate_uses < selected_uses)) { + selected =3D candidate; + selected_uses =3D candidate_uses; + selected_is_tool =3D evsel__is_tool(selected); + } + } + return selected; +} + static int parse_groups(struct evlist *perf_evlist, const char *pmu, const char *str, bool metric_no_group, @@ -1430,7 +1475,8 @@ static int parse_groups(struct evlist *perf_evlist, goto out; } =20 - me =3D metricgroup__lookup(&perf_evlist->metric_events, metric_events[0], + me =3D metricgroup__lookup(&perf_evlist->metric_events, + pick_display_evsel(&metric_list, metric_events), /*create=3D*/true); =20 expr =3D malloc(sizeof(struct metric_expr)); --=20 2.51.2.1041.gc1ab5b90ca-goog From nobody Fri Dec 19 17:18:16 2025 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (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 CB1FE341AD8 for ; Thu, 6 Nov 2025 23:15:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470945; cv=none; b=P4T7TiJDdJYZZUUKl/aysnBmPm1xPenIgIceq9Tn1eJwe00znf7szkkP+8TuIofOdl6u7I8fhRjqzJuVBatFia/xM/Uwt5FW2XIuPLESQAXnPG4Z8N9K9A8w8ycMGHm9i2GP5IGSUQHDX6b0YkboYhm84L1YXW9hggcRuiXqLpQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470945; c=relaxed/simple; bh=goAJRIvcXmArqjtsnCnAKiuCo6RWRhzBbuO89gkopnI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=COQPR3s3H6i4MMEI3f3RrUkH4ruav4c+lCiCBZHQnE7GaUkdtlImWP6zuNlX02LegiODC95giR/M7FyugHsv/rPQFRektmOcBkHS54fESv5WKKSA4RNFiM0rnqNww9CwFbFCd4mghebiToHcoENcLQ1Je+LNj7MEG3sgEiR3Igw= 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=BekpuqQn; arc=none smtp.client-ip=209.85.214.202 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="BekpuqQn" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-295915934bfso2305745ad.0 for ; Thu, 06 Nov 2025 15:15:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1762470943; x=1763075743; 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=+kfrvj9SxzyHWG3QRMI04WWVn93aXW9NO85HAoMrUfM=; b=BekpuqQnqK4aaGV7k0MAlGonnpLEFf4PJzyV8opYVhRoVbT0A0UG8vmQf/c66j1uSc fGLo1Kcf5SlFIsk99qNidk60eLdmXQHmxMx9C3d+HkSR961rxCXTxrX/EQSp8z0OzlJN z7iXe/dGJy7Nsch5WNPNI5xSGGuxujaUEr7ONtr5bZB2PsZFhR3UzPV6MNLs7sXxfxUk b7LVeAJ15azM1G/PI8tgxS+RO2B/WulGQdvE0+2R52aYS3U2N3Ed83Mas9p26iykfeZK SuJo1cyYW7DkWGzKG0xqHgW19TNPP8OLp7WWpfdMN2I9nJ8VUrHgmtFj9KrSvmFRNHM+ PpTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762470943; x=1763075743; 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=+kfrvj9SxzyHWG3QRMI04WWVn93aXW9NO85HAoMrUfM=; b=X36R3MlSEc5OKwUBjQDNrE9f/TYJVM+1KYHHuookrdzlIBZpEtVJWq3f5UNhAYscls jSguwont9vklD+jgJm7d2+qdcp8mqtTG7H4DI1KhcoeKFBOKFN4ZH6PlgtLGPJAXbyuq N53zVCWkPs9uXJu/MzSRM3tDkELOBekSdHGw4Ei5e7gnaVsNWrsVCHHbYtrh37JsoWDl MaZplip5CtfVI1QPXBUoAZx2JmNzn0sYRgugQN7ZnbqCa7ulQ3kdZJ5s/TB4hzWQ8N/5 PiBAtgNoQeBNC6/xlcXuZ4EdgsXlMC5Ce8UiJDmCXMg1h3K8Jxx8OusW8Oz/TQ40DM5Y reOw== X-Forwarded-Encrypted: i=1; AJvYcCVwz/lwKo3JJsHSBj7vFVqUZblBcG2m/8emIXxL33bC20BIJRJw0loPvZw8eb9bY6sPcdgD3KVpEy3I60I=@vger.kernel.org X-Gm-Message-State: AOJu0YxkAa+GQKUfeZF1FoaxGCyU9W+gxsZaQ6QIbloKRMeioXm9HXFa CfJALaWrPtdCv9oab67skSrQFvlaUpVtv6URbYzQiwDWLOxiXPDvxH4TlbJXDZ1vVq5Vjcg6bx/ zDF/BqMEwEA== X-Google-Smtp-Source: AGHT+IFma2NJzvhRXHMld0BT31zupRS7KxCsW4oTcuOFZWocvzaqYwh5cLgtfxBZt5czA5+dCdaoj9K7WdG3 X-Received: from dlf6.prod.google.com ([2002:a05:7022:406:b0:119:b185:ea6d]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:f791:b0:295:571b:64cd with SMTP id d9443c01a7336-297c047bd71mr15118375ad.52.1762470943106; Thu, 06 Nov 2025 15:15:43 -0800 (PST) Date: Thu, 6 Nov 2025 15:14:52 -0800 In-Reply-To: <20251106231508.448793-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: <20251106231508.448793-1-irogers@google.com> X-Mailer: git-send-email 2.51.2.1041.gc1ab5b90ca-goog Message-ID: <20251106231508.448793-3-irogers@google.com> Subject: [PATCH v2 02/18] perf expr: Add #target_cpu literal From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Xu Yang , Chun-Tse Shao , Thomas Richter , Sumanth Korikkar , Collin Funk , Thomas Falcon , Howard Chu , Dapeng Mi , Levi Yun , Yang Li , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Andi Kleen , Weilin Wang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" For CPU nanoseconds a lot of the stat-shadow metrics use either task-clock or cpu-clock, the latter being used when target__has_cpu. Add a #target_cpu literal so that json metrics can perform the same test. Signed-off-by: Ian Rogers --- tools/perf/util/expr.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/perf/util/expr.c b/tools/perf/util/expr.c index 7fda0ff89c16..4df56f2b283d 100644 --- a/tools/perf/util/expr.c +++ b/tools/perf/util/expr.c @@ -409,6 +409,9 @@ double expr__get_literal(const char *literal, const str= uct expr_scanner_ctx *ctx } else if (!strcmp("#core_wide", literal)) { result =3D core_wide(ctx->system_wide, ctx->user_requested_cpu_list) ? 1.0 : 0.0; + } else if (!strcmp("#target_cpu", literal)) { + result =3D (ctx->system_wide || ctx->user_requested_cpu_list) + ? 1.0 : 0.0; } else { pr_err("Unrecognized literal '%s'", literal); } --=20 2.51.2.1041.gc1ab5b90ca-goog From nobody Fri Dec 19 17:18:16 2025 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (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 9EA153563D0 for ; Thu, 6 Nov 2025 23:15:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470948; cv=none; b=dRUr+/s6GuWwhnPmyVXegoahYCDCnQEbffcLV1NflN86hOSbm2zn4q2wxpy1yChLhWop6pE03iQJUl30vGXKxj/XHmRgaBEIUYHKqk4JSHNBTxr8sLQscmAdGqNY+vGt+GIc/873T8LJlkr2VSyUn/GQt/qQttwIr2Kdt2GKztM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470948; c=relaxed/simple; bh=kEgo8S9Ge81UJ9aJ1PbrCptBL0vzS+bLzklN+9Czuyg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=dItd+lBoSAQ6QqZtrX2bpezicZh0rMj+ZXUhvwlV7/8d+ELSJRqK42SNGaKAgpEsA4z748J75Gpx+rk5Hm32eTTBgLKVGalgbabYjckgTlidjvf+odyZCcUcCS36w1xdZdH+nNxV5iX8YTCPNOI1ecqXCZmWKal9I1k9cjq6KY0= 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=H9Xflnfv; arc=none smtp.client-ip=209.85.216.74 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="H9Xflnfv" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-3405e02ff45so319347a91.3 for ; Thu, 06 Nov 2025 15:15:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1762470945; x=1763075745; darn=vger.kernel.org; h=content-transfer-encoding:to:from:subject:message-id:references :mime-version:in-reply-to:date:from:to:cc:subject:date:message-id :reply-to; bh=q3rGOkAl3MPlqpsf8QRH0dYFKaDA5ODLJBs6nMJbY2w=; b=H9XflnfvHFc5rOAvlzfk1Q2wE3Cr/i0EClpHNuCdqxki0MJ/lDq7jMXLS1lOJnxFjI HHAIYPgoh9Xj6NnusPycXksnLbty9C2vBgcwrqzct0E7QDZsqvrKMCUuYmwGiMbB0nt7 UvPL4Lwc11XHwzLWgog551Zsk8/tiHkqJGWkaPjCABljmk0wiQ/SFd90roQCXjHxcPYy Az2eYyJJxuzIMhjAnnvwVonIUC82z7hTRriPrNSZVjwVaxGWA5OS+iTHEQk/8huzR34O XoXSqByNuOt1KwrTaNiwwXzvyshEmItLk4faW7cBqqCZBd3EzAivLS4l+xKvBMRvPdHI l4Eg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762470945; x=1763075745; h=content-transfer-encoding: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=q3rGOkAl3MPlqpsf8QRH0dYFKaDA5ODLJBs6nMJbY2w=; b=H7DVv+gABfkagHqz+2DQiMJCUKKmyyGhA2+QkyTda6cyxPPs5nwNykWK7eEJ1TNGVh sjEaoFNb2i0KE+gYjm9XgD+5mFe6dvSRYTTE/4McQ12q4aNztQIiEOr5WXGiVw+AdmqZ 9muCyBNtjPZzUD//WnTfsrN8zHmduc/t2yzHks9JqzLjSrAfy4zy7562Zl8Uyiokw2K3 BRK+Mun5zZ6jh/vItE1UCboVKzjQwqGbm4rHHHv0wfwo86EPoZI9YbxU0IgT4zZyTiu8 ycIll0yf90/tEiX4Jfr+woU6vDPsXN+UY6llPTv2nUfnIZi51xNhbb5tDX27NhDHFSNl ExiQ== X-Forwarded-Encrypted: i=1; AJvYcCXyMEW9Ag2YpH+UoDM1tfGoPnutXvUukHCybTGxhMLayx/nPT9s37coFUPg1fVgg1SEojUmsyJiomBq0C4=@vger.kernel.org X-Gm-Message-State: AOJu0YzoeUuiPS3KUBvt+X+iIiWIVgzh/M2kKbvegWML9XH1Lxz8QbbH JVydpJI3nrl/NTH9FyGI0TJteIQeStqsrVXdWtqDupfJvBpv0ACp0w/uwh0c9m3MFVQFZwmeLUN QmOSpt1a6cQ== X-Google-Smtp-Source: AGHT+IHv9kUhNACHYCnkLQUtOLrtWHXfWlnfUK2xaata8w75Fdrxz44CHpHcZ5mebrbA05TxZA7MHjz8115a X-Received: from dlbsn13.prod.google.com ([2002:a05:7022:b90d:b0:119:78ff:fe17]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:e788:b0:295:592e:7633 with SMTP id d9443c01a7336-297c045f01amr15140615ad.29.1762470944793; Thu, 06 Nov 2025 15:15:44 -0800 (PST) Date: Thu, 6 Nov 2025 15:14:53 -0800 In-Reply-To: <20251106231508.448793-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: <20251106231508.448793-1-irogers@google.com> X-Mailer: git-send-email 2.51.2.1041.gc1ab5b90ca-goog Message-ID: <20251106231508.448793-4-irogers@google.com> Subject: [PATCH v2 03/18] perf jevents: Add set of common metrics based on default ones From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Xu Yang , Chun-Tse Shao , Thomas Richter , Sumanth Korikkar , Collin Funk , Thomas Falcon , Howard Chu , Dapeng Mi , Levi Yun , Yang Li , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Andi Kleen , Weilin Wang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add support to getting a common set of metrics from a default table. It simplifies the generation to add json metrics at the same time. The metrics added are CPUs_utilized, cs_per_second, migrations_per_second, page_faults_per_second, insn_per_cycle, stalled_cycles_per_instruction, frontend_cycles_idle, backend_cycles_idle, cycles_frequency, branch_frequency and branch_miss_rate based on the shadow metric definitions. Following this change the default perf stat output on an alderlake looks li= ke: ``` $ perf stat -a -- sleep 1 Performance counter stats for 'system wide': 28,165,735,434 cpu-clock # 27.973 CPUs ut= ilized 23,220 context-switches # 824.406 /sec 833 cpu-migrations # 29.575 /sec 35,293 page-faults # 1.253 K/sec 997,341,554 cpu_atom/instructions/ # 0.84 insn pe= r cycle (35.63%) 11,197,053,736 cpu_core/instructions/ # 1.97 insn pe= r cycle (58.21%) 1,184,871,493 cpu_atom/cycles/ # 0.042 GHz = (35.64%) 5,676,692,769 cpu_core/cycles/ # 0.202 GHz = (58.22%) 150,525,309 cpu_atom/branches/ # 5.344 M/sec = (42.80%) 2,277,232,030 cpu_core/branches/ # 80.851 M/sec = (58.21%) 5,248,575 cpu_atom/branch-misses/ # 3.49% of all = branches (42.82%) 28,829,930 cpu_core/branch-misses/ # 1.27% of all = branches (58.22%) (software) # 824.4 cs/sec cs_per= _second TopdownL1 (cpu_core) # 12.6 % tma_bad_spe= culation # 28.8 % tma_fronten= d_bound (66.57%) TopdownL1 (cpu_core) # 25.8 % tma_backend= _bound # 32.8 % tma_retirin= g (66.57%) (software) # 1253.1 faults/sec pa= ge_faults_per_second # 0.0 GHz cycles_fr= equency (42.80%) # 0.2 GHz cycles_fr= equency (74.92%) TopdownL1 (cpu_atom) # 22.3 % tma_bad_spe= culation # 17.2 % tma_retirin= g (49.95%) TopdownL1 (cpu_atom) # 30.6 % tma_backend= _bound # 29.8 % tma_fronten= d_bound (49.94%) (cpu_atom) # 6.9 K/sec branch_= frequency (42.89%) # 80.5 K/sec branch_= frequency (74.93%) # 29.6 migrations/sec= migrations_per_second # 28.0 CPUs CPUs_uti= lized (cpu_atom) # 0.8 instructions = insn_per_cycle (42.91%) # 2.0 instructions = insn_per_cycle (75.14%) (cpu_atom) # 3.8 % branch_miss= _rate (35.75%) # 1.2 % branch_miss= _rate (66.86%) 1.007063529 seconds time elapsed ``` Signed-off-by: Ian Rogers --- .../arch/common/common/metrics.json | 86 +++++++++++++ tools/perf/pmu-events/empty-pmu-events.c | 115 +++++++++++++----- tools/perf/pmu-events/jevents.py | 21 +++- tools/perf/pmu-events/pmu-events.h | 1 + tools/perf/util/metricgroup.c | 31 +++-- 5 files changed, 212 insertions(+), 42 deletions(-) create mode 100644 tools/perf/pmu-events/arch/common/common/metrics.json diff --git a/tools/perf/pmu-events/arch/common/common/metrics.json b/tools/= perf/pmu-events/arch/common/common/metrics.json new file mode 100644 index 000000000000..d1e37db18dc6 --- /dev/null +++ b/tools/perf/pmu-events/arch/common/common/metrics.json @@ -0,0 +1,86 @@ +[ + { + "BriefDescription": "Average CPU utilization", + "MetricExpr": "(software@cpu\\-clock\\,name\\=3Dcpu\\-clock@ if #t= arget_cpu else software@task\\-clock\\,name\\=3Dtask\\-clock@) / (duration_= time * 1e9)", + "MetricGroup": "Default", + "MetricName": "CPUs_utilized", + "ScaleUnit": "1CPUs", + "MetricConstraint": "NO_GROUP_EVENTS" + }, + { + "BriefDescription": "Context switches per CPU second", + "MetricExpr": "(software@context\\-switches\\,name\\=3Dcontext\\-s= witches@ * 1e9) / (software@cpu\\-clock\\,name\\=3Dcpu\\-clock@ if #target_= cpu else software@task\\-clock\\,name\\=3Dtask\\-clock@)", + "MetricGroup": "Default", + "MetricName": "cs_per_second", + "ScaleUnit": "1cs/sec", + "MetricConstraint": "NO_GROUP_EVENTS" + }, + { + "BriefDescription": "Process migrations to a new CPU per CPU secon= d", + "MetricExpr": "(software@cpu\\-migrations\\,name\\=3Dcpu\\-migrati= ons@ * 1e9) / (software@cpu\\-clock\\,name\\=3Dcpu\\-clock@ if #target_cpu = else software@task\\-clock\\,name\\=3Dtask\\-clock@)", + "MetricGroup": "Default", + "MetricName": "migrations_per_second", + "ScaleUnit": "1migrations/sec", + "MetricConstraint": "NO_GROUP_EVENTS" + }, + { + "BriefDescription": "Page faults per CPU second", + "MetricExpr": "(software@page\\-faults\\,name\\=3Dpage\\-faults@ *= 1e9) / (software@cpu\\-clock\\,name\\=3Dcpu\\-clock@ if #target_cpu else s= oftware@task\\-clock\\,name\\=3Dtask\\-clock@)", + "MetricGroup": "Default", + "MetricName": "page_faults_per_second", + "ScaleUnit": "1faults/sec", + "MetricConstraint": "NO_GROUP_EVENTS" + }, + { + "BriefDescription": "Instructions Per Cycle", + "MetricExpr": "instructions / cpu\\-cycles", + "MetricGroup": "Default", + "MetricName": "insn_per_cycle", + "MetricThreshold": "insn_per_cycle < 1", + "ScaleUnit": "1instructions" + }, + { + "BriefDescription": "Max front or backend stalls per instruction", + "MetricExpr": "max(stalled\\-cycles\\-frontend, stalled\\-cycles\\= -backend) / instructions", + "MetricGroup": "Default", + "MetricName": "stalled_cycles_per_instruction" + }, + { + "BriefDescription": "Frontend stalls per cycle", + "MetricExpr": "stalled\\-cycles\\-frontend / cpu\\-cycles", + "MetricGroup": "Default", + "MetricName": "frontend_cycles_idle", + "MetricThreshold": "frontend_cycles_idle > 0.1" + }, + { + "BriefDescription": "Backend stalls per cycle", + "MetricExpr": "stalled\\-cycles\\-backend / cpu\\-cycles", + "MetricGroup": "Default", + "MetricName": "backend_cycles_idle", + "MetricThreshold": "backend_cycles_idle > 0.2" + }, + { + "BriefDescription": "Cycles per CPU second", + "MetricExpr": "cpu\\-cycles / (software@cpu\\-clock\\,name\\=3Dcpu= \\-clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\-clock= @)", + "MetricGroup": "Default", + "MetricName": "cycles_frequency", + "ScaleUnit": "1GHz", + "MetricConstraint": "NO_GROUP_EVENTS" + }, + { + "BriefDescription": "Branches per CPU second", + "MetricExpr": "branches / (software@cpu\\-clock\\,name\\=3Dcpu\\-c= lock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\-clock@)", + "MetricGroup": "Default", + "MetricName": "branch_frequency", + "ScaleUnit": "1000K/sec", + "MetricConstraint": "NO_GROUP_EVENTS" + }, + { + "BriefDescription": "Branch miss rate", + "MetricExpr": "branch\\-misses / branches", + "MetricGroup": "Default", + "MetricName": "branch_miss_rate", + "MetricThreshold": "branch_miss_rate > 0.05", + "ScaleUnit": "100%" + } +] diff --git a/tools/perf/pmu-events/empty-pmu-events.c b/tools/perf/pmu-even= ts/empty-pmu-events.c index 5120fb93690e..83a01ecc625e 100644 --- a/tools/perf/pmu-events/empty-pmu-events.c +++ b/tools/perf/pmu-events/empty-pmu-events.c @@ -1303,21 +1303,32 @@ static const char *const big_c_string =3D /* offset=3D127503 */ "sys_ccn_pmu.read_cycles\000uncore\000ccn read-cycle= s event\000config=3D0x2c\0000x01\00000\000\000\000\000\000" /* offset=3D127580 */ "uncore_sys_cmn_pmu\000" /* offset=3D127599 */ "sys_cmn_pmu.hnf_cache_miss\000uncore\000Counts tota= l cache misses in first lookup result (high priority)\000eventid=3D1,type= =3D5\000(434|436|43c|43a).*\00000\000\000\000\000\000" -/* offset=3D127742 */ "CPI\000\0001 / IPC\000\000\000\000\000\000\000\0000= 0" -/* offset=3D127764 */ "IPC\000group1\000inst_retired.any / cpu_clk_unhalte= d.thread\000\000\000\000\000\000\000\00000" -/* offset=3D127827 */ "Frontend_Bound_SMT\000\000idq_uops_not_delivered.co= re / (4 * (cpu_clk_unhalted.thread / 2 * (1 + cpu_clk_unhalted.one_thread_a= ctive / cpu_clk_unhalted.ref_xclk)))\000\000\000\000\000\000\000\00000" -/* offset=3D127993 */ "dcache_miss_cpi\000\000l1d\\-loads\\-misses / inst_= retired.any\000\000\000\000\000\000\000\00000" -/* offset=3D128057 */ "icache_miss_cycles\000\000l1i\\-loads\\-misses / in= st_retired.any\000\000\000\000\000\000\000\00000" -/* offset=3D128124 */ "cache_miss_cycles\000group1\000dcache_miss_cpi + ic= ache_miss_cycles\000\000\000\000\000\000\000\00000" -/* offset=3D128195 */ "DCache_L2_All_Hits\000\000l2_rqsts.demand_data_rd_h= it + l2_rqsts.pf_hit + l2_rqsts.rfo_hit\000\000\000\000\000\000\000\00000" -/* offset=3D128289 */ "DCache_L2_All_Miss\000\000max(l2_rqsts.all_demand_d= ata_rd - l2_rqsts.demand_data_rd_hit, 0) + l2_rqsts.pf_miss + l2_rqsts.rfo_= miss\000\000\000\000\000\000\000\00000" -/* offset=3D128423 */ "DCache_L2_All\000\000DCache_L2_All_Hits + DCache_L2= _All_Miss\000\000\000\000\000\000\000\00000" -/* offset=3D128487 */ "DCache_L2_Hits\000\000d_ratio(DCache_L2_All_Hits, D= Cache_L2_All)\000\000\000\000\000\000\000\00000" -/* offset=3D128555 */ "DCache_L2_Misses\000\000d_ratio(DCache_L2_All_Miss,= DCache_L2_All)\000\000\000\000\000\000\000\00000" -/* offset=3D128625 */ "M1\000\000ipc + M2\000\000\000\000\000\000\000\0000= 0" -/* offset=3D128647 */ "M2\000\000ipc + M1\000\000\000\000\000\000\000\0000= 0" -/* offset=3D128669 */ "M3\000\0001 / M3\000\000\000\000\000\000\000\00000" -/* offset=3D128689 */ "L1D_Cache_Fill_BW\000\00064 * l1d.replacement / 1e9= / duration_time\000\000\000\000\000\000\000\00000" +/* offset=3D127742 */ "CPUs_utilized\000Default\000(software@cpu\\-clock\\= ,name\\=3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,name\\= =3Dtask\\-clock@) / (duration_time * 1e9)\000\000Average CPU utilization\00= 0\0001CPUs\000\000\000\00001" +/* offset=3D127927 */ "cs_per_second\000Default\000software@context\\-swit= ches\\,name\\=3Dcontext\\-switches@ * 1e9 / (software@cpu\\-clock\\,name\\= =3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\= -clock@)\000\000Context switches per CPU second\000\0001cs/sec\000\000\000\= 00001" +/* offset=3D128159 */ "migrations_per_second\000Default\000software@cpu\\-= migrations\\,name\\=3Dcpu\\-migrations@ * 1e9 / (software@cpu\\-clock\\,nam= e\\=3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtas= k\\-clock@)\000\000Process migrations to a new CPU per CPU second\000\0001m= igrations/sec\000\000\000\00001" +/* offset=3D128418 */ "page_faults_per_second\000Default\000software@page\= \-faults\\,name\\=3Dpage\\-faults@ * 1e9 / (software@cpu\\-clock\\,name\\= =3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\= -clock@)\000\000Page faults per CPU second\000\0001faults/sec\000\000\000\0= 0001" +/* offset=3D128648 */ "insn_per_cycle\000Default\000instructions / cpu\\-c= ycles\000insn_per_cycle < 1\000Instructions Per Cycle\000\0001instructions\= 000\000\000\00000" +/* offset=3D128760 */ "stalled_cycles_per_instruction\000Default\000max(st= alled\\-cycles\\-frontend, stalled\\-cycles\\-backend) / instructions\000\0= 00Max front or backend stalls per instruction\000\000\000\000\000\00000" +/* offset=3D128923 */ "frontend_cycles_idle\000Default\000stalled\\-cycles= \\-frontend / cpu\\-cycles\000frontend_cycles_idle > 0.1\000Frontend stalls= per cycle\000\000\000\000\000\00000" +/* offset=3D129052 */ "backend_cycles_idle\000Default\000stalled\\-cycles\= \-backend / cpu\\-cycles\000backend_cycles_idle > 0.2\000Backend stalls per= cycle\000\000\000\000\000\00000" +/* offset=3D129177 */ "cycles_frequency\000Default\000cpu\\-cycles / (soft= ware@cpu\\-clock\\,name\\=3Dcpu\\-clock@ if #target_cpu else software@task\= \-clock\\,name\\=3Dtask\\-clock@)\000\000Cycles per CPU second\000\0001GHz\= 000\000\000\00001" +/* offset=3D129352 */ "branch_frequency\000Default\000branches / (software= @cpu\\-clock\\,name\\=3Dcpu\\-clock@ if #target_cpu else software@task\\-cl= ock\\,name\\=3Dtask\\-clock@)\000\000Branches per CPU second\000\0001000K/s= ec\000\000\000\00001" +/* offset=3D129531 */ "branch_miss_rate\000Default\000branch\\-misses / br= anches\000branch_miss_rate > 0.05\000Branch miss rate\000\000100%\000\000\0= 00\00000" +/* offset=3D129634 */ "CPI\000\0001 / IPC\000\000\000\000\000\000\000\0000= 0" +/* offset=3D129656 */ "IPC\000group1\000inst_retired.any / cpu_clk_unhalte= d.thread\000\000\000\000\000\000\000\00000" +/* offset=3D129719 */ "Frontend_Bound_SMT\000\000idq_uops_not_delivered.co= re / (4 * (cpu_clk_unhalted.thread / 2 * (1 + cpu_clk_unhalted.one_thread_a= ctive / cpu_clk_unhalted.ref_xclk)))\000\000\000\000\000\000\000\00000" +/* offset=3D129885 */ "dcache_miss_cpi\000\000l1d\\-loads\\-misses / inst_= retired.any\000\000\000\000\000\000\000\00000" +/* offset=3D129949 */ "icache_miss_cycles\000\000l1i\\-loads\\-misses / in= st_retired.any\000\000\000\000\000\000\000\00000" +/* offset=3D130016 */ "cache_miss_cycles\000group1\000dcache_miss_cpi + ic= ache_miss_cycles\000\000\000\000\000\000\000\00000" +/* offset=3D130087 */ "DCache_L2_All_Hits\000\000l2_rqsts.demand_data_rd_h= it + l2_rqsts.pf_hit + l2_rqsts.rfo_hit\000\000\000\000\000\000\000\00000" +/* offset=3D130181 */ "DCache_L2_All_Miss\000\000max(l2_rqsts.all_demand_d= ata_rd - l2_rqsts.demand_data_rd_hit, 0) + l2_rqsts.pf_miss + l2_rqsts.rfo_= miss\000\000\000\000\000\000\000\00000" +/* offset=3D130315 */ "DCache_L2_All\000\000DCache_L2_All_Hits + DCache_L2= _All_Miss\000\000\000\000\000\000\000\00000" +/* offset=3D130379 */ "DCache_L2_Hits\000\000d_ratio(DCache_L2_All_Hits, D= Cache_L2_All)\000\000\000\000\000\000\000\00000" +/* offset=3D130447 */ "DCache_L2_Misses\000\000d_ratio(DCache_L2_All_Miss,= DCache_L2_All)\000\000\000\000\000\000\000\00000" +/* offset=3D130517 */ "M1\000\000ipc + M2\000\000\000\000\000\000\000\0000= 0" +/* offset=3D130539 */ "M2\000\000ipc + M1\000\000\000\000\000\000\000\0000= 0" +/* offset=3D130561 */ "M3\000\0001 / M3\000\000\000\000\000\000\000\00000" +/* offset=3D130581 */ "L1D_Cache_Fill_BW\000\00064 * l1d.replacement / 1e9= / duration_time\000\000\000\000\000\000\000\00000" ; =20 static const struct compact_pmu_event pmu_events__common_default_core[] = =3D { @@ -2603,6 +2614,29 @@ static const struct pmu_table_entry pmu_events__comm= on[] =3D { }, }; =20 +static const struct compact_pmu_event pmu_metrics__common_default_core[] = =3D { +{ 127742 }, /* CPUs_utilized\000Default\000(software@cpu\\-clock\\,name\\= =3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\= -clock@) / (duration_time * 1e9)\000\000Average CPU utilization\000\0001CPU= s\000\000\000\00001 */ +{ 129052 }, /* backend_cycles_idle\000Default\000stalled\\-cycles\\-backen= d / cpu\\-cycles\000backend_cycles_idle > 0.2\000Backend stalls per cycle\0= 00\000\000\000\000\00000 */ +{ 129352 }, /* branch_frequency\000Default\000branches / (software@cpu\\-c= lock\\,name\\=3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,na= me\\=3Dtask\\-clock@)\000\000Branches per CPU second\000\0001000K/sec\000\0= 00\000\00001 */ +{ 129531 }, /* branch_miss_rate\000Default\000branch\\-misses / branches\0= 00branch_miss_rate > 0.05\000Branch miss rate\000\000100%\000\000\000\00000= */ +{ 127927 }, /* cs_per_second\000Default\000software@context\\-switches\\,n= ame\\=3Dcontext\\-switches@ * 1e9 / (software@cpu\\-clock\\,name\\=3Dcpu\\-= clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\-clock@)\= 000\000Context switches per CPU second\000\0001cs/sec\000\000\000\00001 */ +{ 129177 }, /* cycles_frequency\000Default\000cpu\\-cycles / (software@cpu= \\-clock\\,name\\=3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\= \,name\\=3Dtask\\-clock@)\000\000Cycles per CPU second\000\0001GHz\000\000\= 000\00001 */ +{ 128923 }, /* frontend_cycles_idle\000Default\000stalled\\-cycles\\-front= end / cpu\\-cycles\000frontend_cycles_idle > 0.1\000Frontend stalls per cyc= le\000\000\000\000\000\00000 */ +{ 128648 }, /* insn_per_cycle\000Default\000instructions / cpu\\-cycles\00= 0insn_per_cycle < 1\000Instructions Per Cycle\000\0001instructions\000\000\= 000\00000 */ +{ 128159 }, /* migrations_per_second\000Default\000software@cpu\\-migratio= ns\\,name\\=3Dcpu\\-migrations@ * 1e9 / (software@cpu\\-clock\\,name\\=3Dcp= u\\-clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\-cloc= k@)\000\000Process migrations to a new CPU per CPU second\000\0001migration= s/sec\000\000\000\00001 */ +{ 128418 }, /* page_faults_per_second\000Default\000software@page\\-faults= \\,name\\=3Dpage\\-faults@ * 1e9 / (software@cpu\\-clock\\,name\\=3Dcpu\\-c= lock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\-clock@)\0= 00\000Page faults per CPU second\000\0001faults/sec\000\000\000\00001 */ +{ 128760 }, /* stalled_cycles_per_instruction\000Default\000max(stalled\\-= cycles\\-frontend, stalled\\-cycles\\-backend) / instructions\000\000Max fr= ont or backend stalls per instruction\000\000\000\000\000\00000 */ + +}; + +static const struct pmu_table_entry pmu_metrics__common[] =3D { +{ + .entries =3D pmu_metrics__common_default_core, + .num_entries =3D ARRAY_SIZE(pmu_metrics__common_default_core), + .pmu_name =3D { 0 /* default_core\000 */ }, +}, +}; + static const struct compact_pmu_event pmu_events__test_soc_cpu_default_cor= e[] =3D { { 126189 }, /* bp_l1_btb_correct\000branch\000L1 BTB Correction\000event= =3D0x8a\000\00000\000\000\000\000\000 */ { 126251 }, /* bp_l2_btb_correct\000branch\000L2 BTB Correction\000event= =3D0x8b\000\00000\000\000\000\000\000 */ @@ -2664,21 +2698,21 @@ static const struct pmu_table_entry pmu_events__tes= t_soc_cpu[] =3D { }; =20 static const struct compact_pmu_event pmu_metrics__test_soc_cpu_default_co= re[] =3D { -{ 127742 }, /* CPI\000\0001 / IPC\000\000\000\000\000\000\000\00000 */ -{ 128423 }, /* DCache_L2_All\000\000DCache_L2_All_Hits + DCache_L2_All_Mis= s\000\000\000\000\000\000\000\00000 */ -{ 128195 }, /* DCache_L2_All_Hits\000\000l2_rqsts.demand_data_rd_hit + l2_= rqsts.pf_hit + l2_rqsts.rfo_hit\000\000\000\000\000\000\000\00000 */ -{ 128289 }, /* DCache_L2_All_Miss\000\000max(l2_rqsts.all_demand_data_rd -= l2_rqsts.demand_data_rd_hit, 0) + l2_rqsts.pf_miss + l2_rqsts.rfo_miss\000= \000\000\000\000\000\000\00000 */ -{ 128487 }, /* DCache_L2_Hits\000\000d_ratio(DCache_L2_All_Hits, DCache_L2= _All)\000\000\000\000\000\000\000\00000 */ -{ 128555 }, /* DCache_L2_Misses\000\000d_ratio(DCache_L2_All_Miss, DCache_= L2_All)\000\000\000\000\000\000\000\00000 */ -{ 127827 }, /* Frontend_Bound_SMT\000\000idq_uops_not_delivered.core / (4 = * (cpu_clk_unhalted.thread / 2 * (1 + cpu_clk_unhalted.one_thread_active / = cpu_clk_unhalted.ref_xclk)))\000\000\000\000\000\000\000\00000 */ -{ 127764 }, /* IPC\000group1\000inst_retired.any / cpu_clk_unhalted.thread= \000\000\000\000\000\000\000\00000 */ -{ 128689 }, /* L1D_Cache_Fill_BW\000\00064 * l1d.replacement / 1e9 / durat= ion_time\000\000\000\000\000\000\000\00000 */ -{ 128625 }, /* M1\000\000ipc + M2\000\000\000\000\000\000\000\00000 */ -{ 128647 }, /* M2\000\000ipc + M1\000\000\000\000\000\000\000\00000 */ -{ 128669 }, /* M3\000\0001 / M3\000\000\000\000\000\000\000\00000 */ -{ 128124 }, /* cache_miss_cycles\000group1\000dcache_miss_cpi + icache_mis= s_cycles\000\000\000\000\000\000\000\00000 */ -{ 127993 }, /* dcache_miss_cpi\000\000l1d\\-loads\\-misses / inst_retired.= any\000\000\000\000\000\000\000\00000 */ -{ 128057 }, /* icache_miss_cycles\000\000l1i\\-loads\\-misses / inst_retir= ed.any\000\000\000\000\000\000\000\00000 */ +{ 129634 }, /* CPI\000\0001 / IPC\000\000\000\000\000\000\000\00000 */ +{ 130315 }, /* DCache_L2_All\000\000DCache_L2_All_Hits + DCache_L2_All_Mis= s\000\000\000\000\000\000\000\00000 */ +{ 130087 }, /* DCache_L2_All_Hits\000\000l2_rqsts.demand_data_rd_hit + l2_= rqsts.pf_hit + l2_rqsts.rfo_hit\000\000\000\000\000\000\000\00000 */ +{ 130181 }, /* DCache_L2_All_Miss\000\000max(l2_rqsts.all_demand_data_rd -= l2_rqsts.demand_data_rd_hit, 0) + l2_rqsts.pf_miss + l2_rqsts.rfo_miss\000= \000\000\000\000\000\000\00000 */ +{ 130379 }, /* DCache_L2_Hits\000\000d_ratio(DCache_L2_All_Hits, DCache_L2= _All)\000\000\000\000\000\000\000\00000 */ +{ 130447 }, /* DCache_L2_Misses\000\000d_ratio(DCache_L2_All_Miss, DCache_= L2_All)\000\000\000\000\000\000\000\00000 */ +{ 129719 }, /* Frontend_Bound_SMT\000\000idq_uops_not_delivered.core / (4 = * (cpu_clk_unhalted.thread / 2 * (1 + cpu_clk_unhalted.one_thread_active / = cpu_clk_unhalted.ref_xclk)))\000\000\000\000\000\000\000\00000 */ +{ 129656 }, /* IPC\000group1\000inst_retired.any / cpu_clk_unhalted.thread= \000\000\000\000\000\000\000\00000 */ +{ 130581 }, /* L1D_Cache_Fill_BW\000\00064 * l1d.replacement / 1e9 / durat= ion_time\000\000\000\000\000\000\000\00000 */ +{ 130517 }, /* M1\000\000ipc + M2\000\000\000\000\000\000\000\00000 */ +{ 130539 }, /* M2\000\000ipc + M1\000\000\000\000\000\000\000\00000 */ +{ 130561 }, /* M3\000\0001 / M3\000\000\000\000\000\000\000\00000 */ +{ 130016 }, /* cache_miss_cycles\000group1\000dcache_miss_cpi + icache_mis= s_cycles\000\000\000\000\000\000\000\00000 */ +{ 129885 }, /* dcache_miss_cpi\000\000l1d\\-loads\\-misses / inst_retired.= any\000\000\000\000\000\000\000\00000 */ +{ 129949 }, /* icache_miss_cycles\000\000l1i\\-loads\\-misses / inst_retir= ed.any\000\000\000\000\000\000\000\00000 */ =20 }; =20 @@ -2759,7 +2793,10 @@ static const struct pmu_events_map pmu_events_map[] = =3D { .pmus =3D pmu_events__common, .num_pmus =3D ARRAY_SIZE(pmu_events__common), }, - .metric_table =3D {}, + .metric_table =3D { + .pmus =3D pmu_metrics__common, + .num_pmus =3D ARRAY_SIZE(pmu_metrics__common), + }, }, { .arch =3D "testarch", @@ -3208,6 +3245,22 @@ const struct pmu_metrics_table *pmu_metrics_table__f= ind(void) return map ? &map->metric_table : NULL; } =20 +const struct pmu_metrics_table *pmu_metrics_table__default(void) +{ + int i =3D 0; + + for (;;) { + const struct pmu_events_map *map =3D &pmu_events_map[i++]; + + if (!map->arch) + break; + + if (!strcmp(map->cpuid, "common")) + return &map->metric_table; + } + return NULL; +} + const struct pmu_events_table *find_core_events_table(const char *arch, co= nst char *cpuid) { for (const struct pmu_events_map *tables =3D &pmu_events_map[0]; diff --git a/tools/perf/pmu-events/jevents.py b/tools/perf/pmu-events/jeven= ts.py index 786a7049363f..5d3f4b44cfb7 100755 --- a/tools/perf/pmu-events/jevents.py +++ b/tools/perf/pmu-events/jevents.py @@ -755,7 +755,10 @@ static const struct pmu_events_map pmu_events_map[] = =3D { \t\t.pmus =3D pmu_events__common, \t\t.num_pmus =3D ARRAY_SIZE(pmu_events__common), \t}, -\t.metric_table =3D {}, +\t.metric_table =3D { +\t\t.pmus =3D pmu_metrics__common, +\t\t.num_pmus =3D ARRAY_SIZE(pmu_metrics__common), +\t}, }, """) else: @@ -1237,6 +1240,22 @@ const struct pmu_metrics_table *pmu_metrics_table__f= ind(void) return map ? &map->metric_table : NULL; } =20 +const struct pmu_metrics_table *pmu_metrics_table__default(void) +{ + int i =3D 0; + + for (;;) { + const struct pmu_events_map *map =3D &pmu_events_map[i++]; + + if (!map->arch) + break; + + if (!strcmp(map->cpuid, "common")) + return &map->metric_table; + } + return NULL; +} + const struct pmu_events_table *find_core_events_table(const char *arch, co= nst char *cpuid) { for (const struct pmu_events_map *tables =3D &pmu_events_map[0]; diff --git a/tools/perf/pmu-events/pmu-events.h b/tools/perf/pmu-events/pmu= -events.h index e0535380c0b2..559265a903c8 100644 --- a/tools/perf/pmu-events/pmu-events.h +++ b/tools/perf/pmu-events/pmu-events.h @@ -127,6 +127,7 @@ int pmu_metrics_table__find_metric(const struct pmu_met= rics_table *table, const struct pmu_events_table *perf_pmu__find_events_table(struct perf_pmu= *pmu); const struct pmu_events_table *perf_pmu__default_core_events_table(void); const struct pmu_metrics_table *pmu_metrics_table__find(void); +const struct pmu_metrics_table *pmu_metrics_table__default(void); const struct pmu_events_table *find_core_events_table(const char *arch, co= nst char *cpuid); const struct pmu_metrics_table *find_core_metrics_table(const char *arch, = const char *cpuid); int pmu_for_each_core_event(pmu_event_iter_fn fn, void *data); diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c index 76092ee26761..e67e04ce01c9 100644 --- a/tools/perf/util/metricgroup.c +++ b/tools/perf/util/metricgroup.c @@ -424,10 +424,18 @@ int metricgroup__for_each_metric(const struct pmu_met= rics_table *table, pmu_metr .fn =3D fn, .data =3D data, }; + const struct pmu_metrics_table *tables[2] =3D { + table, + pmu_metrics_table__default(), + }; + + for (size_t i =3D 0; i < ARRAY_SIZE(tables); i++) { + int ret; =20 - if (table) { - int ret =3D pmu_metrics_table__for_each_metric(table, fn, data); + if (!tables[i]) + continue; =20 + ret =3D pmu_metrics_table__for_each_metric(tables[i], fn, data); if (ret) return ret; } @@ -1581,19 +1589,22 @@ static int metricgroup__has_metric_or_groups_callba= ck(const struct pmu_metric *p =20 bool metricgroup__has_metric_or_groups(const char *pmu, const char *metric= _or_groups) { - const struct pmu_metrics_table *table =3D pmu_metrics_table__find(); + const struct pmu_metrics_table *tables[2] =3D { + pmu_metrics_table__find(), + pmu_metrics_table__default(), + }; struct metricgroup__has_metric_data data =3D { .pmu =3D pmu, .metric_or_groups =3D metric_or_groups, }; =20 - if (!table) - return false; - - return pmu_metrics_table__for_each_metric(table, - metricgroup__has_metric_or_groups_callback, - &data) - ? true : false; + for (size_t i =3D 0; i < ARRAY_SIZE(tables); i++) { + if (pmu_metrics_table__for_each_metric(tables[i], + metricgroup__has_metric_or_groups_callback, + &data)) + return true; + } + return false; } =20 static int metricgroup__topdown_max_level_callback(const struct pmu_metric= *pm, --=20 2.51.2.1041.gc1ab5b90ca-goog From nobody Fri Dec 19 17:18:16 2025 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.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 4B1993570B1 for ; Thu, 6 Nov 2025 23:15:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470950; cv=none; b=jTEoki/n0X4EgmSf/P6/AjoAwSlkEITrjZR99xn3utaNXoweu0Zyt0iF6ia8VG7OBRr59AIIR/NY3kyUEoLoH88mwKL/BMTX9sQwNS04QW4ZUHTRIrQakCiF8qISbiI4yajk2Xb9H4CsNCxa2WSElFoNd91i6k0kDHw4fkiTgt4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470950; c=relaxed/simple; bh=gswXgmADcUKU5ZyqoaQwRl7GUEkksR3ZFx2kQ5UsJRU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=gbFaEnPIC2fqJAeqOxU3d4HeJVaVm/0BxsUynJ9lp7jzUse32lrIEFjF9b1BlV+AD80uA1Zr0Fiv+C90wYfe7SmMhOkYF/nwh4wFDHjWAmcMy0j+Suwr/sWCvVBcqhibP4lDTABt88cDp7NSyFZCPUVIfQN8CP3ZCcQ5+XKS6pU= 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=Tp8Vej3i; arc=none smtp.client-ip=209.85.215.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="Tp8Vej3i" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-b6ce1b57b9cso166796a12.1 for ; Thu, 06 Nov 2025 15:15:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1762470946; x=1763075746; darn=vger.kernel.org; h=content-transfer-encoding:to:from:subject:message-id:references :mime-version:in-reply-to:date:from:to:cc:subject:date:message-id :reply-to; bh=10mrD7h9zc7AZwhsMcALkVrJAYo6GI6i5q1Zz+TOnJo=; b=Tp8Vej3is27WVX9AsbdhDHXdPISO6lIKvm+TCzLEtSeBsw4rsUg4fZyFNUrfKZmJTP Rt008dz6lt1bBYT/7JMzZnfYSwLkVOeUAuCfyzZ09lVDiSbGyHKuHefLqK+Ik1iM5Bt0 E/6K9GV5RDsMlQnRilhAwzfGsYg0BYHhFvKUQaH5VvUoB9DF0Tw84zER9A96EP3wn9Ya XX5mmjO48+9szS1o3spPrTyoNr4IZ+ILAZFUQSZBk6am0jhoXaXs8235W37tUvyQgECW iCgSocA43xjU1/dA2rmZkD7rAyhOnLO2Grwpb4vbRtHDFemN0Rx7sNBKqWZS9LUpDznW eKbQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762470946; x=1763075746; h=content-transfer-encoding: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=10mrD7h9zc7AZwhsMcALkVrJAYo6GI6i5q1Zz+TOnJo=; b=a7gsR+qkHlRos0rw65+dqKyS3V+lpyQRv6Fk2Op3LKEbTr0fnrqxfKuXMT6XCRC/w6 xrPDOD6d8TSDnUcNCOA6QYhDWorfy+cRKAhh5cJnMqAPbijwKzoH9DqkDOPlh02nWLE1 p95fw3toEi8REWY0ikUgxSdcxAesKrQVAmXc6VWA+tkYcz3/eIx4jUAFNXvHRWFZHD9s +MYkmbO8NjosGgSyLc52hzKUBtQsVmyfYfaqjWbGCpYH//LW22ga232MjyByvqBLPPng ARS6c9DHkjxyzyANT3tT8TEa9r2WsmH0rfbFpOZIldZ6LrbvDw95OHHdQTgoIRheK7WW xHEQ== X-Forwarded-Encrypted: i=1; AJvYcCVgPHF/Glsc9bxe/mR88+OOaV2qnqKUbxYDrskx6hf7r5My4I2A2LRmzTCSgbvaqiC6mXq3ejr4aYHJY/M=@vger.kernel.org X-Gm-Message-State: AOJu0YzQfJYnMrUSdOyrw5tgfZOIRMwnsquAAcRB9VHeQ3ZhDYTp78YC 5bnmyypmn9myJyPj0OKmun65eWFFXOAj2e16ZMbX2qtkFTsmhvmVE1Cg0+igk1ItG9F37tKIVxM kRDYuA7rKSw== X-Google-Smtp-Source: AGHT+IGFNbWssTZC6p5NvgZC2HZWqBT0JKoih6QW0nBwydXrhU3RRGOO5cpY8zcxWeBpIlPPjlybM6BmCmC9 X-Received: from dlbsi14.prod.google.com ([2002:a05:7022:b88e:b0:119:49ca:6bb1]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:3bad:b0:290:b53b:7455 with SMTP id d9443c01a7336-297c03a5d3emr14539495ad.10.1762470946431; Thu, 06 Nov 2025 15:15:46 -0800 (PST) Date: Thu, 6 Nov 2025 15:14:54 -0800 In-Reply-To: <20251106231508.448793-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: <20251106231508.448793-1-irogers@google.com> X-Mailer: git-send-email 2.51.2.1041.gc1ab5b90ca-goog Message-ID: <20251106231508.448793-5-irogers@google.com> Subject: [PATCH v2 04/18] perf jevents: Add metric DefaultShowEvents From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Xu Yang , Chun-Tse Shao , Thomas Richter , Sumanth Korikkar , Collin Funk , Thomas Falcon , Howard Chu , Dapeng Mi , Levi Yun , Yang Li , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Andi Kleen , Weilin Wang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Some Default group metrics require their events showing for consistency with perf's previous behavior. Add a flag to indicate when this is the case and use it in stat-display. As events are coming from Default metrics remove that default hardware and software events from perf stat. Following this change the default perf stat output on an alderlake looks li= ke: ``` $ perf stat -a -- sleep 1 Performance counter stats for 'system wide': 20,759 context-switches # 735.7 cs/sec = cs_per_second TopdownL1 (cpu_core) # 7.8 % tma_bad_spe= culation # 34.8 % tma_fronten= d_bound TopdownL1 (cpu_core) # 39.0 % tma_backend= _bound # 18.4 % tma_retiring 769 page-faults # 27.3 faults/= sec page_faults_per_second 531,102,439 cpu_atom/cpu-cycles/ # 0.0 GHz cy= cles_frequency (49.80%) 785,144,850 cpu_core/cpu-cycles/ # 0.0 GHz cy= cles_frequency # 17.6 % tma_bad_spe= culation # 14.4 % tma_retirin= g (50.20%) # 37.0 % tma_backend= _bound # 31.0 % tma_fronten= d_bound (50.37%) 47,631,924 cpu_atom/branches/ # 1.7 K/sec = branch_frequency (60.31%) 138,036,825 cpu_core/branches/ # 4.9 K/sec = branch_frequency 779 cpu-migrations # 27.6 migrati= ons/sec migrations_per_second 28,218,162,085 cpu-clock # 28.0 CPUs C= PUs_utilized 522,230,152 cpu_atom/cpu-cycles/ # 0.5 instruc= tions insn_per_cycle (60.12%) 785,133,103 cpu_core/cpu-cycles/ # 1.0 instruc= tions insn_per_cycle 2,541,997 cpu_atom/branch-misses/ # 5.5 % bran= ch_miss_rate (49.63%) 3,106,064 cpu_core/branch-misses/ # 2.3 % bran= ch_miss_rate 1.007489028 seconds time elapsed ``` Signed-off-by: Ian Rogers --- tools/perf/builtin-stat.c | 42 +------ .../arch/common/common/metrics.json | 33 ++++-- tools/perf/pmu-events/empty-pmu-events.c | 106 +++++++++--------- tools/perf/pmu-events/jevents.py | 7 +- tools/perf/pmu-events/pmu-events.h | 1 + tools/perf/util/evsel.h | 1 + tools/perf/util/metricgroup.c | 13 +++ tools/perf/util/stat-display.c | 4 +- tools/perf/util/stat-shadow.c | 2 +- 9 files changed, 102 insertions(+), 107 deletions(-) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 886727ae8529..999c6d587702 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -1857,16 +1857,6 @@ static int perf_stat_init_aggr_mode_file(struct perf= _stat *st) return 0; } =20 -/* Add given software event to evlist without wildcarding. */ -static int parse_software_event(struct evlist *evlist, const char *event, - struct parse_events_error *err) -{ - char buf[256]; - - snprintf(buf, sizeof(buf), "software/%s,name=3D%s/", event, event); - return parse_events(evlist, buf, err); -} - /* Add legacy hardware/hardware-cache event to evlist for all core PMUs wi= thout wildcarding. */ static int parse_hardware_event(struct evlist *evlist, const char *event, struct parse_events_error *err) @@ -2011,36 +2001,10 @@ static int add_default_events(void) stat_config.topdown_level =3D 1; =20 if (!evlist->core.nr_entries && !evsel_list->core.nr_entries) { - /* No events so add defaults. */ - const char *sw_events[] =3D { - target__has_cpu(&target) ? "cpu-clock" : "task-clock", - "context-switches", - "cpu-migrations", - "page-faults", - }; - const char *hw_events[] =3D { - "instructions", - "cycles", - "stalled-cycles-frontend", - "stalled-cycles-backend", - "branches", - "branch-misses", - }; - - for (size_t i =3D 0; i < ARRAY_SIZE(sw_events); i++) { - ret =3D parse_software_event(evlist, sw_events[i], &err); - if (ret) - goto out; - } - for (size_t i =3D 0; i < ARRAY_SIZE(hw_events); i++) { - ret =3D parse_hardware_event(evlist, hw_events[i], &err); - if (ret) - goto out; - } - /* - * Add TopdownL1 metrics if they exist. To minimize - * multiplexing, don't request threshold computation. + * Add Default metrics. To minimize multiplexing, don't request + * threshold computation, but it will be computed if the events + * are present. */ if (metricgroup__has_metric_or_groups(pmu, "Default")) { struct evlist *metric_evlist =3D evlist__new(); diff --git a/tools/perf/pmu-events/arch/common/common/metrics.json b/tools/= perf/pmu-events/arch/common/common/metrics.json index d1e37db18dc6..017bbdede3d7 100644 --- a/tools/perf/pmu-events/arch/common/common/metrics.json +++ b/tools/perf/pmu-events/arch/common/common/metrics.json @@ -5,7 +5,8 @@ "MetricGroup": "Default", "MetricName": "CPUs_utilized", "ScaleUnit": "1CPUs", - "MetricConstraint": "NO_GROUP_EVENTS" + "MetricConstraint": "NO_GROUP_EVENTS", + "DefaultShowEvents": "1" }, { "BriefDescription": "Context switches per CPU second", @@ -13,7 +14,8 @@ "MetricGroup": "Default", "MetricName": "cs_per_second", "ScaleUnit": "1cs/sec", - "MetricConstraint": "NO_GROUP_EVENTS" + "MetricConstraint": "NO_GROUP_EVENTS", + "DefaultShowEvents": "1" }, { "BriefDescription": "Process migrations to a new CPU per CPU secon= d", @@ -21,7 +23,8 @@ "MetricGroup": "Default", "MetricName": "migrations_per_second", "ScaleUnit": "1migrations/sec", - "MetricConstraint": "NO_GROUP_EVENTS" + "MetricConstraint": "NO_GROUP_EVENTS", + "DefaultShowEvents": "1" }, { "BriefDescription": "Page faults per CPU second", @@ -29,7 +32,8 @@ "MetricGroup": "Default", "MetricName": "page_faults_per_second", "ScaleUnit": "1faults/sec", - "MetricConstraint": "NO_GROUP_EVENTS" + "MetricConstraint": "NO_GROUP_EVENTS", + "DefaultShowEvents": "1" }, { "BriefDescription": "Instructions Per Cycle", @@ -37,27 +41,31 @@ "MetricGroup": "Default", "MetricName": "insn_per_cycle", "MetricThreshold": "insn_per_cycle < 1", - "ScaleUnit": "1instructions" + "ScaleUnit": "1instructions", + "DefaultShowEvents": "1" }, { "BriefDescription": "Max front or backend stalls per instruction", "MetricExpr": "max(stalled\\-cycles\\-frontend, stalled\\-cycles\\= -backend) / instructions", "MetricGroup": "Default", - "MetricName": "stalled_cycles_per_instruction" + "MetricName": "stalled_cycles_per_instruction", + "DefaultShowEvents": "1" }, { "BriefDescription": "Frontend stalls per cycle", "MetricExpr": "stalled\\-cycles\\-frontend / cpu\\-cycles", "MetricGroup": "Default", "MetricName": "frontend_cycles_idle", - "MetricThreshold": "frontend_cycles_idle > 0.1" + "MetricThreshold": "frontend_cycles_idle > 0.1", + "DefaultShowEvents": "1" }, { "BriefDescription": "Backend stalls per cycle", "MetricExpr": "stalled\\-cycles\\-backend / cpu\\-cycles", "MetricGroup": "Default", "MetricName": "backend_cycles_idle", - "MetricThreshold": "backend_cycles_idle > 0.2" + "MetricThreshold": "backend_cycles_idle > 0.2", + "DefaultShowEvents": "1" }, { "BriefDescription": "Cycles per CPU second", @@ -65,7 +73,8 @@ "MetricGroup": "Default", "MetricName": "cycles_frequency", "ScaleUnit": "1GHz", - "MetricConstraint": "NO_GROUP_EVENTS" + "MetricConstraint": "NO_GROUP_EVENTS", + "DefaultShowEvents": "1" }, { "BriefDescription": "Branches per CPU second", @@ -73,7 +82,8 @@ "MetricGroup": "Default", "MetricName": "branch_frequency", "ScaleUnit": "1000K/sec", - "MetricConstraint": "NO_GROUP_EVENTS" + "MetricConstraint": "NO_GROUP_EVENTS", + "DefaultShowEvents": "1" }, { "BriefDescription": "Branch miss rate", @@ -81,6 +91,7 @@ "MetricGroup": "Default", "MetricName": "branch_miss_rate", "MetricThreshold": "branch_miss_rate > 0.05", - "ScaleUnit": "100%" + "ScaleUnit": "100%", + "DefaultShowEvents": "1" } ] diff --git a/tools/perf/pmu-events/empty-pmu-events.c b/tools/perf/pmu-even= ts/empty-pmu-events.c index 83a01ecc625e..71464b1d8afe 100644 --- a/tools/perf/pmu-events/empty-pmu-events.c +++ b/tools/perf/pmu-events/empty-pmu-events.c @@ -1303,32 +1303,32 @@ static const char *const big_c_string =3D /* offset=3D127503 */ "sys_ccn_pmu.read_cycles\000uncore\000ccn read-cycle= s event\000config=3D0x2c\0000x01\00000\000\000\000\000\000" /* offset=3D127580 */ "uncore_sys_cmn_pmu\000" /* offset=3D127599 */ "sys_cmn_pmu.hnf_cache_miss\000uncore\000Counts tota= l cache misses in first lookup result (high priority)\000eventid=3D1,type= =3D5\000(434|436|43c|43a).*\00000\000\000\000\000\000" -/* offset=3D127742 */ "CPUs_utilized\000Default\000(software@cpu\\-clock\\= ,name\\=3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,name\\= =3Dtask\\-clock@) / (duration_time * 1e9)\000\000Average CPU utilization\00= 0\0001CPUs\000\000\000\00001" -/* offset=3D127927 */ "cs_per_second\000Default\000software@context\\-swit= ches\\,name\\=3Dcontext\\-switches@ * 1e9 / (software@cpu\\-clock\\,name\\= =3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\= -clock@)\000\000Context switches per CPU second\000\0001cs/sec\000\000\000\= 00001" -/* offset=3D128159 */ "migrations_per_second\000Default\000software@cpu\\-= migrations\\,name\\=3Dcpu\\-migrations@ * 1e9 / (software@cpu\\-clock\\,nam= e\\=3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtas= k\\-clock@)\000\000Process migrations to a new CPU per CPU second\000\0001m= igrations/sec\000\000\000\00001" -/* offset=3D128418 */ "page_faults_per_second\000Default\000software@page\= \-faults\\,name\\=3Dpage\\-faults@ * 1e9 / (software@cpu\\-clock\\,name\\= =3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\= -clock@)\000\000Page faults per CPU second\000\0001faults/sec\000\000\000\0= 0001" -/* offset=3D128648 */ "insn_per_cycle\000Default\000instructions / cpu\\-c= ycles\000insn_per_cycle < 1\000Instructions Per Cycle\000\0001instructions\= 000\000\000\00000" -/* offset=3D128760 */ "stalled_cycles_per_instruction\000Default\000max(st= alled\\-cycles\\-frontend, stalled\\-cycles\\-backend) / instructions\000\0= 00Max front or backend stalls per instruction\000\000\000\000\000\00000" -/* offset=3D128923 */ "frontend_cycles_idle\000Default\000stalled\\-cycles= \\-frontend / cpu\\-cycles\000frontend_cycles_idle > 0.1\000Frontend stalls= per cycle\000\000\000\000\000\00000" -/* offset=3D129052 */ "backend_cycles_idle\000Default\000stalled\\-cycles\= \-backend / cpu\\-cycles\000backend_cycles_idle > 0.2\000Backend stalls per= cycle\000\000\000\000\000\00000" -/* offset=3D129177 */ "cycles_frequency\000Default\000cpu\\-cycles / (soft= ware@cpu\\-clock\\,name\\=3Dcpu\\-clock@ if #target_cpu else software@task\= \-clock\\,name\\=3Dtask\\-clock@)\000\000Cycles per CPU second\000\0001GHz\= 000\000\000\00001" -/* offset=3D129352 */ "branch_frequency\000Default\000branches / (software= @cpu\\-clock\\,name\\=3Dcpu\\-clock@ if #target_cpu else software@task\\-cl= ock\\,name\\=3Dtask\\-clock@)\000\000Branches per CPU second\000\0001000K/s= ec\000\000\000\00001" -/* offset=3D129531 */ "branch_miss_rate\000Default\000branch\\-misses / br= anches\000branch_miss_rate > 0.05\000Branch miss rate\000\000100%\000\000\0= 00\00000" -/* offset=3D129634 */ "CPI\000\0001 / IPC\000\000\000\000\000\000\000\0000= 0" -/* offset=3D129656 */ "IPC\000group1\000inst_retired.any / cpu_clk_unhalte= d.thread\000\000\000\000\000\000\000\00000" -/* offset=3D129719 */ "Frontend_Bound_SMT\000\000idq_uops_not_delivered.co= re / (4 * (cpu_clk_unhalted.thread / 2 * (1 + cpu_clk_unhalted.one_thread_a= ctive / cpu_clk_unhalted.ref_xclk)))\000\000\000\000\000\000\000\00000" -/* offset=3D129885 */ "dcache_miss_cpi\000\000l1d\\-loads\\-misses / inst_= retired.any\000\000\000\000\000\000\000\00000" -/* offset=3D129949 */ "icache_miss_cycles\000\000l1i\\-loads\\-misses / in= st_retired.any\000\000\000\000\000\000\000\00000" -/* offset=3D130016 */ "cache_miss_cycles\000group1\000dcache_miss_cpi + ic= ache_miss_cycles\000\000\000\000\000\000\000\00000" -/* offset=3D130087 */ "DCache_L2_All_Hits\000\000l2_rqsts.demand_data_rd_h= it + l2_rqsts.pf_hit + l2_rqsts.rfo_hit\000\000\000\000\000\000\000\00000" -/* offset=3D130181 */ "DCache_L2_All_Miss\000\000max(l2_rqsts.all_demand_d= ata_rd - l2_rqsts.demand_data_rd_hit, 0) + l2_rqsts.pf_miss + l2_rqsts.rfo_= miss\000\000\000\000\000\000\000\00000" -/* offset=3D130315 */ "DCache_L2_All\000\000DCache_L2_All_Hits + DCache_L2= _All_Miss\000\000\000\000\000\000\000\00000" -/* offset=3D130379 */ "DCache_L2_Hits\000\000d_ratio(DCache_L2_All_Hits, D= Cache_L2_All)\000\000\000\000\000\000\000\00000" -/* offset=3D130447 */ "DCache_L2_Misses\000\000d_ratio(DCache_L2_All_Miss,= DCache_L2_All)\000\000\000\000\000\000\000\00000" -/* offset=3D130517 */ "M1\000\000ipc + M2\000\000\000\000\000\000\000\0000= 0" -/* offset=3D130539 */ "M2\000\000ipc + M1\000\000\000\000\000\000\000\0000= 0" -/* offset=3D130561 */ "M3\000\0001 / M3\000\000\000\000\000\000\000\00000" -/* offset=3D130581 */ "L1D_Cache_Fill_BW\000\00064 * l1d.replacement / 1e9= / duration_time\000\000\000\000\000\000\000\00000" +/* offset=3D127742 */ "CPUs_utilized\000Default\000(software@cpu\\-clock\\= ,name\\=3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,name\\= =3Dtask\\-clock@) / (duration_time * 1e9)\000\000Average CPU utilization\00= 0\0001CPUs\000\000\000\000011" +/* offset=3D127928 */ "cs_per_second\000Default\000software@context\\-swit= ches\\,name\\=3Dcontext\\-switches@ * 1e9 / (software@cpu\\-clock\\,name\\= =3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\= -clock@)\000\000Context switches per CPU second\000\0001cs/sec\000\000\000\= 000011" +/* offset=3D128161 */ "migrations_per_second\000Default\000software@cpu\\-= migrations\\,name\\=3Dcpu\\-migrations@ * 1e9 / (software@cpu\\-clock\\,nam= e\\=3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtas= k\\-clock@)\000\000Process migrations to a new CPU per CPU second\000\0001m= igrations/sec\000\000\000\000011" +/* offset=3D128421 */ "page_faults_per_second\000Default\000software@page\= \-faults\\,name\\=3Dpage\\-faults@ * 1e9 / (software@cpu\\-clock\\,name\\= =3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\= -clock@)\000\000Page faults per CPU second\000\0001faults/sec\000\000\000\0= 00011" +/* offset=3D128652 */ "insn_per_cycle\000Default\000instructions / cpu\\-c= ycles\000insn_per_cycle < 1\000Instructions Per Cycle\000\0001instructions\= 000\000\000\000001" +/* offset=3D128765 */ "stalled_cycles_per_instruction\000Default\000max(st= alled\\-cycles\\-frontend, stalled\\-cycles\\-backend) / instructions\000\0= 00Max front or backend stalls per instruction\000\000\000\000\000\000001" +/* offset=3D128929 */ "frontend_cycles_idle\000Default\000stalled\\-cycles= \\-frontend / cpu\\-cycles\000frontend_cycles_idle > 0.1\000Frontend stalls= per cycle\000\000\000\000\000\000001" +/* offset=3D129059 */ "backend_cycles_idle\000Default\000stalled\\-cycles\= \-backend / cpu\\-cycles\000backend_cycles_idle > 0.2\000Backend stalls per= cycle\000\000\000\000\000\000001" +/* offset=3D129185 */ "cycles_frequency\000Default\000cpu\\-cycles / (soft= ware@cpu\\-clock\\,name\\=3Dcpu\\-clock@ if #target_cpu else software@task\= \-clock\\,name\\=3Dtask\\-clock@)\000\000Cycles per CPU second\000\0001GHz\= 000\000\000\000011" +/* offset=3D129361 */ "branch_frequency\000Default\000branches / (software= @cpu\\-clock\\,name\\=3Dcpu\\-clock@ if #target_cpu else software@task\\-cl= ock\\,name\\=3Dtask\\-clock@)\000\000Branches per CPU second\000\0001000K/s= ec\000\000\000\000011" +/* offset=3D129541 */ "branch_miss_rate\000Default\000branch\\-misses / br= anches\000branch_miss_rate > 0.05\000Branch miss rate\000\000100%\000\000\0= 00\000001" +/* offset=3D129645 */ "CPI\000\0001 / IPC\000\000\000\000\000\000\000\0000= 00" +/* offset=3D129668 */ "IPC\000group1\000inst_retired.any / cpu_clk_unhalte= d.thread\000\000\000\000\000\000\000\000000" +/* offset=3D129732 */ "Frontend_Bound_SMT\000\000idq_uops_not_delivered.co= re / (4 * (cpu_clk_unhalted.thread / 2 * (1 + cpu_clk_unhalted.one_thread_a= ctive / cpu_clk_unhalted.ref_xclk)))\000\000\000\000\000\000\000\000000" +/* offset=3D129899 */ "dcache_miss_cpi\000\000l1d\\-loads\\-misses / inst_= retired.any\000\000\000\000\000\000\000\000000" +/* offset=3D129964 */ "icache_miss_cycles\000\000l1i\\-loads\\-misses / in= st_retired.any\000\000\000\000\000\000\000\000000" +/* offset=3D130032 */ "cache_miss_cycles\000group1\000dcache_miss_cpi + ic= ache_miss_cycles\000\000\000\000\000\000\000\000000" +/* offset=3D130104 */ "DCache_L2_All_Hits\000\000l2_rqsts.demand_data_rd_h= it + l2_rqsts.pf_hit + l2_rqsts.rfo_hit\000\000\000\000\000\000\000\000000" +/* offset=3D130199 */ "DCache_L2_All_Miss\000\000max(l2_rqsts.all_demand_d= ata_rd - l2_rqsts.demand_data_rd_hit, 0) + l2_rqsts.pf_miss + l2_rqsts.rfo_= miss\000\000\000\000\000\000\000\000000" +/* offset=3D130334 */ "DCache_L2_All\000\000DCache_L2_All_Hits + DCache_L2= _All_Miss\000\000\000\000\000\000\000\000000" +/* offset=3D130399 */ "DCache_L2_Hits\000\000d_ratio(DCache_L2_All_Hits, D= Cache_L2_All)\000\000\000\000\000\000\000\000000" +/* offset=3D130468 */ "DCache_L2_Misses\000\000d_ratio(DCache_L2_All_Miss,= DCache_L2_All)\000\000\000\000\000\000\000\000000" +/* offset=3D130539 */ "M1\000\000ipc + M2\000\000\000\000\000\000\000\0000= 00" +/* offset=3D130562 */ "M2\000\000ipc + M1\000\000\000\000\000\000\000\0000= 00" +/* offset=3D130585 */ "M3\000\0001 / M3\000\000\000\000\000\000\000\000000" +/* offset=3D130606 */ "L1D_Cache_Fill_BW\000\00064 * l1d.replacement / 1e9= / duration_time\000\000\000\000\000\000\000\000000" ; =20 static const struct compact_pmu_event pmu_events__common_default_core[] = =3D { @@ -2615,17 +2615,17 @@ static const struct pmu_table_entry pmu_events__com= mon[] =3D { }; =20 static const struct compact_pmu_event pmu_metrics__common_default_core[] = =3D { -{ 127742 }, /* CPUs_utilized\000Default\000(software@cpu\\-clock\\,name\\= =3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\= -clock@) / (duration_time * 1e9)\000\000Average CPU utilization\000\0001CPU= s\000\000\000\00001 */ -{ 129052 }, /* backend_cycles_idle\000Default\000stalled\\-cycles\\-backen= d / cpu\\-cycles\000backend_cycles_idle > 0.2\000Backend stalls per cycle\0= 00\000\000\000\000\00000 */ -{ 129352 }, /* branch_frequency\000Default\000branches / (software@cpu\\-c= lock\\,name\\=3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,na= me\\=3Dtask\\-clock@)\000\000Branches per CPU second\000\0001000K/sec\000\0= 00\000\00001 */ -{ 129531 }, /* branch_miss_rate\000Default\000branch\\-misses / branches\0= 00branch_miss_rate > 0.05\000Branch miss rate\000\000100%\000\000\000\00000= */ -{ 127927 }, /* cs_per_second\000Default\000software@context\\-switches\\,n= ame\\=3Dcontext\\-switches@ * 1e9 / (software@cpu\\-clock\\,name\\=3Dcpu\\-= clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\-clock@)\= 000\000Context switches per CPU second\000\0001cs/sec\000\000\000\00001 */ -{ 129177 }, /* cycles_frequency\000Default\000cpu\\-cycles / (software@cpu= \\-clock\\,name\\=3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\= \,name\\=3Dtask\\-clock@)\000\000Cycles per CPU second\000\0001GHz\000\000\= 000\00001 */ -{ 128923 }, /* frontend_cycles_idle\000Default\000stalled\\-cycles\\-front= end / cpu\\-cycles\000frontend_cycles_idle > 0.1\000Frontend stalls per cyc= le\000\000\000\000\000\00000 */ -{ 128648 }, /* insn_per_cycle\000Default\000instructions / cpu\\-cycles\00= 0insn_per_cycle < 1\000Instructions Per Cycle\000\0001instructions\000\000\= 000\00000 */ -{ 128159 }, /* migrations_per_second\000Default\000software@cpu\\-migratio= ns\\,name\\=3Dcpu\\-migrations@ * 1e9 / (software@cpu\\-clock\\,name\\=3Dcp= u\\-clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\-cloc= k@)\000\000Process migrations to a new CPU per CPU second\000\0001migration= s/sec\000\000\000\00001 */ -{ 128418 }, /* page_faults_per_second\000Default\000software@page\\-faults= \\,name\\=3Dpage\\-faults@ * 1e9 / (software@cpu\\-clock\\,name\\=3Dcpu\\-c= lock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\-clock@)\0= 00\000Page faults per CPU second\000\0001faults/sec\000\000\000\00001 */ -{ 128760 }, /* stalled_cycles_per_instruction\000Default\000max(stalled\\-= cycles\\-frontend, stalled\\-cycles\\-backend) / instructions\000\000Max fr= ont or backend stalls per instruction\000\000\000\000\000\00000 */ +{ 127742 }, /* CPUs_utilized\000Default\000(software@cpu\\-clock\\,name\\= =3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\= -clock@) / (duration_time * 1e9)\000\000Average CPU utilization\000\0001CPU= s\000\000\000\000011 */ +{ 129059 }, /* backend_cycles_idle\000Default\000stalled\\-cycles\\-backen= d / cpu\\-cycles\000backend_cycles_idle > 0.2\000Backend stalls per cycle\0= 00\000\000\000\000\000001 */ +{ 129361 }, /* branch_frequency\000Default\000branches / (software@cpu\\-c= lock\\,name\\=3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,na= me\\=3Dtask\\-clock@)\000\000Branches per CPU second\000\0001000K/sec\000\0= 00\000\000011 */ +{ 129541 }, /* branch_miss_rate\000Default\000branch\\-misses / branches\0= 00branch_miss_rate > 0.05\000Branch miss rate\000\000100%\000\000\000\00000= 1 */ +{ 127928 }, /* cs_per_second\000Default\000software@context\\-switches\\,n= ame\\=3Dcontext\\-switches@ * 1e9 / (software@cpu\\-clock\\,name\\=3Dcpu\\-= clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\-clock@)\= 000\000Context switches per CPU second\000\0001cs/sec\000\000\000\000011 */ +{ 129185 }, /* cycles_frequency\000Default\000cpu\\-cycles / (software@cpu= \\-clock\\,name\\=3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\= \,name\\=3Dtask\\-clock@)\000\000Cycles per CPU second\000\0001GHz\000\000\= 000\000011 */ +{ 128929 }, /* frontend_cycles_idle\000Default\000stalled\\-cycles\\-front= end / cpu\\-cycles\000frontend_cycles_idle > 0.1\000Frontend stalls per cyc= le\000\000\000\000\000\000001 */ +{ 128652 }, /* insn_per_cycle\000Default\000instructions / cpu\\-cycles\00= 0insn_per_cycle < 1\000Instructions Per Cycle\000\0001instructions\000\000\= 000\000001 */ +{ 128161 }, /* migrations_per_second\000Default\000software@cpu\\-migratio= ns\\,name\\=3Dcpu\\-migrations@ * 1e9 / (software@cpu\\-clock\\,name\\=3Dcp= u\\-clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\-cloc= k@)\000\000Process migrations to a new CPU per CPU second\000\0001migration= s/sec\000\000\000\000011 */ +{ 128421 }, /* page_faults_per_second\000Default\000software@page\\-faults= \\,name\\=3Dpage\\-faults@ * 1e9 / (software@cpu\\-clock\\,name\\=3Dcpu\\-c= lock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\-clock@)\0= 00\000Page faults per CPU second\000\0001faults/sec\000\000\000\000011 */ +{ 128765 }, /* stalled_cycles_per_instruction\000Default\000max(stalled\\-= cycles\\-frontend, stalled\\-cycles\\-backend) / instructions\000\000Max fr= ont or backend stalls per instruction\000\000\000\000\000\000001 */ =20 }; =20 @@ -2698,21 +2698,21 @@ static const struct pmu_table_entry pmu_events__tes= t_soc_cpu[] =3D { }; =20 static const struct compact_pmu_event pmu_metrics__test_soc_cpu_default_co= re[] =3D { -{ 129634 }, /* CPI\000\0001 / IPC\000\000\000\000\000\000\000\00000 */ -{ 130315 }, /* DCache_L2_All\000\000DCache_L2_All_Hits + DCache_L2_All_Mis= s\000\000\000\000\000\000\000\00000 */ -{ 130087 }, /* DCache_L2_All_Hits\000\000l2_rqsts.demand_data_rd_hit + l2_= rqsts.pf_hit + l2_rqsts.rfo_hit\000\000\000\000\000\000\000\00000 */ -{ 130181 }, /* DCache_L2_All_Miss\000\000max(l2_rqsts.all_demand_data_rd -= l2_rqsts.demand_data_rd_hit, 0) + l2_rqsts.pf_miss + l2_rqsts.rfo_miss\000= \000\000\000\000\000\000\00000 */ -{ 130379 }, /* DCache_L2_Hits\000\000d_ratio(DCache_L2_All_Hits, DCache_L2= _All)\000\000\000\000\000\000\000\00000 */ -{ 130447 }, /* DCache_L2_Misses\000\000d_ratio(DCache_L2_All_Miss, DCache_= L2_All)\000\000\000\000\000\000\000\00000 */ -{ 129719 }, /* Frontend_Bound_SMT\000\000idq_uops_not_delivered.core / (4 = * (cpu_clk_unhalted.thread / 2 * (1 + cpu_clk_unhalted.one_thread_active / = cpu_clk_unhalted.ref_xclk)))\000\000\000\000\000\000\000\00000 */ -{ 129656 }, /* IPC\000group1\000inst_retired.any / cpu_clk_unhalted.thread= \000\000\000\000\000\000\000\00000 */ -{ 130581 }, /* L1D_Cache_Fill_BW\000\00064 * l1d.replacement / 1e9 / durat= ion_time\000\000\000\000\000\000\000\00000 */ -{ 130517 }, /* M1\000\000ipc + M2\000\000\000\000\000\000\000\00000 */ -{ 130539 }, /* M2\000\000ipc + M1\000\000\000\000\000\000\000\00000 */ -{ 130561 }, /* M3\000\0001 / M3\000\000\000\000\000\000\000\00000 */ -{ 130016 }, /* cache_miss_cycles\000group1\000dcache_miss_cpi + icache_mis= s_cycles\000\000\000\000\000\000\000\00000 */ -{ 129885 }, /* dcache_miss_cpi\000\000l1d\\-loads\\-misses / inst_retired.= any\000\000\000\000\000\000\000\00000 */ -{ 129949 }, /* icache_miss_cycles\000\000l1i\\-loads\\-misses / inst_retir= ed.any\000\000\000\000\000\000\000\00000 */ +{ 129645 }, /* CPI\000\0001 / IPC\000\000\000\000\000\000\000\000000 */ +{ 130334 }, /* DCache_L2_All\000\000DCache_L2_All_Hits + DCache_L2_All_Mis= s\000\000\000\000\000\000\000\000000 */ +{ 130104 }, /* DCache_L2_All_Hits\000\000l2_rqsts.demand_data_rd_hit + l2_= rqsts.pf_hit + l2_rqsts.rfo_hit\000\000\000\000\000\000\000\000000 */ +{ 130199 }, /* DCache_L2_All_Miss\000\000max(l2_rqsts.all_demand_data_rd -= l2_rqsts.demand_data_rd_hit, 0) + l2_rqsts.pf_miss + l2_rqsts.rfo_miss\000= \000\000\000\000\000\000\000000 */ +{ 130399 }, /* DCache_L2_Hits\000\000d_ratio(DCache_L2_All_Hits, DCache_L2= _All)\000\000\000\000\000\000\000\000000 */ +{ 130468 }, /* DCache_L2_Misses\000\000d_ratio(DCache_L2_All_Miss, DCache_= L2_All)\000\000\000\000\000\000\000\000000 */ +{ 129732 }, /* Frontend_Bound_SMT\000\000idq_uops_not_delivered.core / (4 = * (cpu_clk_unhalted.thread / 2 * (1 + cpu_clk_unhalted.one_thread_active / = cpu_clk_unhalted.ref_xclk)))\000\000\000\000\000\000\000\000000 */ +{ 129668 }, /* IPC\000group1\000inst_retired.any / cpu_clk_unhalted.thread= \000\000\000\000\000\000\000\000000 */ +{ 130606 }, /* L1D_Cache_Fill_BW\000\00064 * l1d.replacement / 1e9 / durat= ion_time\000\000\000\000\000\000\000\000000 */ +{ 130539 }, /* M1\000\000ipc + M2\000\000\000\000\000\000\000\000000 */ +{ 130562 }, /* M2\000\000ipc + M1\000\000\000\000\000\000\000\000000 */ +{ 130585 }, /* M3\000\0001 / M3\000\000\000\000\000\000\000\000000 */ +{ 130032 }, /* cache_miss_cycles\000group1\000dcache_miss_cpi + icache_mis= s_cycles\000\000\000\000\000\000\000\000000 */ +{ 129899 }, /* dcache_miss_cpi\000\000l1d\\-loads\\-misses / inst_retired.= any\000\000\000\000\000\000\000\000000 */ +{ 129964 }, /* icache_miss_cycles\000\000l1i\\-loads\\-misses / inst_retir= ed.any\000\000\000\000\000\000\000\000000 */ =20 }; =20 @@ -2894,6 +2894,8 @@ static void decompress_metric(int offset, struct pmu_= metric *pm) pm->aggr_mode =3D *p - '0'; p++; pm->event_grouping =3D *p - '0'; + p++; + pm->default_show_events =3D *p - '0'; } =20 static int pmu_events_table__for_each_event_pmu(const struct pmu_events_ta= ble *table, diff --git a/tools/perf/pmu-events/jevents.py b/tools/perf/pmu-events/jeven= ts.py index 5d3f4b44cfb7..3413ee5d0227 100755 --- a/tools/perf/pmu-events/jevents.py +++ b/tools/perf/pmu-events/jevents.py @@ -58,10 +58,12 @@ _json_event_attributes =3D [ _json_metric_attributes =3D [ 'metric_name', 'metric_group', 'metric_expr', 'metric_threshold', 'desc', 'long_desc', 'unit', 'compat', 'metricgroup_no_group', - 'default_metricgroup_name', 'aggr_mode', 'event_grouping' + 'default_metricgroup_name', 'aggr_mode', 'event_grouping', + 'default_show_events' ] # Attributes that are bools or enum int values, encoded as '0', '1',... -_json_enum_attributes =3D ['aggr_mode', 'deprecated', 'event_grouping', 'p= erpkg'] +_json_enum_attributes =3D ['aggr_mode', 'deprecated', 'event_grouping', 'p= erpkg', + 'default_show_events'] =20 def removesuffix(s: str, suffix: str) -> str: """Remove the suffix from a string @@ -356,6 +358,7 @@ class JsonEvent: self.metricgroup_no_group =3D jd.get('MetricgroupNoGroup') self.default_metricgroup_name =3D jd.get('DefaultMetricgroupName') self.event_grouping =3D convert_metric_constraint(jd.get('MetricConstr= aint')) + self.default_show_events =3D jd.get('DefaultShowEvents') self.metric_expr =3D None if 'MetricExpr' in jd: self.metric_expr =3D metric.ParsePerfJson(jd['MetricExpr']).Simplify= () diff --git a/tools/perf/pmu-events/pmu-events.h b/tools/perf/pmu-events/pmu= -events.h index 559265a903c8..d3b24014c6ff 100644 --- a/tools/perf/pmu-events/pmu-events.h +++ b/tools/perf/pmu-events/pmu-events.h @@ -74,6 +74,7 @@ struct pmu_metric { const char *default_metricgroup_name; enum aggr_mode_class aggr_mode; enum metric_event_groups event_grouping; + bool default_show_events; }; =20 struct pmu_events_table; diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index 71f74c7036ef..3ae4ac8f9a37 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -122,6 +122,7 @@ struct evsel { bool reset_group; bool needs_auxtrace_mmap; bool default_metricgroup; /* A member of the Default metricgroup */ + bool default_show_events; /* If a default group member, show the event = */ bool needs_uniquify; struct hashmap *per_pkg_mask; int err; diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c index e67e04ce01c9..25c75fdbfc52 100644 --- a/tools/perf/util/metricgroup.c +++ b/tools/perf/util/metricgroup.c @@ -152,6 +152,8 @@ struct metric { * Should events of the metric be grouped? */ bool group_events; + /** Show events even if in the Default metric group. */ + bool default_show_events; /** * Parsed events for the metric. Optional as events may be taken from a * different metric whose group contains all the IDs necessary for this @@ -255,6 +257,7 @@ static struct metric *metric__new(const struct pmu_metr= ic *pm, m->pctx->sctx.runtime =3D runtime; m->pctx->sctx.system_wide =3D system_wide; m->group_events =3D !metric_no_group && metric__group_events(pm, metric_n= o_threshold); + m->default_show_events =3D pm->default_show_events; m->metric_refs =3D NULL; m->evlist =3D NULL; =20 @@ -1513,6 +1516,16 @@ static int parse_groups(struct evlist *perf_evlist, free(metric_events); goto out; } + if (m->default_show_events) { + struct evsel *pos; + + for (int i =3D 0; metric_events[i]; i++) + metric_events[i]->default_show_events =3D true; + evlist__for_each_entry(metric_evlist, pos) { + if (pos->metric_leader && pos->metric_leader->default_show_events) + pos->default_show_events =3D true; + } + } expr->metric_threshold =3D m->metric_threshold; expr->metric_unit =3D m->metric_unit; expr->metric_events =3D metric_events; diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c index a67b991f4e81..4d0e353846ea 100644 --- a/tools/perf/util/stat-display.c +++ b/tools/perf/util/stat-display.c @@ -872,7 +872,7 @@ static void printout(struct perf_stat_config *config, s= truct outstate *os, out.ctx =3D os; out.force_header =3D false; =20 - if (!config->metric_only && !counter->default_metricgroup) { + if (!config->metric_only && (!counter->default_metricgroup || counter->de= fault_show_events)) { abs_printout(config, os, os->id, os->aggr_nr, counter, uval, ok); =20 print_noise(config, os, counter, noise, /*before_metric=3D*/true); @@ -880,7 +880,7 @@ static void printout(struct perf_stat_config *config, s= truct outstate *os, } =20 if (ok) { - if (!config->metric_only && counter->default_metricgroup) { + if (!config->metric_only && counter->default_metricgroup && !counter->de= fault_show_events) { void *from =3D NULL; =20 aggr_printout(config, os, os->evsel, os->id, os->aggr_nr); diff --git a/tools/perf/util/stat-shadow.c b/tools/perf/util/stat-shadow.c index abaf6b579bfc..4df614f8e200 100644 --- a/tools/perf/util/stat-shadow.c +++ b/tools/perf/util/stat-shadow.c @@ -665,7 +665,7 @@ void *perf_stat__print_shadow_stats_metricgroup(struct = perf_stat_config *config, if (strcmp(name, mexp->default_metricgroup_name)) return (void *)mexp; /* Only print the name of the metricgroup once */ - if (!header_printed) { + if (!header_printed && !evsel->default_show_events) { header_printed =3D true; perf_stat__print_metricgroup_header(config, evsel, ctxp, name, out); --=20 2.51.2.1041.gc1ab5b90ca-goog From nobody Fri Dec 19 17:18:16 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 108F83570DE for ; Thu, 6 Nov 2025 23:15:48 +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=1762470951; cv=none; b=JbQtHj0ACKoaIObhv/6niFEyvlmisU8CxaAVdBXRQVFGJqkdsMlqN+65L3+Dk49+rYB7WUwGbMF0mqrDf0oOi4m5q56jHlQ2neCm2GXODHniXTHX9ue/KFPB3U4Q/pPoNSooluBeTHO06KzLb0Y1/qon2MdUweZoDNe/rktfqNY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470951; c=relaxed/simple; bh=Q0N7mHEajp7CpHSIFL6h/1TOyEKdDpSAGm6uWcXAgSk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=Dgg5sC+aYgfcwmGhLJeaGjNpqae4waLiz6RZWC7wI283BqJPy6r+B/1m6JWt3etsi6jpC7gwOXbyakXrNPVQtx+TJbMHTf7+bdPnRbvHdcRIdZlNtRcXXgdwlbeErv6FsLdXFd5REmvXhosoJUytslfDvA8h+ekV06DXUPgOx8w= 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=Zi1WerjT; 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="Zi1WerjT" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-29523ed27e0so1759385ad.1 for ; Thu, 06 Nov 2025 15:15:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1762470948; x=1763075748; darn=vger.kernel.org; h=content-transfer-encoding:to:from:subject:message-id:references :mime-version:in-reply-to:date:from:to:cc:subject:date:message-id :reply-to; bh=sPtPQ4J4P+ywp9pB0r7lkwULU5SxHoyBfBdCVnJslgs=; b=Zi1WerjTWPN49zeTpJ/Eyx+7gb971ZVOjC7kjGn+GVZKVTWQR/+RxXbBK1CliMo9E2 /XCbC0/XYlVuXzCjqCUm7vqRLdvqh0EzavFvkXT1FUDAuOu4DcXVmoMLsth3zmoOyl5i XPDvlLB8JJuNRmJRc6emwykiudgCKZ9TrstQAyEegk+9iEa2WF0zrlJM7sPmWrkSIwSc 43iF2o2v+12L2HkGwbvVY80+W5CxtVKvGkwGN0yrz/cjvMtxvSk7ho7UNQKirsE3qS9K bMcnd6HIsIshcwA5PkmTrkIJVETnBA0uUcQoAEzoKkTXw2NqV+uFv4SD/hnbyVN2JyU9 H0JQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762470948; x=1763075748; h=content-transfer-encoding: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=sPtPQ4J4P+ywp9pB0r7lkwULU5SxHoyBfBdCVnJslgs=; b=Vi3BCQAmRfSyuVjUZWwtuciGqA8UYhYM41+SXHLY1p8w0e8dnSrLpr2rMZtWEu7SHA yLiEKzn5Gm9wpySSBeBUnvaJ+ozcPHyfi36GpnGlcJjJ5l2Q7tW2xsdLrlJn+7aQyDUY og/hxtvhOcg7XEUradf8BG4VlkBfOXsJ25V6aWfy+MEwRaYOyb0wWK/aynA7hAbwnMf6 1g8WA80EMryOIxM0yE8cAlj8vzPQDXX+ZxIwqn15kr2I98YYqtc3STeVKRohmvBU+um+ Q3AExMLRA4czvnGPFVq9jjk6O/tJLNRx/oWPVMkWh3kaHMH4LPZ8BdiYmQmN3w4idVjQ Z1KQ== X-Forwarded-Encrypted: i=1; AJvYcCVzKdRBZ6qVHz1xn3E2U7MU9/FQE/owe/46j3Z47NTAPU2qk7kP/crz5znAQLMxV/RW1CwL9V1tfJCScNI=@vger.kernel.org X-Gm-Message-State: AOJu0YzWbVCCrTbffPJu5l4ufElFKftiptFKDM5ULLYp1JH5Fhjddgfb 9Dqp5o3fZMx+UKfQKurwZFqp2Kp0zuLWaYHcpcITeW9x4MsFQzqwDQFP2hfDO5UCvRTKwlx3bka uol/0iT099w== X-Google-Smtp-Source: AGHT+IFgspHkzPQud3lsf6qhsPUlMtBDfQ4t4IlKFzgRpIyd300ZfubH6aGgC3NiLmGYUkjY9999nCSEy1/M X-Received: from dlbsw5.prod.google.com ([2002:a05:7022:3a85:b0:119:9f33:34a7]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:c412:b0:295:59ef:df84 with SMTP id d9443c01a7336-297c03a5f79mr15755125ad.3.1762470948349; Thu, 06 Nov 2025 15:15:48 -0800 (PST) Date: Thu, 6 Nov 2025 15:14:55 -0800 In-Reply-To: <20251106231508.448793-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: <20251106231508.448793-1-irogers@google.com> X-Mailer: git-send-email 2.51.2.1041.gc1ab5b90ca-goog Message-ID: <20251106231508.448793-6-irogers@google.com> Subject: [PATCH v2 05/18] perf stat: Add detail -d,-dd,-ddd metrics From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Xu Yang , Chun-Tse Shao , Thomas Richter , Sumanth Korikkar , Collin Funk , Thomas Falcon , Howard Chu , Dapeng Mi , Levi Yun , Yang Li , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Andi Kleen , Weilin Wang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add metrics for the stat-shadow -d, -dd and -ddd events and hard coded metrics. Remove the events as these now come from the metrics. Following this change a detailed perf stat output looks like: ``` $ perf stat -a -ddd -- sleep 1 Performance counter stats for 'system wide': 18,446 context-switches # 653.0 cs/sec = cs_per_second TopdownL1 (cpu_core) # 6.8 % tma_bad_spe= culation # 37.0 % tma_fronten= d_bound (30.32%) TopdownL1 (cpu_core) # 40.1 % tma_backend= _bound # 16.1 % tma_retirin= g (30.32%) 177 page-faults # 6.3 faults/= sec page_faults_per_second 472,170,922 cpu_atom/cpu-cycles/ # 0.0 GHz cy= cles_frequency (28.57%) 656,868,742 cpu_core/cpu-cycles/ # 0.0 GHz cy= cles_frequency (38.24%) # 22.2 % tma_bad_spe= culation # 12.2 % tma_retirin= g (28.55%) # 32.4 % tma_backend= _bound # 33.1 % tma_fronten= d_bound (35.71%) 43,583,604 cpu_atom/branches/ # 1.5 K/sec = branch_frequency (42.85%) 87,140,541 cpu_core/branches/ # 3.1 K/sec = branch_frequency (54.09%) 493 cpu-migrations # 17.5 migrati= ons/sec migrations_per_second 28,247,893,219 cpu-clock # 28.0 CPUs C= PUs_utilized 445,297,600 cpu_atom/cpu-cycles/ # 0.4 instruc= tions insn_per_cycle (42.87%) 642,323,993 cpu_core/cpu-cycles/ # 0.8 instruc= tions insn_per_cycle (62.01%) 2,126,311 cpu_atom/branch-misses/ # 6.8 % bran= ch_miss_rate (35.73%) 2,172,775 cpu_core/branch-misses/ # 2.5 % bran= ch_miss_rate (62.36%) 1,855,042 cpu_atom/LLC-loads/ # 0.0 % llc_= miss_rate (28.56%) 2,671,549 cpu_core/LLC-loads/ # 32.5 % llc_= miss_rate (46.31%) 8,440,231 cpu_core/L1-dcache-load-misses/ # nan % l1d_= miss_rate (37.99%) 10,823,925 cpu_atom/L1-icache-load-misses/ # 19.0 % l1i_= miss_rate (21.43%) 22,602,344 cpu_atom/dTLB-loads/ # 2.0 % dtlb= _miss_rate (21.44%) 136,524,528 cpu_core/dTLB-loads/ # 0.3 % dtlb= _miss_rate (15.06%) 1.007665494 seconds time elapsed ``` Signed-off-by: Ian Rogers --- tools/perf/builtin-stat.c | 100 +++--------------- .../arch/common/common/metrics.json | 54 ++++++++++ tools/perf/pmu-events/empty-pmu-events.c | 72 +++++++------ 3 files changed, 113 insertions(+), 113 deletions(-) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 999c6d587702..0ac3c8906668 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -1857,28 +1857,6 @@ static int perf_stat_init_aggr_mode_file(struct perf= _stat *st) return 0; } =20 -/* Add legacy hardware/hardware-cache event to evlist for all core PMUs wi= thout wildcarding. */ -static int parse_hardware_event(struct evlist *evlist, const char *event, - struct parse_events_error *err) -{ - char buf[256]; - struct perf_pmu *pmu =3D NULL; - - while ((pmu =3D perf_pmus__scan_core(pmu)) !=3D NULL) { - int ret; - - if (perf_pmus__num_core_pmus() =3D=3D 1) - snprintf(buf, sizeof(buf), "%s/%s,name=3D%s/", pmu->name, event, event); - else - snprintf(buf, sizeof(buf), "%s/%s/", pmu->name, event); - - ret =3D parse_events(evlist, buf, err); - if (ret) - return ret; - } - return 0; -} - /* * Add default events, if there were no attributes specified or * if -d/--detailed, -d -d or -d -d -d is used: @@ -2006,22 +1984,34 @@ static int add_default_events(void) * threshold computation, but it will be computed if the events * are present. */ - if (metricgroup__has_metric_or_groups(pmu, "Default")) { - struct evlist *metric_evlist =3D evlist__new(); + const char *default_metricgroup_names[] =3D { + "Default", "Default2", "Default3", "Default4", + }; + + for (size_t i =3D 0; i < ARRAY_SIZE(default_metricgroup_names); i++) { + struct evlist *metric_evlist; + + if (!metricgroup__has_metric_or_groups(pmu, default_metricgroup_names[i= ])) + continue; + + if ((int)i > detailed_run) + break; =20 + metric_evlist =3D evlist__new(); if (!metric_evlist) { ret =3D -ENOMEM; - goto out; + break; } - if (metricgroup__parse_groups(metric_evlist, pmu, "Default", + if (metricgroup__parse_groups(metric_evlist, pmu, default_metricgroup_n= ames[i], /*metric_no_group=3D*/false, /*metric_no_merge=3D*/false, /*metric_no_threshold=3D*/true, stat_config.user_requested_cpu_list, stat_config.system_wide, stat_config.hardware_aware_grouping) < 0) { + evlist__delete(metric_evlist); ret =3D -1; - goto out; + break; } =20 evlist__for_each_entry(metric_evlist, evsel) @@ -2034,62 +2024,6 @@ static int add_default_events(void) evlist__delete(metric_evlist); } } - - /* Detailed events get appended to the event list: */ - - if (!ret && detailed_run >=3D 1) { - /* - * Detailed stats (-d), covering the L1 and last level data - * caches: - */ - const char *hw_events[] =3D { - "L1-dcache-loads", - "L1-dcache-load-misses", - "LLC-loads", - "LLC-load-misses", - }; - - for (size_t i =3D 0; i < ARRAY_SIZE(hw_events); i++) { - ret =3D parse_hardware_event(evlist, hw_events[i], &err); - if (ret) - goto out; - } - } - if (!ret && detailed_run >=3D 2) { - /* - * Very detailed stats (-d -d), covering the instruction cache - * and the TLB caches: - */ - const char *hw_events[] =3D { - "L1-icache-loads", - "L1-icache-load-misses", - "dTLB-loads", - "dTLB-load-misses", - "iTLB-loads", - "iTLB-load-misses", - }; - - for (size_t i =3D 0; i < ARRAY_SIZE(hw_events); i++) { - ret =3D parse_hardware_event(evlist, hw_events[i], &err); - if (ret) - goto out; - } - } - if (!ret && detailed_run >=3D 3) { - /* - * Very, very detailed stats (-d -d -d), adding prefetch events: - */ - const char *hw_events[] =3D { - "L1-dcache-prefetches", - "L1-dcache-prefetch-misses", - }; - - for (size_t i =3D 0; i < ARRAY_SIZE(hw_events); i++) { - ret =3D parse_hardware_event(evlist, hw_events[i], &err); - if (ret) - goto out; - } - } out: if (!ret) { evlist__for_each_entry(evlist, evsel) { diff --git a/tools/perf/pmu-events/arch/common/common/metrics.json b/tools/= perf/pmu-events/arch/common/common/metrics.json index 017bbdede3d7..89d1d9f61014 100644 --- a/tools/perf/pmu-events/arch/common/common/metrics.json +++ b/tools/perf/pmu-events/arch/common/common/metrics.json @@ -93,5 +93,59 @@ "MetricThreshold": "branch_miss_rate > 0.05", "ScaleUnit": "100%", "DefaultShowEvents": "1" + }, + { + "BriefDescription": "L1D miss rate", + "MetricExpr": "L1\\-dcache\\-load\\-misses / L1\\-dcache\\-loads", + "MetricGroup": "Default2", + "MetricName": "l1d_miss_rate", + "MetricThreshold": "l1d_miss_rate > 0.05", + "ScaleUnit": "100%", + "DefaultShowEvents": "1" + }, + { + "BriefDescription": "LLC miss rate", + "MetricExpr": "LLC\\-load\\-misses / LLC\\-loads", + "MetricGroup": "Default2", + "MetricName": "llc_miss_rate", + "MetricThreshold": "llc_miss_rate > 0.05", + "ScaleUnit": "100%", + "DefaultShowEvents": "1" + }, + { + "BriefDescription": "L1I miss rate", + "MetricExpr": "L1\\-icache\\-load\\-misses / L1\\-icache\\-loads", + "MetricGroup": "Default3", + "MetricName": "l1i_miss_rate", + "MetricThreshold": "l1i_miss_rate > 0.05", + "ScaleUnit": "100%", + "DefaultShowEvents": "1" + }, + { + "BriefDescription": "dTLB miss rate", + "MetricExpr": "dTLB\\-load\\-misses / dTLB\\-loads", + "MetricGroup": "Default3", + "MetricName": "dtlb_miss_rate", + "MetricThreshold": "dtlb_miss_rate > 0.05", + "ScaleUnit": "100%", + "DefaultShowEvents": "1" + }, + { + "BriefDescription": "iTLB miss rate", + "MetricExpr": "iTLB\\-load\\-misses / iTLB\\-loads", + "MetricGroup": "Default3", + "MetricName": "itlb_miss_rate", + "MetricThreshold": "itlb_miss_rate > 0.05", + "ScaleUnit": "100%", + "DefaultShowEvents": "1" + }, + { + "BriefDescription": "L1 prefetch miss rate", + "MetricExpr": "L1\\-dcache\\-prefetch\\-misses / L1\\-dcache\\-pre= fetches", + "MetricGroup": "Default4", + "MetricName": "l1_prefetch_miss_rate", + "MetricThreshold": "l1_prefetch_miss_rate > 0.05", + "ScaleUnit": "100%", + "DefaultShowEvents": "1" } ] diff --git a/tools/perf/pmu-events/empty-pmu-events.c b/tools/perf/pmu-even= ts/empty-pmu-events.c index 71464b1d8afe..e882c645fbbe 100644 --- a/tools/perf/pmu-events/empty-pmu-events.c +++ b/tools/perf/pmu-events/empty-pmu-events.c @@ -1314,21 +1314,27 @@ static const char *const big_c_string =3D /* offset=3D129185 */ "cycles_frequency\000Default\000cpu\\-cycles / (soft= ware@cpu\\-clock\\,name\\=3Dcpu\\-clock@ if #target_cpu else software@task\= \-clock\\,name\\=3Dtask\\-clock@)\000\000Cycles per CPU second\000\0001GHz\= 000\000\000\000011" /* offset=3D129361 */ "branch_frequency\000Default\000branches / (software= @cpu\\-clock\\,name\\=3Dcpu\\-clock@ if #target_cpu else software@task\\-cl= ock\\,name\\=3Dtask\\-clock@)\000\000Branches per CPU second\000\0001000K/s= ec\000\000\000\000011" /* offset=3D129541 */ "branch_miss_rate\000Default\000branch\\-misses / br= anches\000branch_miss_rate > 0.05\000Branch miss rate\000\000100%\000\000\0= 00\000001" -/* offset=3D129645 */ "CPI\000\0001 / IPC\000\000\000\000\000\000\000\0000= 00" -/* offset=3D129668 */ "IPC\000group1\000inst_retired.any / cpu_clk_unhalte= d.thread\000\000\000\000\000\000\000\000000" -/* offset=3D129732 */ "Frontend_Bound_SMT\000\000idq_uops_not_delivered.co= re / (4 * (cpu_clk_unhalted.thread / 2 * (1 + cpu_clk_unhalted.one_thread_a= ctive / cpu_clk_unhalted.ref_xclk)))\000\000\000\000\000\000\000\000000" -/* offset=3D129899 */ "dcache_miss_cpi\000\000l1d\\-loads\\-misses / inst_= retired.any\000\000\000\000\000\000\000\000000" -/* offset=3D129964 */ "icache_miss_cycles\000\000l1i\\-loads\\-misses / in= st_retired.any\000\000\000\000\000\000\000\000000" -/* offset=3D130032 */ "cache_miss_cycles\000group1\000dcache_miss_cpi + ic= ache_miss_cycles\000\000\000\000\000\000\000\000000" -/* offset=3D130104 */ "DCache_L2_All_Hits\000\000l2_rqsts.demand_data_rd_h= it + l2_rqsts.pf_hit + l2_rqsts.rfo_hit\000\000\000\000\000\000\000\000000" -/* offset=3D130199 */ "DCache_L2_All_Miss\000\000max(l2_rqsts.all_demand_d= ata_rd - l2_rqsts.demand_data_rd_hit, 0) + l2_rqsts.pf_miss + l2_rqsts.rfo_= miss\000\000\000\000\000\000\000\000000" -/* offset=3D130334 */ "DCache_L2_All\000\000DCache_L2_All_Hits + DCache_L2= _All_Miss\000\000\000\000\000\000\000\000000" -/* offset=3D130399 */ "DCache_L2_Hits\000\000d_ratio(DCache_L2_All_Hits, D= Cache_L2_All)\000\000\000\000\000\000\000\000000" -/* offset=3D130468 */ "DCache_L2_Misses\000\000d_ratio(DCache_L2_All_Miss,= DCache_L2_All)\000\000\000\000\000\000\000\000000" -/* offset=3D130539 */ "M1\000\000ipc + M2\000\000\000\000\000\000\000\0000= 00" -/* offset=3D130562 */ "M2\000\000ipc + M1\000\000\000\000\000\000\000\0000= 00" -/* offset=3D130585 */ "M3\000\0001 / M3\000\000\000\000\000\000\000\000000" -/* offset=3D130606 */ "L1D_Cache_Fill_BW\000\00064 * l1d.replacement / 1e9= / duration_time\000\000\000\000\000\000\000\000000" +/* offset=3D129645 */ "l1d_miss_rate\000Default2\000L1\\-dcache\\-load\\-m= isses / L1\\-dcache\\-loads\000l1d_miss_rate > 0.05\000L1D miss rate\000\0= 00100%\000\000\000\000001" +/* offset=3D129761 */ "llc_miss_rate\000Default2\000LLC\\-load\\-misses / = LLC\\-loads\000llc_miss_rate > 0.05\000LLC miss rate\000\000100%\000\000\00= 0\000001" +/* offset=3D129862 */ "l1i_miss_rate\000Default3\000L1\\-icache\\-load\\-m= isses / L1\\-icache\\-loads\000l1i_miss_rate > 0.05\000L1I miss rate\000\00= 0100%\000\000\000\000001" +/* offset=3D129977 */ "dtlb_miss_rate\000Default3\000dTLB\\-load\\-misses = / dTLB\\-loads\000dtlb_miss_rate > 0.05\000dTLB miss rate\000\000100%\000\0= 00\000\000001" +/* offset=3D130083 */ "itlb_miss_rate\000Default3\000iTLB\\-load\\-misses = / iTLB\\-loads\000itlb_miss_rate > 0.05\000iTLB miss rate\000\000100%\000\0= 00\000\000001" +/* offset=3D130189 */ "l1_prefetch_miss_rate\000Default4\000L1\\-dcache\\-= prefetch\\-misses / L1\\-dcache\\-prefetches\000l1_prefetch_miss_rate > 0.0= 5\000L1 prefetch miss rate\000\000100%\000\000\000\000001" +/* offset=3D130337 */ "CPI\000\0001 / IPC\000\000\000\000\000\000\000\0000= 00" +/* offset=3D130360 */ "IPC\000group1\000inst_retired.any / cpu_clk_unhalte= d.thread\000\000\000\000\000\000\000\000000" +/* offset=3D130424 */ "Frontend_Bound_SMT\000\000idq_uops_not_delivered.co= re / (4 * (cpu_clk_unhalted.thread / 2 * (1 + cpu_clk_unhalted.one_thread_a= ctive / cpu_clk_unhalted.ref_xclk)))\000\000\000\000\000\000\000\000000" +/* offset=3D130591 */ "dcache_miss_cpi\000\000l1d\\-loads\\-misses / inst_= retired.any\000\000\000\000\000\000\000\000000" +/* offset=3D130656 */ "icache_miss_cycles\000\000l1i\\-loads\\-misses / in= st_retired.any\000\000\000\000\000\000\000\000000" +/* offset=3D130724 */ "cache_miss_cycles\000group1\000dcache_miss_cpi + ic= ache_miss_cycles\000\000\000\000\000\000\000\000000" +/* offset=3D130796 */ "DCache_L2_All_Hits\000\000l2_rqsts.demand_data_rd_h= it + l2_rqsts.pf_hit + l2_rqsts.rfo_hit\000\000\000\000\000\000\000\000000" +/* offset=3D130891 */ "DCache_L2_All_Miss\000\000max(l2_rqsts.all_demand_d= ata_rd - l2_rqsts.demand_data_rd_hit, 0) + l2_rqsts.pf_miss + l2_rqsts.rfo_= miss\000\000\000\000\000\000\000\000000" +/* offset=3D131026 */ "DCache_L2_All\000\000DCache_L2_All_Hits + DCache_L2= _All_Miss\000\000\000\000\000\000\000\000000" +/* offset=3D131091 */ "DCache_L2_Hits\000\000d_ratio(DCache_L2_All_Hits, D= Cache_L2_All)\000\000\000\000\000\000\000\000000" +/* offset=3D131160 */ "DCache_L2_Misses\000\000d_ratio(DCache_L2_All_Miss,= DCache_L2_All)\000\000\000\000\000\000\000\000000" +/* offset=3D131231 */ "M1\000\000ipc + M2\000\000\000\000\000\000\000\0000= 00" +/* offset=3D131254 */ "M2\000\000ipc + M1\000\000\000\000\000\000\000\0000= 00" +/* offset=3D131277 */ "M3\000\0001 / M3\000\000\000\000\000\000\000\000000" +/* offset=3D131298 */ "L1D_Cache_Fill_BW\000\00064 * l1d.replacement / 1e9= / duration_time\000\000\000\000\000\000\000\000000" ; =20 static const struct compact_pmu_event pmu_events__common_default_core[] = =3D { @@ -2621,8 +2627,14 @@ static const struct compact_pmu_event pmu_metrics__c= ommon_default_core[] =3D { { 129541 }, /* branch_miss_rate\000Default\000branch\\-misses / branches\0= 00branch_miss_rate > 0.05\000Branch miss rate\000\000100%\000\000\000\00000= 1 */ { 127928 }, /* cs_per_second\000Default\000software@context\\-switches\\,n= ame\\=3Dcontext\\-switches@ * 1e9 / (software@cpu\\-clock\\,name\\=3Dcpu\\-= clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\-clock@)\= 000\000Context switches per CPU second\000\0001cs/sec\000\000\000\000011 */ { 129185 }, /* cycles_frequency\000Default\000cpu\\-cycles / (software@cpu= \\-clock\\,name\\=3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\= \,name\\=3Dtask\\-clock@)\000\000Cycles per CPU second\000\0001GHz\000\000\= 000\000011 */ +{ 129977 }, /* dtlb_miss_rate\000Default3\000dTLB\\-load\\-misses / dTLB\\= -loads\000dtlb_miss_rate > 0.05\000dTLB miss rate\000\000100%\000\000\000\0= 00001 */ { 128929 }, /* frontend_cycles_idle\000Default\000stalled\\-cycles\\-front= end / cpu\\-cycles\000frontend_cycles_idle > 0.1\000Frontend stalls per cyc= le\000\000\000\000\000\000001 */ { 128652 }, /* insn_per_cycle\000Default\000instructions / cpu\\-cycles\00= 0insn_per_cycle < 1\000Instructions Per Cycle\000\0001instructions\000\000\= 000\000001 */ +{ 130083 }, /* itlb_miss_rate\000Default3\000iTLB\\-load\\-misses / iTLB\\= -loads\000itlb_miss_rate > 0.05\000iTLB miss rate\000\000100%\000\000\000\0= 00001 */ +{ 130189 }, /* l1_prefetch_miss_rate\000Default4\000L1\\-dcache\\-prefetch= \\-misses / L1\\-dcache\\-prefetches\000l1_prefetch_miss_rate > 0.05\000L1 = prefetch miss rate\000\000100%\000\000\000\000001 */ +{ 129645 }, /* l1d_miss_rate\000Default2\000L1\\-dcache\\-load\\-misses / = L1\\-dcache\\-loads\000l1d_miss_rate > 0.05\000L1D miss rate\000\000100%\0= 00\000\000\000001 */ +{ 129862 }, /* l1i_miss_rate\000Default3\000L1\\-icache\\-load\\-misses / = L1\\-icache\\-loads\000l1i_miss_rate > 0.05\000L1I miss rate\000\000100%\00= 0\000\000\000001 */ +{ 129761 }, /* llc_miss_rate\000Default2\000LLC\\-load\\-misses / LLC\\-lo= ads\000llc_miss_rate > 0.05\000LLC miss rate\000\000100%\000\000\000\000001= */ { 128161 }, /* migrations_per_second\000Default\000software@cpu\\-migratio= ns\\,name\\=3Dcpu\\-migrations@ * 1e9 / (software@cpu\\-clock\\,name\\=3Dcp= u\\-clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\-cloc= k@)\000\000Process migrations to a new CPU per CPU second\000\0001migration= s/sec\000\000\000\000011 */ { 128421 }, /* page_faults_per_second\000Default\000software@page\\-faults= \\,name\\=3Dpage\\-faults@ * 1e9 / (software@cpu\\-clock\\,name\\=3Dcpu\\-c= lock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\-clock@)\0= 00\000Page faults per CPU second\000\0001faults/sec\000\000\000\000011 */ { 128765 }, /* stalled_cycles_per_instruction\000Default\000max(stalled\\-= cycles\\-frontend, stalled\\-cycles\\-backend) / instructions\000\000Max fr= ont or backend stalls per instruction\000\000\000\000\000\000001 */ @@ -2698,21 +2710,21 @@ static const struct pmu_table_entry pmu_events__tes= t_soc_cpu[] =3D { }; =20 static const struct compact_pmu_event pmu_metrics__test_soc_cpu_default_co= re[] =3D { -{ 129645 }, /* CPI\000\0001 / IPC\000\000\000\000\000\000\000\000000 */ -{ 130334 }, /* DCache_L2_All\000\000DCache_L2_All_Hits + DCache_L2_All_Mis= s\000\000\000\000\000\000\000\000000 */ -{ 130104 }, /* DCache_L2_All_Hits\000\000l2_rqsts.demand_data_rd_hit + l2_= rqsts.pf_hit + l2_rqsts.rfo_hit\000\000\000\000\000\000\000\000000 */ -{ 130199 }, /* DCache_L2_All_Miss\000\000max(l2_rqsts.all_demand_data_rd -= l2_rqsts.demand_data_rd_hit, 0) + l2_rqsts.pf_miss + l2_rqsts.rfo_miss\000= \000\000\000\000\000\000\000000 */ -{ 130399 }, /* DCache_L2_Hits\000\000d_ratio(DCache_L2_All_Hits, DCache_L2= _All)\000\000\000\000\000\000\000\000000 */ -{ 130468 }, /* DCache_L2_Misses\000\000d_ratio(DCache_L2_All_Miss, DCache_= L2_All)\000\000\000\000\000\000\000\000000 */ -{ 129732 }, /* Frontend_Bound_SMT\000\000idq_uops_not_delivered.core / (4 = * (cpu_clk_unhalted.thread / 2 * (1 + cpu_clk_unhalted.one_thread_active / = cpu_clk_unhalted.ref_xclk)))\000\000\000\000\000\000\000\000000 */ -{ 129668 }, /* IPC\000group1\000inst_retired.any / cpu_clk_unhalted.thread= \000\000\000\000\000\000\000\000000 */ -{ 130606 }, /* L1D_Cache_Fill_BW\000\00064 * l1d.replacement / 1e9 / durat= ion_time\000\000\000\000\000\000\000\000000 */ -{ 130539 }, /* M1\000\000ipc + M2\000\000\000\000\000\000\000\000000 */ -{ 130562 }, /* M2\000\000ipc + M1\000\000\000\000\000\000\000\000000 */ -{ 130585 }, /* M3\000\0001 / M3\000\000\000\000\000\000\000\000000 */ -{ 130032 }, /* cache_miss_cycles\000group1\000dcache_miss_cpi + icache_mis= s_cycles\000\000\000\000\000\000\000\000000 */ -{ 129899 }, /* dcache_miss_cpi\000\000l1d\\-loads\\-misses / inst_retired.= any\000\000\000\000\000\000\000\000000 */ -{ 129964 }, /* icache_miss_cycles\000\000l1i\\-loads\\-misses / inst_retir= ed.any\000\000\000\000\000\000\000\000000 */ +{ 130337 }, /* CPI\000\0001 / IPC\000\000\000\000\000\000\000\000000 */ +{ 131026 }, /* DCache_L2_All\000\000DCache_L2_All_Hits + DCache_L2_All_Mis= s\000\000\000\000\000\000\000\000000 */ +{ 130796 }, /* DCache_L2_All_Hits\000\000l2_rqsts.demand_data_rd_hit + l2_= rqsts.pf_hit + l2_rqsts.rfo_hit\000\000\000\000\000\000\000\000000 */ +{ 130891 }, /* DCache_L2_All_Miss\000\000max(l2_rqsts.all_demand_data_rd -= l2_rqsts.demand_data_rd_hit, 0) + l2_rqsts.pf_miss + l2_rqsts.rfo_miss\000= \000\000\000\000\000\000\000000 */ +{ 131091 }, /* DCache_L2_Hits\000\000d_ratio(DCache_L2_All_Hits, DCache_L2= _All)\000\000\000\000\000\000\000\000000 */ +{ 131160 }, /* DCache_L2_Misses\000\000d_ratio(DCache_L2_All_Miss, DCache_= L2_All)\000\000\000\000\000\000\000\000000 */ +{ 130424 }, /* Frontend_Bound_SMT\000\000idq_uops_not_delivered.core / (4 = * (cpu_clk_unhalted.thread / 2 * (1 + cpu_clk_unhalted.one_thread_active / = cpu_clk_unhalted.ref_xclk)))\000\000\000\000\000\000\000\000000 */ +{ 130360 }, /* IPC\000group1\000inst_retired.any / cpu_clk_unhalted.thread= \000\000\000\000\000\000\000\000000 */ +{ 131298 }, /* L1D_Cache_Fill_BW\000\00064 * l1d.replacement / 1e9 / durat= ion_time\000\000\000\000\000\000\000\000000 */ +{ 131231 }, /* M1\000\000ipc + M2\000\000\000\000\000\000\000\000000 */ +{ 131254 }, /* M2\000\000ipc + M1\000\000\000\000\000\000\000\000000 */ +{ 131277 }, /* M3\000\0001 / M3\000\000\000\000\000\000\000\000000 */ +{ 130724 }, /* cache_miss_cycles\000group1\000dcache_miss_cpi + icache_mis= s_cycles\000\000\000\000\000\000\000\000000 */ +{ 130591 }, /* dcache_miss_cpi\000\000l1d\\-loads\\-misses / inst_retired.= any\000\000\000\000\000\000\000\000000 */ +{ 130656 }, /* icache_miss_cycles\000\000l1i\\-loads\\-misses / inst_retir= ed.any\000\000\000\000\000\000\000\000000 */ =20 }; =20 --=20 2.51.2.1041.gc1ab5b90ca-goog From nobody Fri Dec 19 17:18:16 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 3B09335771B for ; Thu, 6 Nov 2025 23:15:51 +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=1762470953; cv=none; b=We8T76TLgyMM5YiWns+3xJO8uLhkw5GnHFPWZIrj7nY+J2WVtQ3kbb5zKaeQ2OIKMY+g5RRJ2R0TMnLf4fhAHT3WMCrKOXHECytVmxDIgWWR5qSKV3jW1mhjWWs8eOB8Og42vx8kZpyNU5YH44rsdj0ayDFJTbnJ0Sa9w5g52Zw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470953; c=relaxed/simple; bh=cRYjlGXMy8oFKWbC/hWw5ZYHF+VQE/hNjMg+FDceiog=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=GH0sdKhdEoloP28SL5krY3YOxuaNv5WixwdDUzNCAWGLwLSFuyeM+SVX7E+loXPql2hcRnLDOAn11ZSLy3coCrmW0rRhze4btT5+r4Sk7Ns9xSu2SlpnVmlt4owEDeiIkkl8MWjta/H/ODrvtoQluOmHWmBXTJM7h4+/Kj04NZQ= 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=ofuV6ObB; 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="ofuV6ObB" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-27c62320f16so2202335ad.1 for ; Thu, 06 Nov 2025 15:15:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1762470950; x=1763075750; 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=QeOSGX6zjeJxTypp9mNQ3u5K3XQByXMA15Am7ZgQNdA=; b=ofuV6ObBPPmqWezc9jqmUBwx/D1hdqxpfmswjvGciCrbSodtpoYGeeJA+ITiU3jg1e PLQkSysTDfY3Oz2Pzaubu/tTe4oYvlQZUr0UGc4qo9r+Ld+EgfdJpPNl8uS/bRH3B78S Cv6eS1KddLsO8ShVrNoj1CHNlLt5JDb9dDN2riH0zJOURKcSw8RSkq+YL+WZNY/3wz5A s9XU5qh5IeR+V9TRM7C5J46UxNalFwNkJBwVeG1i2/cLVXIHqr3i5nZEBj7iGOCbk5sh 5elf69XW72c7JJLvgk7JvytzzbcNKLh0Tz362ok5chu1oivsKUglNQzNOt7JJtTBeTn+ Ehow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762470950; x=1763075750; 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=QeOSGX6zjeJxTypp9mNQ3u5K3XQByXMA15Am7ZgQNdA=; b=MiL9+sCqTJrvkiCzpxvWSHE6GmpTWHfm2VKkN2N8PPOX63FkKRrFyindG0C1Qxsz8E obAOKBLdote2DXDh6RGBsHllkNgJSPC5dz1y8UkUQh064aMv3QKxiVQbkc/BVH3bKXks wN8qY2hN5tdJ0YR91wC1HwiF1t7f+xaV8qpkdKg8VKMiT6Fdc+wKcgK50pS4QTnLsimS s2PDsEtYCiG9syMWFUbC8rlrjdbnoLH50dKJhbcV63mpHifUnjQMc6q50ZLaAAsWjPlm Z1H1APcWwznHUyRI34oOyvjX5rFtHUK7/kkFCym4OUASQ59Ycr4JGbsDTjmFjNvAZyaq CR1Q== X-Forwarded-Encrypted: i=1; AJvYcCVqphzXtWj4zzJmiEmY2J8+5dty/GHQlCljKZoTOK5lW/pHTjIrw+oF06Q4Xolew8Hqw1c1OJMeSgv55Ds=@vger.kernel.org X-Gm-Message-State: AOJu0Yy0VtrD/pjykoQ3MBUKf47WtKjAKzrgsQDCwLNQW1VJbY2uCSR7 z8cueS69vJpuFxIYQkWkzeIFCSD0rW/xbJGVsbfxaxFzv0cNVnhcWIAQnbvdZOJMqiqNnjpiCmO mmXSjPEQBxA== X-Google-Smtp-Source: AGHT+IF/UbMhF3+WWa6D4TdUv6rq/CTKUNnCLtxyY13BiT7s7oZAEYlLl9dPSiKMhw4tzrUECRFgGqM8F73X X-Received: from dlbur20.prod.google.com ([2002:a05:7022:ea54:b0:119:49ca:6b97]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:e801:b0:295:3eb5:6de8 with SMTP id d9443c01a7336-297c0386bffmr13308855ad.12.1762470950290; Thu, 06 Nov 2025 15:15:50 -0800 (PST) Date: Thu, 6 Nov 2025 15:14:56 -0800 In-Reply-To: <20251106231508.448793-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: <20251106231508.448793-1-irogers@google.com> X-Mailer: git-send-email 2.51.2.1041.gc1ab5b90ca-goog Message-ID: <20251106231508.448793-7-irogers@google.com> Subject: [PATCH v2 06/18] perf script: Change metric format to use json metrics From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Xu Yang , Chun-Tse Shao , Thomas Richter , Sumanth Korikkar , Collin Funk , Thomas Falcon , Howard Chu , Dapeng Mi , Levi Yun , Yang Li , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Andi Kleen , Weilin Wang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The metric format option isn't properly supported. This change improves that by making the sample events update the counts of an evsel, where the shadow metric code expects to read the values. To support printing metrics, metrics need to be found. This is done on the first attempt to print a metric. Every metric is parsed and then the evsels in the metric's evlist compared to those in perf script using the perf_event_attr type and config. If the metric matches then it is added for printing. As an event in the perf script's evlist may have >1 metric id, or different leader for aggregation, the first metric matched will be displayed in those cases. An example use is: ``` $ perf record -a -e '{instructions,cpu-cycles}:S' -a -- sleep 1 $ perf script -F period,metric ... 867817 metric: 0.30 insn per cycle 125394 metric: 0.04 insn per cycle 313516 metric: 0.11 insn per cycle metric: 1.00 insn per cycle ``` Signed-off-by: Ian Rogers --- tools/perf/builtin-script.c | 239 ++++++++++++++++++++++++++++++++---- 1 file changed, 217 insertions(+), 22 deletions(-) diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index 8124fcb51da9..e24c3d9e01a8 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -33,6 +33,7 @@ #include "util/path.h" #include "util/event.h" #include "util/mem-info.h" +#include "util/metricgroup.h" #include "ui/ui.h" #include "print_binary.h" #include "print_insn.h" @@ -341,9 +342,6 @@ struct evsel_script { char *filename; FILE *fp; u64 samples; - /* For metric output */ - u64 val; - int gnum; }; =20 static inline struct evsel_script *evsel_script(struct evsel *evsel) @@ -2132,13 +2130,161 @@ static void script_new_line(struct perf_stat_confi= g *config __maybe_unused, fputs("\tmetric: ", mctx->fp); } =20 -static void perf_sample__fprint_metric(struct perf_script *script, - struct thread *thread, +struct script_find_metrics_args { + struct evlist *evlist; + bool system_wide; +}; + +static struct evsel *map_metric_evsel_to_script_evsel(struct evlist *scrip= t_evlist, + struct evsel *metric_evsel) +{ + struct evsel *script_evsel; + + evlist__for_each_entry(script_evlist, script_evsel) { + /* Skip if perf_event_attr differ. */ + if (metric_evsel->core.attr.type !=3D script_evsel->core.attr.type) + continue; + if (metric_evsel->core.attr.config !=3D script_evsel->core.attr.config) + continue; + /* Skip if the script event has a metric_id that doesn't match. */ + if (script_evsel->metric_id && + strcmp(evsel__metric_id(metric_evsel), evsel__metric_id(script_evsel= ))) { + pr_debug("Skipping matching evsel due to differing metric ids '%s' vs '= %s'\n", + evsel__metric_id(metric_evsel), evsel__metric_id(script_evsel)); + continue; + } + return script_evsel; + } + return NULL; +} + +static int script_find_metrics(const struct pmu_metric *pm, + const struct pmu_metrics_table *table __maybe_unused, + void *data) +{ + struct script_find_metrics_args *args =3D data; + struct evlist *script_evlist =3D args->evlist; + struct evlist *metric_evlist =3D evlist__new(); + struct evsel *metric_evsel; + int ret =3D metricgroup__parse_groups(metric_evlist, + /*pmu=3D*/"all", + pm->metric_name, + /*metric_no_group=3D*/false, + /*metric_no_merge=3D*/false, + /*metric_no_threshold=3D*/true, + /*user_requested_cpu_list=3D*/NULL, + args->system_wide, + /*hardware_aware_grouping=3D*/false); + + if (ret) { + /* Metric parsing failed but continue the search. */ + goto out; + } + + /* + * Check the script_evlist has an entry for each metric_evlist entry. If + * the script evsel was already set up avoid changing data that may + * break it. + */ + evlist__for_each_entry(metric_evlist, metric_evsel) { + struct evsel *script_evsel =3D + map_metric_evsel_to_script_evsel(script_evlist, metric_evsel); + struct evsel *new_metric_leader; + + if (!script_evsel) { + pr_debug("Skipping metric '%s' as evsel '%s' / '%s' is missing\n", + pm->metric_name, evsel__name(metric_evsel), + evsel__metric_id(metric_evsel)); + goto out; + } + + if (script_evsel->metric_leader =3D=3D NULL) + continue; + + if (metric_evsel->metric_leader =3D=3D metric_evsel) { + new_metric_leader =3D script_evsel; + } else { + new_metric_leader =3D + map_metric_evsel_to_script_evsel(script_evlist, + metric_evsel->metric_leader); + } + /* Mismatching evsel leaders. */ + if (script_evsel->metric_leader !=3D new_metric_leader) { + pr_debug("Skipping metric '%s' due to mismatching evsel metric leaders = '%s' vs '%s'\n", + pm->metric_name, evsel__metric_id(metric_evsel), + evsel__metric_id(script_evsel)); + goto out; + } + } + /* + * Metric events match those in the script evlist, copy metric evsel + * data into the script evlist. + */ + evlist__for_each_entry(metric_evlist, metric_evsel) { + struct evsel *script_evsel =3D + map_metric_evsel_to_script_evsel(script_evlist, metric_evsel); + struct metric_event *metric_me =3D metricgroup__lookup(&metric_evlist->m= etric_events, + metric_evsel, + /*create=3D*/false); + + if (script_evsel->metric_id =3D=3D NULL) { + script_evsel->metric_id =3D metric_evsel->metric_id; + metric_evsel->metric_id =3D NULL; + } + + if (script_evsel->metric_leader =3D=3D NULL) { + if (metric_evsel->metric_leader =3D=3D metric_evsel) { + script_evsel->metric_leader =3D script_evsel; + } else { + script_evsel->metric_leader =3D + map_metric_evsel_to_script_evsel(script_evlist, + metric_evsel->metric_leader); + } + } + + if (metric_me) { + struct metric_expr *expr; + struct metric_event *script_me =3D + metricgroup__lookup(&script_evlist->metric_events, + script_evsel, + /*create=3D*/true); + + if (!script_me) { + /* + * As the metric_expr is created, the only + * failure is a lack of memory. + */ + goto out; + } + list_splice_init(&metric_me->head, &script_me->head); + list_for_each_entry(expr, &script_me->head, nd) { + for (int i =3D 0; expr->metric_events[i]; i++) { + expr->metric_events[i] =3D + map_metric_evsel_to_script_evsel(script_evlist, + expr->metric_events[i]); + } + } + } + } + pr_debug("Found metric '%s' whose evsels match those of in the perf data\= n", + pm->metric_name); + evlist__delete(metric_evlist); +out: + return 0; +} + +static struct aggr_cpu_id script_aggr_cpu_id_get(struct perf_stat_config *= config __maybe_unused, + struct perf_cpu cpu) +{ + return aggr_cpu_id__global(cpu, /*data=3D*/NULL); +} + +static void perf_sample__fprint_metric(struct thread *thread, struct evsel *evsel, struct perf_sample *sample, FILE *fp) { - struct evsel *leader =3D evsel__leader(evsel); + static bool init_metrics; struct perf_stat_output_ctx ctx =3D { .print_metric =3D script_print_metric, .new_line =3D script_new_line, @@ -2150,23 +2296,72 @@ static void perf_sample__fprint_metric(struct perf_= script *script, }, .force_header =3D false, }; - struct evsel *ev2; - u64 val; + struct perf_counts_values *count, *old_count; + int cpu_map_idx, thread_map_idx, aggr_idx; + struct evsel *pos; + + if (!init_metrics) { + /* One time initialization of stat_config and metric data. */ + struct script_find_metrics_args args =3D { + .evlist =3D evsel->evlist, + /* TODO: Determine system-wide based on evlist.. */ + .system_wide =3D true, + }; + if (!stat_config.output) + stat_config.output =3D stdout; + + if (!stat_config.aggr_map) { + /* TODO: currently only global aggregation is supported. */ + assert(stat_config.aggr_mode =3D=3D AGGR_GLOBAL); + stat_config.aggr_get_id =3D script_aggr_cpu_id_get; + stat_config.aggr_map =3D + cpu_aggr_map__new(evsel->evlist->core.user_requested_cpus, + aggr_cpu_id__global, /*data=3D*/NULL, + /*needs_sort=3D*/false); + } =20 - if (!evsel->stats) - evlist__alloc_stats(&stat_config, script->session->evlist, /*alloc_raw= =3D*/false); - if (evsel_script(leader)->gnum++ =3D=3D 0) - perf_stat__reset_shadow_stats(); - val =3D sample->period * evsel->scale; - evsel_script(evsel)->val =3D val; - if (evsel_script(leader)->gnum =3D=3D leader->core.nr_members) { - for_each_group_member (ev2, leader) { - perf_stat__print_shadow_stats(&stat_config, ev2, - evsel_script(ev2)->val, - sample->cpu, - &ctx); + metricgroup__for_each_metric(pmu_metrics_table__find(), script_find_metr= ics, &args); + init_metrics =3D true; + } + + if (!evsel->stats) { + if (evlist__alloc_stats(&stat_config, evsel->evlist, /*alloc_raw=3D*/tru= e) < 0) + return; + } + if (!evsel->stats->aggr) { + if (evlist__alloc_aggr_stats(evsel->evlist, stat_config.aggr_map->nr) < = 0) + return; + } + + /* Update the evsel's count using the sample's data. */ + cpu_map_idx =3D perf_cpu_map__idx(evsel->core.cpus, (struct perf_cpu){sam= ple->cpu}); + thread_map_idx =3D perf_thread_map__idx(evsel->core.threads, sample->tid); + if (thread_map_idx < 0) { + /* Missing thread, check for any thread. */ + if (perf_thread_map__pid(evsel->core.threads, /*idx=3D*/0) =3D=3D -1) { + thread_map_idx =3D 0; + } else { + pr_info("Missing thread map entry for thread %d\n", sample->tid); + return; + } + } + count =3D perf_counts(evsel->counts, cpu_map_idx, thread_map_idx); + old_count =3D perf_counts(evsel->prev_raw_counts, cpu_map_idx, thread_map= _idx); + count->val =3D old_count->val + sample->period; + count->run =3D old_count->run + 1; + count->ena =3D old_count->ena + 1; + + /* Update the aggregated stats. */ + perf_stat_process_counter(&stat_config, evsel); + + /* Display all metrics. */ + evlist__for_each_entry(evsel->evlist, pos) { + cpu_aggr_map__for_each_idx(aggr_idx, stat_config.aggr_map) { + perf_stat__print_shadow_stats(&stat_config, pos, + count->val, + aggr_idx, + &ctx); } - evsel_script(leader)->gnum =3D 0; } } =20 @@ -2348,7 +2543,7 @@ static void process_event(struct perf_script *script, } =20 if (PRINT_FIELD(METRIC)) - perf_sample__fprint_metric(script, thread, evsel, sample, fp); + perf_sample__fprint_metric(thread, evsel, sample, fp); =20 if (verbose > 0) fflush(fp); --=20 2.51.2.1041.gc1ab5b90ca-goog From nobody Fri Dec 19 17:18:16 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 0D23E357708 for ; Thu, 6 Nov 2025 23:15:52 +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=1762470955; cv=none; b=VZSOzFgvu3f6TBVsot0vPXWyw4BC5kdYCJqQ2ua/r4YTIVDks4gZ5dS3cJ0wp1BAYElew2wCRfBAGXh94uSdEBmYb5XTCxEFWXA4QgRpl9c+mLXePxGeUV2WqJRbxrMuCIEM/KKGxBYgqpXr87wsu1S6udyj4h9f4yBia3/3GGQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470955; c=relaxed/simple; bh=3E9wfGv9PEXnn5shTNvkeIBmNV0ywFljmbQlUe8NPMw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=f4CDSSkY8bRf76tkJu0He5wTSGQ1+fpQLuG/W39547X2ltw9xyPn+eKhUma8HjqFMXDWzIWxX9B7p8x6gjOxPWxRJ5EusEcz/6dEAFFUN/mivYj99BuUYbBljfHaB97e9iMtHh+zQRhR6ewa/SxMVY0taV5CvIybr160uxNHMaM= 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=shpQHEgT; 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="shpQHEgT" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2958a134514so1827435ad.2 for ; Thu, 06 Nov 2025 15:15:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1762470952; x=1763075752; 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=EQWWs18Tf82l9vd7uc3cmYkO6mjNYPE1n+OwWs9yhfs=; b=shpQHEgThbo9zuyqB7scR4tONG01SMRWoYlCEbWMZf26Ov0MktE3GunXbXRWXKgVpp Upvpjprq1l31JuF/53kUPfDw2046QXt2IHZA4HN70s3+AGKi6s+MxL8DL4DZxDA1rvSC FrT8r38SQejo1Z/9Jt4tyG2Y6/9pLL7jPsQLLkDZKhYBjL5y2dhWlkn65JnwdM/1rBxL vMrAR20ER972VPVDIQ9+6s/tQ44NelIRVCbJ8HOUzV6RAzra6Xbpgpq7oGXirPpMmjN/ NteHKq1w1InFWcTJCT62Bud4jkt0rKZC5riLMNrvjzWzICW5GP6zNLO7Y621EiN2fCJ2 wbsA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762470952; x=1763075752; 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=EQWWs18Tf82l9vd7uc3cmYkO6mjNYPE1n+OwWs9yhfs=; b=GcFfRYdCNl0IGWw6avxj9YYi6G1H0HVN5r21gcZ9KdFtaqUkpCoopi/TGi+YIyEvnn VjJiwSKukKz2109hmVk61AnWVPRZDDcuFAsWf9W9AGfPkqxjajrVRU7ofihXoC3MS67x mBbT5S8pZUQfOt9wGF6UE2rpfh5or8Zn/Tx+4NAsPDpq7m65WnG1jbOUM9iPmptle5YU qbRMU7U082eYCgMBmNvhoDRcEz6oquVGEPg8csy5FgOZzrOvdkkzsZzrch7gdEGIUzNv HjQJystpVIEB2VwpnxhitlVIgFXrJibWEKNIWqxcjzNx3Ls5kUCMLqm/9OGkT/SVYC0I mvkQ== X-Forwarded-Encrypted: i=1; AJvYcCXJMr6ABDo6Pkl8WPekR3RVRoTuXcRAdyHhKrEgdoG9mx2kfregbX85lLzTgKuYi+y0Vyz4wZOqGNzFnBs=@vger.kernel.org X-Gm-Message-State: AOJu0Yzon5OhKhd2B/WtImUQVQFO7yu8DzA11xrdIDbjvM8lkD+G4uuo PJZ+M3n6Zo2kbJobndSBCuHoURH/W+HqasLYvd+iN0be7YzWQRzEQq0Qak6hkhsT5xgiEmZTxQ5 3OXFpLq+fGQ== X-Google-Smtp-Source: AGHT+IGMJm0d1bp45Lc2D7noXhJ1M4EISZiHWmNXgZ9yugwy942mteCEc+KAeANIlZ3bxeczuRQL0P8MLH/S X-Received: from dlag15.prod.google.com ([2002:a05:701b:250f:b0:119:78ff:fe18]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:ec8f:b0:295:9b3a:16b6 with SMTP id d9443c01a7336-297c0492c72mr15271785ad.49.1762470952206; Thu, 06 Nov 2025 15:15:52 -0800 (PST) Date: Thu, 6 Nov 2025 15:14:57 -0800 In-Reply-To: <20251106231508.448793-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: <20251106231508.448793-1-irogers@google.com> X-Mailer: git-send-email 2.51.2.1041.gc1ab5b90ca-goog Message-ID: <20251106231508.448793-8-irogers@google.com> Subject: [PATCH v2 07/18] perf stat: Remove hard coded shadow metrics From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Xu Yang , Chun-Tse Shao , Thomas Richter , Sumanth Korikkar , Collin Funk , Thomas Falcon , Howard Chu , Dapeng Mi , Levi Yun , Yang Li , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Andi Kleen , Weilin Wang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Now that the metrics are encoded in common json the hard coded printing means the metrics are shown twice. Remove the hard coded version. This means that when specifying events, and those events correspond to a hard coded metric, the metric will no longer be displayed. The metric will be displayed if the metric is requested. Due to the adhoc printing in the previous approach it was often found frustrating, the new approach avoids this. The default perf stat output on an alderlake now looks like: ``` $ perf stat -a -- sleep 1 Performance counter stats for 'system wide': 7,932 context-switches # 281.7 cs/sec = cs_per_second TopdownL1 (cpu_core) # 10.3 % tma_bad_spe= culation # 17.3 % tma_fronten= d_bound TopdownL1 (cpu_core) # 37.3 % tma_backend= _bound # 35.2 % tma_retiring 5,901 page-faults # 209.5 faults/= sec page_faults_per_second 418,955,116 cpu_atom/cpu-cycles/ # 0.0 GHz cy= cles_frequency (49.77%) 1,113,933,476 cpu_core/cpu-cycles/ # 0.0 GHz cy= cles_frequency # 14.6 % tma_bad_spe= culation # 8.5 % tma_retirin= g (50.17%) # 41.8 % tma_backend= _bound # 35.1 % tma_fronten= d_bound (50.31%) 32,196,918 cpu_atom/branches/ # 1.1 K/sec = branch_frequency (60.24%) 445,404,717 cpu_core/branches/ # 15.8 K/sec = branch_frequency 235 cpu-migrations # 8.3 migrati= ons/sec migrations_per_second 28,160,951,165 cpu-clock # 28.0 CPUs C= PUs_utilized 382,285,763 cpu_atom/cpu-cycles/ # 0.4 instruc= tions insn_per_cycle (60.18%) 1,114,029,255 cpu_core/cpu-cycles/ # 2.3 instruc= tions insn_per_cycle 1,768,727 cpu_atom/branches-misses/ # 6.5 % bran= ch_miss_rate (49.68%) 4,505,904 cpu_core/branches-misses/ # 1.0 % bran= ch_miss_rate 1.007137632 seconds time elapsed ``` Signed-off-by: Ian Rogers --- tools/perf/builtin-script.c | 1 - tools/perf/util/stat-display.c | 4 +- tools/perf/util/stat-shadow.c | 392 +-------------------------------- tools/perf/util/stat.h | 2 +- 4 files changed, 6 insertions(+), 393 deletions(-) diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index e24c3d9e01a8..6da8bfe1e7aa 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -2358,7 +2358,6 @@ static void perf_sample__fprint_metric(struct thread = *thread, evlist__for_each_entry(evsel->evlist, pos) { cpu_aggr_map__for_each_idx(aggr_idx, stat_config.aggr_map) { perf_stat__print_shadow_stats(&stat_config, pos, - count->val, aggr_idx, &ctx); } diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c index 4d0e353846ea..eabeab5e6614 100644 --- a/tools/perf/util/stat-display.c +++ b/tools/perf/util/stat-display.c @@ -902,7 +902,7 @@ static void printout(struct perf_stat_config *config, s= truct outstate *os, &num, from, &out); } while (from !=3D NULL); } else { - perf_stat__print_shadow_stats(config, counter, uval, aggr_idx, &out); + perf_stat__print_shadow_stats(config, counter, aggr_idx, &out); } } else { pm(config, os, METRIC_THRESHOLD_UNKNOWN, /*format=3D*/NULL, /*unit=3D*/N= ULL, /*val=3D*/0); @@ -1274,7 +1274,7 @@ static void print_metric_headers(struct perf_stat_con= fig *config, =20 os.evsel =3D counter; =20 - perf_stat__print_shadow_stats(config, counter, 0, 0, &out); + perf_stat__print_shadow_stats(config, counter, /*aggr_idx=3D*/0, &out); } =20 if (!config->json_output) diff --git a/tools/perf/util/stat-shadow.c b/tools/perf/util/stat-shadow.c index 4df614f8e200..afbc49e8cb31 100644 --- a/tools/perf/util/stat-shadow.c +++ b/tools/perf/util/stat-shadow.c @@ -20,357 +20,12 @@ struct stats walltime_nsecs_stats; struct rusage_stats ru_stats; =20 -enum { - CTX_BIT_USER =3D 1 << 0, - CTX_BIT_KERNEL =3D 1 << 1, - CTX_BIT_HV =3D 1 << 2, - CTX_BIT_HOST =3D 1 << 3, - CTX_BIT_IDLE =3D 1 << 4, - CTX_BIT_MAX =3D 1 << 5, -}; - -enum stat_type { - STAT_NONE =3D 0, - STAT_NSECS, - STAT_CYCLES, - STAT_INSTRUCTIONS, - STAT_STALLED_CYCLES_FRONT, - STAT_STALLED_CYCLES_BACK, - STAT_BRANCHES, - STAT_BRANCH_MISS, - STAT_CACHE_REFS, - STAT_CACHE_MISSES, - STAT_L1_DCACHE, - STAT_L1_ICACHE, - STAT_LL_CACHE, - STAT_ITLB_CACHE, - STAT_DTLB_CACHE, - STAT_L1D_MISS, - STAT_L1I_MISS, - STAT_LL_MISS, - STAT_DTLB_MISS, - STAT_ITLB_MISS, - STAT_MAX -}; - -static int evsel_context(const struct evsel *evsel) -{ - int ctx =3D 0; - - if (evsel->core.attr.exclude_kernel) - ctx |=3D CTX_BIT_KERNEL; - if (evsel->core.attr.exclude_user) - ctx |=3D CTX_BIT_USER; - if (evsel->core.attr.exclude_hv) - ctx |=3D CTX_BIT_HV; - if (evsel->core.attr.exclude_host) - ctx |=3D CTX_BIT_HOST; - if (evsel->core.attr.exclude_idle) - ctx |=3D CTX_BIT_IDLE; - - return ctx; -} - void perf_stat__reset_shadow_stats(void) { memset(&walltime_nsecs_stats, 0, sizeof(walltime_nsecs_stats)); memset(&ru_stats, 0, sizeof(ru_stats)); } =20 -static enum stat_type evsel__stat_type(struct evsel *evsel) -{ - /* Fake perf_hw_cache_op_id values for use with evsel__match. */ - u64 PERF_COUNT_hw_cache_l1d_miss =3D PERF_COUNT_HW_CACHE_L1D | - ((PERF_COUNT_HW_CACHE_OP_READ) << 8) | - ((PERF_COUNT_HW_CACHE_RESULT_MISS) << 16); - u64 PERF_COUNT_hw_cache_l1i_miss =3D PERF_COUNT_HW_CACHE_L1I | - ((PERF_COUNT_HW_CACHE_OP_READ) << 8) | - ((PERF_COUNT_HW_CACHE_RESULT_MISS) << 16); - u64 PERF_COUNT_hw_cache_ll_miss =3D PERF_COUNT_HW_CACHE_LL | - ((PERF_COUNT_HW_CACHE_OP_READ) << 8) | - ((PERF_COUNT_HW_CACHE_RESULT_MISS) << 16); - u64 PERF_COUNT_hw_cache_dtlb_miss =3D PERF_COUNT_HW_CACHE_DTLB | - ((PERF_COUNT_HW_CACHE_OP_READ) << 8) | - ((PERF_COUNT_HW_CACHE_RESULT_MISS) << 16); - u64 PERF_COUNT_hw_cache_itlb_miss =3D PERF_COUNT_HW_CACHE_ITLB | - ((PERF_COUNT_HW_CACHE_OP_READ) << 8) | - ((PERF_COUNT_HW_CACHE_RESULT_MISS) << 16); - - if (evsel__is_clock(evsel)) - return STAT_NSECS; - else if (evsel__match(evsel, HARDWARE, HW_CPU_CYCLES)) - return STAT_CYCLES; - else if (evsel__match(evsel, HARDWARE, HW_INSTRUCTIONS)) - return STAT_INSTRUCTIONS; - else if (evsel__match(evsel, HARDWARE, HW_STALLED_CYCLES_FRONTEND)) - return STAT_STALLED_CYCLES_FRONT; - else if (evsel__match(evsel, HARDWARE, HW_STALLED_CYCLES_BACKEND)) - return STAT_STALLED_CYCLES_BACK; - else if (evsel__match(evsel, HARDWARE, HW_BRANCH_INSTRUCTIONS)) - return STAT_BRANCHES; - else if (evsel__match(evsel, HARDWARE, HW_BRANCH_MISSES)) - return STAT_BRANCH_MISS; - else if (evsel__match(evsel, HARDWARE, HW_CACHE_REFERENCES)) - return STAT_CACHE_REFS; - else if (evsel__match(evsel, HARDWARE, HW_CACHE_MISSES)) - return STAT_CACHE_MISSES; - else if (evsel__match(evsel, HW_CACHE, HW_CACHE_L1D)) - return STAT_L1_DCACHE; - else if (evsel__match(evsel, HW_CACHE, HW_CACHE_L1I)) - return STAT_L1_ICACHE; - else if (evsel__match(evsel, HW_CACHE, HW_CACHE_LL)) - return STAT_LL_CACHE; - else if (evsel__match(evsel, HW_CACHE, HW_CACHE_DTLB)) - return STAT_DTLB_CACHE; - else if (evsel__match(evsel, HW_CACHE, HW_CACHE_ITLB)) - return STAT_ITLB_CACHE; - else if (evsel__match(evsel, HW_CACHE, hw_cache_l1d_miss)) - return STAT_L1D_MISS; - else if (evsel__match(evsel, HW_CACHE, hw_cache_l1i_miss)) - return STAT_L1I_MISS; - else if (evsel__match(evsel, HW_CACHE, hw_cache_ll_miss)) - return STAT_LL_MISS; - else if (evsel__match(evsel, HW_CACHE, hw_cache_dtlb_miss)) - return STAT_DTLB_MISS; - else if (evsel__match(evsel, HW_CACHE, hw_cache_itlb_miss)) - return STAT_ITLB_MISS; - return STAT_NONE; -} - -static enum metric_threshold_classify get_ratio_thresh(const double ratios= [3], double val) -{ - assert(ratios[0] > ratios[1]); - assert(ratios[1] > ratios[2]); - - return val > ratios[1] - ? (val > ratios[0] ? METRIC_THRESHOLD_BAD : METRIC_THRESHOLD_NEARLY_BAD) - : (val > ratios[2] ? METRIC_THRESHOLD_LESS_GOOD : METRIC_THRESHOLD_GOOD); -} - -static double find_stat(const struct evsel *evsel, int aggr_idx, enum stat= _type type) -{ - struct evsel *cur; - int evsel_ctx =3D evsel_context(evsel); - struct perf_pmu *evsel_pmu =3D evsel__find_pmu(evsel); - - evlist__for_each_entry(evsel->evlist, cur) { - struct perf_stat_aggr *aggr; - - /* Ignore the evsel that is being searched from. */ - if (evsel =3D=3D cur) - continue; - - /* Ignore evsels that are part of different groups. */ - if (evsel->core.leader->nr_members > 1 && - evsel->core.leader !=3D cur->core.leader) - continue; - /* Ignore evsels with mismatched modifiers. */ - if (evsel_ctx !=3D evsel_context(cur)) - continue; - /* Ignore if not the cgroup we're looking for. */ - if (evsel->cgrp !=3D cur->cgrp) - continue; - /* Ignore if not the stat we're looking for. */ - if (type !=3D evsel__stat_type(cur)) - continue; - - /* - * Except the SW CLOCK events, - * ignore if not the PMU we're looking for. - */ - if ((type !=3D STAT_NSECS) && (evsel_pmu !=3D evsel__find_pmu(cur))) - continue; - - aggr =3D &cur->stats->aggr[aggr_idx]; - if (type =3D=3D STAT_NSECS) - return aggr->counts.val; - return aggr->counts.val * cur->scale; - } - return 0.0; -} - -static void print_ratio(struct perf_stat_config *config, - const struct evsel *evsel, int aggr_idx, - double numerator, struct perf_stat_output_ctx *out, - enum stat_type denominator_type, - const double thresh_ratios[3], const char *_unit) -{ - double denominator =3D find_stat(evsel, aggr_idx, denominator_type); - double ratio =3D 0; - enum metric_threshold_classify thresh =3D METRIC_THRESHOLD_UNKNOWN; - const char *fmt =3D NULL; - const char *unit =3D NULL; - - if (numerator && denominator) { - ratio =3D numerator / denominator * 100.0; - thresh =3D get_ratio_thresh(thresh_ratios, ratio); - fmt =3D "%7.2f%%"; - unit =3D _unit; - } - out->print_metric(config, out->ctx, thresh, fmt, unit, ratio); -} - -static void print_stalled_cycles_front(struct perf_stat_config *config, - const struct evsel *evsel, - int aggr_idx, double stalled, - struct perf_stat_output_ctx *out) -{ - const double thresh_ratios[3] =3D {50.0, 30.0, 10.0}; - - print_ratio(config, evsel, aggr_idx, stalled, out, STAT_CYCLES, thresh_ra= tios, - "frontend cycles idle"); -} - -static void print_stalled_cycles_back(struct perf_stat_config *config, - const struct evsel *evsel, - int aggr_idx, double stalled, - struct perf_stat_output_ctx *out) -{ - const double thresh_ratios[3] =3D {75.0, 50.0, 20.0}; - - print_ratio(config, evsel, aggr_idx, stalled, out, STAT_CYCLES, thresh_ra= tios, - "backend cycles idle"); -} - -static void print_branch_miss(struct perf_stat_config *config, - const struct evsel *evsel, - int aggr_idx, double misses, - struct perf_stat_output_ctx *out) -{ - const double thresh_ratios[3] =3D {20.0, 10.0, 5.0}; - - print_ratio(config, evsel, aggr_idx, misses, out, STAT_BRANCHES, thresh_r= atios, - "of all branches"); -} - -static void print_l1d_miss(struct perf_stat_config *config, - const struct evsel *evsel, - int aggr_idx, double misses, - struct perf_stat_output_ctx *out) -{ - const double thresh_ratios[3] =3D {20.0, 10.0, 5.0}; - - print_ratio(config, evsel, aggr_idx, misses, out, STAT_L1_DCACHE, thresh_= ratios, - "of all L1-dcache accesses"); -} - -static void print_l1i_miss(struct perf_stat_config *config, - const struct evsel *evsel, - int aggr_idx, double misses, - struct perf_stat_output_ctx *out) -{ - const double thresh_ratios[3] =3D {20.0, 10.0, 5.0}; - - print_ratio(config, evsel, aggr_idx, misses, out, STAT_L1_ICACHE, thresh_= ratios, - "of all L1-icache accesses"); -} - -static void print_ll_miss(struct perf_stat_config *config, - const struct evsel *evsel, - int aggr_idx, double misses, - struct perf_stat_output_ctx *out) -{ - const double thresh_ratios[3] =3D {20.0, 10.0, 5.0}; - - print_ratio(config, evsel, aggr_idx, misses, out, STAT_LL_CACHE, thresh_r= atios, - "of all LL-cache accesses"); -} - -static void print_dtlb_miss(struct perf_stat_config *config, - const struct evsel *evsel, - int aggr_idx, double misses, - struct perf_stat_output_ctx *out) -{ - const double thresh_ratios[3] =3D {20.0, 10.0, 5.0}; - - print_ratio(config, evsel, aggr_idx, misses, out, STAT_DTLB_CACHE, thresh= _ratios, - "of all dTLB cache accesses"); -} - -static void print_itlb_miss(struct perf_stat_config *config, - const struct evsel *evsel, - int aggr_idx, double misses, - struct perf_stat_output_ctx *out) -{ - const double thresh_ratios[3] =3D {20.0, 10.0, 5.0}; - - print_ratio(config, evsel, aggr_idx, misses, out, STAT_ITLB_CACHE, thresh= _ratios, - "of all iTLB cache accesses"); -} - -static void print_cache_miss(struct perf_stat_config *config, - const struct evsel *evsel, - int aggr_idx, double misses, - struct perf_stat_output_ctx *out) -{ - const double thresh_ratios[3] =3D {20.0, 10.0, 5.0}; - - print_ratio(config, evsel, aggr_idx, misses, out, STAT_CACHE_REFS, thresh= _ratios, - "of all cache refs"); -} - -static void print_instructions(struct perf_stat_config *config, - const struct evsel *evsel, - int aggr_idx, double instructions, - struct perf_stat_output_ctx *out) -{ - print_metric_t print_metric =3D out->print_metric; - void *ctxp =3D out->ctx; - double cycles =3D find_stat(evsel, aggr_idx, STAT_CYCLES); - double max_stalled =3D max(find_stat(evsel, aggr_idx, STAT_STALLED_CYCLES= _FRONT), - find_stat(evsel, aggr_idx, STAT_STALLED_CYCLES_BACK)); - - if (cycles) { - print_metric(config, ctxp, METRIC_THRESHOLD_UNKNOWN, "%7.2f ", - "insn per cycle", instructions / cycles); - } else { - print_metric(config, ctxp, METRIC_THRESHOLD_UNKNOWN, /*fmt=3D*/NULL, - "insn per cycle", 0); - } - if (max_stalled && instructions) { - if (out->new_line) - out->new_line(config, ctxp); - print_metric(config, ctxp, METRIC_THRESHOLD_UNKNOWN, "%7.2f ", - "stalled cycles per insn", max_stalled / instructions); - } -} - -static void print_cycles(struct perf_stat_config *config, - const struct evsel *evsel, - int aggr_idx, double cycles, - struct perf_stat_output_ctx *out) -{ - double nsecs =3D find_stat(evsel, aggr_idx, STAT_NSECS); - - if (cycles && nsecs) { - double ratio =3D cycles / nsecs; - - out->print_metric(config, out->ctx, METRIC_THRESHOLD_UNKNOWN, "%8.3f", - "GHz", ratio); - } else { - out->print_metric(config, out->ctx, METRIC_THRESHOLD_UNKNOWN, /*fmt=3D*/= NULL, - "GHz", 0); - } -} - -static void print_nsecs(struct perf_stat_config *config, - const struct evsel *evsel, - int aggr_idx __maybe_unused, double nsecs, - struct perf_stat_output_ctx *out) -{ - print_metric_t print_metric =3D out->print_metric; - void *ctxp =3D out->ctx; - double wall_time =3D avg_stats(&walltime_nsecs_stats); - - if (wall_time) { - print_metric(config, ctxp, METRIC_THRESHOLD_UNKNOWN, "%8.3f", "CPUs util= ized", - nsecs / (wall_time * evsel->scale)); - } else { - print_metric(config, ctxp, METRIC_THRESHOLD_UNKNOWN, /*fmt=3D*/NULL, - "CPUs utilized", 0); - } -} - static int prepare_metric(const struct metric_expr *mexp, const struct evsel *evsel, struct expr_parse_ctx *pctx, @@ -682,56 +337,15 @@ void *perf_stat__print_shadow_stats_metricgroup(struc= t perf_stat_config *config, =20 void perf_stat__print_shadow_stats(struct perf_stat_config *config, struct evsel *evsel, - double avg, int aggr_idx, + int aggr_idx, struct perf_stat_output_ctx *out) { - typedef void (*stat_print_function_t)(struct perf_stat_config *config, - const struct evsel *evsel, - int aggr_idx, double misses, - struct perf_stat_output_ctx *out); - static const stat_print_function_t stat_print_function[STAT_MAX] =3D { - [STAT_INSTRUCTIONS] =3D print_instructions, - [STAT_BRANCH_MISS] =3D print_branch_miss, - [STAT_L1D_MISS] =3D print_l1d_miss, - [STAT_L1I_MISS] =3D print_l1i_miss, - [STAT_DTLB_MISS] =3D print_dtlb_miss, - [STAT_ITLB_MISS] =3D print_itlb_miss, - [STAT_LL_MISS] =3D print_ll_miss, - [STAT_CACHE_MISSES] =3D print_cache_miss, - [STAT_STALLED_CYCLES_FRONT] =3D print_stalled_cycles_front, - [STAT_STALLED_CYCLES_BACK] =3D print_stalled_cycles_back, - [STAT_CYCLES] =3D print_cycles, - [STAT_NSECS] =3D print_nsecs, - }; print_metric_t print_metric =3D out->print_metric; void *ctxp =3D out->ctx; - int num =3D 1; + int num =3D 0; =20 - if (config->iostat_run) { + if (config->iostat_run) iostat_print_metric(config, evsel, out); - } else { - stat_print_function_t fn =3D stat_print_function[evsel__stat_type(evsel)= ]; - - if (fn) - fn(config, evsel, aggr_idx, avg, out); - else { - double nsecs =3D find_stat(evsel, aggr_idx, STAT_NSECS); - - if (nsecs) { - char unit =3D ' '; - char unit_buf[10] =3D "/sec"; - double ratio =3D convert_unit_double(1000000000.0 * avg / nsecs, - &unit); - - if (unit !=3D ' ') - snprintf(unit_buf, sizeof(unit_buf), "%c/sec", unit); - print_metric(config, ctxp, METRIC_THRESHOLD_UNKNOWN, "%8.3f", - unit_buf, ratio); - } else { - num =3D 0; - } - } - } =20 perf_stat__print_shadow_stats_metricgroup(config, evsel, aggr_idx, &num, NULL, out); diff --git a/tools/perf/util/stat.h b/tools/perf/util/stat.h index 34f30a295f89..53e4aa411e5f 100644 --- a/tools/perf/util/stat.h +++ b/tools/perf/util/stat.h @@ -184,7 +184,7 @@ struct perf_stat_output_ctx { =20 void perf_stat__print_shadow_stats(struct perf_stat_config *config, struct evsel *evsel, - double avg, int aggr_idx, + int aggr_idx, struct perf_stat_output_ctx *out); bool perf_stat__skip_metric_event(struct evsel *evsel, u64 ena, u64 run); void *perf_stat__print_shadow_stats_metricgroup(struct perf_stat_config *c= onfig, --=20 2.51.2.1041.gc1ab5b90ca-goog From nobody Fri Dec 19 17:18:16 2025 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (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 C9A89357A3E for ; Thu, 6 Nov 2025 23:15:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470957; cv=none; b=Q0apQvEY111ZXMAdILjvGI3TDpOsScooBlaKYcyNfNbnBgLDR5puFYwowc9eAEfa9HLTbPwlq0hMt96tth0vWGDizOdGCHcDIWK2aGerV0sAHWbRLiFKerJO4fZQBCdBEzaDpVHIjEvJCsWTXB9kzLZ0aXt47HhEkmXLG5JtwQ8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470957; c=relaxed/simple; bh=cZF5rXK0ot4f5Ll54hzIMYMkIxY+GXfM/HIllfqaohs=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=kbFDDOxRSNhNJoKuW6AvFd0TrJxsxRvyTL/JWYmgXopCGvWEcSHzORrrJEDVtajDHmSYJZS/2m1X4KB6Sgc6/WNwbOxYhWJ+/qULJWLNKwvkWh7cflRI4W5QNp4gq/ZCrvoX/DT/JBxjz+ypvIxSVJNuzYcXf2cPyx1Dgi2O9dQ= 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=XNjDytRv; arc=none smtp.client-ip=209.85.214.202 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="XNjDytRv" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-29555415c09so2106105ad.0 for ; Thu, 06 Nov 2025 15:15:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1762470954; x=1763075754; 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=CJrFojSq6nlkAfypEMFi1zUKz5050bK3dx0VztPcSL4=; b=XNjDytRvdIKQ2VhEU4fJnQwqaJJY68nxei2eOgGweRFnFVTvjfIAsp0Z47m0GEEB1Q qch9Evp0eNOsDjraG27QTG4RxYLz9Z8TED7sNJS4gSXM1syq3FiRvlUn1bpcL482wKJC nXp/DZSldUBFxh+us4j4cqqnH62jf0ykIskTSG6K3jnb9yMiKEzcAg7h7MEvTc3tJlMA vKNk6tJdlsLP5fHrQ9CIHZ+sKsyIEKTAsGowLbdyxvxu5buJsnfqUuZwjQiqSJUV/039 C9eG9HmXwmlru9lt9pN6WquTjVGlawCj2yNUUIOBRBUonkdiTI9xpnA2W0eZNum1FJN1 jwkA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762470954; x=1763075754; 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=CJrFojSq6nlkAfypEMFi1zUKz5050bK3dx0VztPcSL4=; b=WDULxjsNB9vmQMp1pumMphRg1Gc3i1TzdXTKxZh8bMyMSIlLX9LjH4phA9OpBr/DJB juvP2BHZhT3+9lx6G17flroy96m6dgTU4w8r3QMYczPrKGJBwsJZ51jvCy5Na7n+4YA1 rM+wQlzIRbAAaZoD4Sc4OQnZfCwZ0ePTyILAxEBmG09nZVubnIihhKOjdG6X42rWL3EO PyEQcEhenqNPwD2vE8AH7Zt/J3b3BDWGDCNEhN7aO3QAyZzfIGGRRNKJX/5aKkx7UrZP ZSnC7psin4tMg1YI/ajy0YALo09arb21B0EHiWq8QlWWOmUjNO1g+sGQI5krIkn5FT/h b4Kg== X-Forwarded-Encrypted: i=1; AJvYcCU+o+5FUP62/goNutnWZO74uzjtWvuQ2Z185it33Kyu/y0aN8DWy7NwANmF0BY84kjXoO96wRGdJgVVT/g=@vger.kernel.org X-Gm-Message-State: AOJu0YwizdWT/z7TMZUKPhOyC/DKVu/s6dfznim1j5itC7X2Y80xtMZ6 3xsIb2+thQ1V0LsBTbBwuXw0HdpVehfyeLdIcdCL9gnWDtCUHp8IArBd592DpHl1V2V+BcfqVn8 hDPq5rQI5Qw== X-Google-Smtp-Source: AGHT+IHjH/Lc/zZixsXrrpT72ayLrbkOIrsLtdVoMrbt/bO0u2fvW5pbTn9CqdlIJUS6Wb5uI4ddoJtrc/nT X-Received: from dlbcf37.prod.google.com ([2002:a05:7022:45a5:b0:119:b185:ea6c]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:2f8e:b0:272:c95c:866 with SMTP id d9443c01a7336-297c03ab3f3mr17315715ad.20.1762470954099; Thu, 06 Nov 2025 15:15:54 -0800 (PST) Date: Thu, 6 Nov 2025 15:14:58 -0800 In-Reply-To: <20251106231508.448793-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: <20251106231508.448793-1-irogers@google.com> X-Mailer: git-send-email 2.51.2.1041.gc1ab5b90ca-goog Message-ID: <20251106231508.448793-9-irogers@google.com> Subject: [PATCH v2 08/18] perf stat: Fix default metricgroup display on hybrid From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Xu Yang , Chun-Tse Shao , Thomas Richter , Sumanth Korikkar , Collin Funk , Thomas Falcon , Howard Chu , Dapeng Mi , Levi Yun , Yang Li , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Andi Kleen , Weilin Wang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The logic to skip output of a default metric line was firing on Alderlake and not displaying 'TopdownL1 (cpu_atom)'. Remove the need_full_name check as it is equivalent to the different PMU test in the cases we care about, merge the 'if's and flip the evsel of the PMU test. The 'if' is now basically saying, if the output matches the last printed output then skip the output. Before: ``` TopdownL1 (cpu_core) # 11.3 % tma_bad_spe= culation # 24.3 % tma_fronten= d_bound TopdownL1 (cpu_core) # 33.9 % tma_backend= _bound # 30.6 % tma_retiring # 42.2 % tma_backend= _bound # 25.0 % tma_fronten= d_bound (49.81%) # 12.8 % tma_bad_spe= culation # 20.0 % tma_retirin= g (59.46%) ``` After: ``` TopdownL1 (cpu_core) # 8.3 % tma_bad_spe= culation # 43.7 % tma_fronten= d_bound # 30.7 % tma_backend= _bound # 17.2 % tma_retiring TopdownL1 (cpu_atom) # 31.9 % tma_backend= _bound # 37.6 % tma_fronten= d_bound (49.66%) # 18.0 % tma_bad_spe= culation # 12.6 % tma_retirin= g (59.58%) ``` Signed-off-by: Ian Rogers --- tools/perf/util/stat-shadow.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tools/perf/util/stat-shadow.c b/tools/perf/util/stat-shadow.c index afbc49e8cb31..c1547128c396 100644 --- a/tools/perf/util/stat-shadow.c +++ b/tools/perf/util/stat-shadow.c @@ -256,11 +256,9 @@ static void perf_stat__print_metricgroup_header(struct= perf_stat_config *config, * event. Only align with other metics from * different metric events. */ - if (last_name && !strcmp(last_name, name)) { - if (!need_full_name || last_pmu !=3D evsel->pmu) { - out->print_metricgroup_header(config, ctxp, NULL); - return; - } + if (last_name && !strcmp(last_name, name) && last_pmu =3D=3D evsel->pmu) { + out->print_metricgroup_header(config, ctxp, NULL); + return; } =20 if (need_full_name && evsel->pmu) --=20 2.51.2.1041.gc1ab5b90ca-goog From nobody Fri Dec 19 17:18:16 2025 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (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 A45F13587A0 for ; Thu, 6 Nov 2025 23:15:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470958; cv=none; b=hYx1+19s91IfEJgHd+zmh515dH9JuQokg1/b94kwWwCxqfyFK7yurw7gEts1EG65qc7tzKq86N6OiB+Pm6O20MhqYeWtKh9xSZNB1oP5PMfd/+dFqCapcfH1nWme7e6xv7bgBiGebEVp4wuyiZLFI9dvqP9ZPa7Y3J04gbcNzHM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470958; c=relaxed/simple; bh=wGLT+L2StwVsEe33LwLx0HGkrBzzAAKBmqSQyKDCyvs=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=rrH3+jElvQrDN6GLRcaBnqj+RROR9WXMOtjUsv7Z9LfHoo6h2oxoYZFhz+ZWcjBnGJJntlvgyzW8y0CakGYjP1otQ26qrQbpdlys2c4O2P0Ut7UR17v+Nt1FFe3u534tIWPwog17bOW/hg3VaDNZ0nlysxjqWDAPExUBlHVsUR8= 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=h6nyTnCv; arc=none smtp.client-ip=209.85.214.202 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="h6nyTnCv" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-29557f43d56so1817775ad.3 for ; Thu, 06 Nov 2025 15:15:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1762470956; x=1763075756; 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=tCfti0BVw0vE3q2qzPNg4k5C/1/WEypOlA1+Gx0M6jE=; b=h6nyTnCvUyO7zMt39mTS6lJ5EHKjrM77FkGhyjiCZozRufDj/skZyffzMS+u8W/ctI 8H5y94w541z4QVl/eGH9qFxFukqI+zeN7dY69n8uBhXe4STJboCRjJRFB/ilINSKptIf WnQAVloqLd7GrzWP/NSexXkqelrV04/FJmKWfYdYe0pwBf8bJDEvq/ZiJnt98tdFx4oz 7ouzgSu2Vj46IYmseeHa8+kig25lqOpUJvL32+ihGROOHme4HkfnvsAI8tLPErLvb427 mAqSUvjeFXE09GzRkJ1VGjK+gSKb8a4LtTB/68sWlqgJVrDrBk1ve/Gu/B6qo+rqPWHs uvwA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762470956; x=1763075756; 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=tCfti0BVw0vE3q2qzPNg4k5C/1/WEypOlA1+Gx0M6jE=; b=GrUQMg69xZF1a1z9r+w0ThwiqIrGXcxA/TgXYdVMZr6mZm6QSlPvr5UO2HPvXAO0TU pz9yf50K/Rnz/gASRNn3UXyK8LRqFXLQJjhP/mfjvts+h8RnD6HCEve7zdf2KkCUR7bt tV4pQBMIGoHVKXGL2zJt2yEm2uNZeQ2IZADRDAu/jAa1GsATcKMLe5gDivv5LYo8gKW3 gOmb3zLi0VP2Lx6SVzhWvSyUFAms7GXhl/HuEKQ3Kj9PrJ3PXtGc8rCTcGO7XfPPUixm HjAyX8B+Riu/+KvNGcdEGSE5r0aGD7pEa1bfyVq+wNiWPCXpWSOtHeC/67mptjRriORO wO+g== X-Forwarded-Encrypted: i=1; AJvYcCU2nWDYBHXX1NPISFi1dyjc5r+8hSCbBRgvWkaU8yZDXNtIljqiwtfJa87LD0AWVU3522SYjzc6Be/LdzA=@vger.kernel.org X-Gm-Message-State: AOJu0Yx0OHH+Ja0F9CSQDUbW9WQA8RTYtK+Zu8lO8BXLJdKWbDSd2Ner O/SUxkg5cOcZcE7NJyj+rx73C4EyDuL3jhueIv6DMSmWp+X4MYfb17W2ZXoG6VtKzXvAfM3AJNI UMGZOcTjbiQ== X-Google-Smtp-Source: AGHT+IEAe+z9vLAwWmr5BuHAiJUh/HgPekXCgVSRIg+YHIscSbYSC4zYjJFfyYeEO+z/ZH5JVzEa7KJNnPwG X-Received: from dlj34.prod.google.com ([2002:a05:7022:522:b0:119:b185:ea69]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:1a90:b0:269:aba0:f0a7 with SMTP id d9443c01a7336-297c03866fdmr14660265ad.2.1762470956029; Thu, 06 Nov 2025 15:15:56 -0800 (PST) Date: Thu, 6 Nov 2025 15:14:59 -0800 In-Reply-To: <20251106231508.448793-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: <20251106231508.448793-1-irogers@google.com> X-Mailer: git-send-email 2.51.2.1041.gc1ab5b90ca-goog Message-ID: <20251106231508.448793-10-irogers@google.com> Subject: [PATCH v2 09/18] perf stat: Sort default events/metrics From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Xu Yang , Chun-Tse Shao , Thomas Richter , Sumanth Korikkar , Collin Funk , Thomas Falcon , Howard Chu , Dapeng Mi , Levi Yun , Yang Li , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Andi Kleen , Weilin Wang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" To improve the readability of default events/metrics, sort the evsels after the Default metric groups have be parsed. Before: ``` $ perf stat -a sleep 1 Performance counter stats for 'system wide': 21,194 context-switches # 752.1 cs/sec = cs_per_second TopdownL1 (cpu_core) # 9.4 % tma_bad_spe= culation # 25.0 % tma_fronten= d_bound # 37.0 % tma_backend= _bound # 28.7 % tma_retiring 6,371 page-faults # 226.1 faults/= sec page_faults_per_second 734,456,525 cpu_atom/cpu-cycles/ # 0.0 GHz cy= cles_frequency (49.77%) 1,679,085,181 cpu_core/cpu-cycles/ # 0.1 GHz cy= cles_frequency TopdownL1 (cpu_atom) # 19.2 % tma_bad_spe= culation # 15.1 % tma_retirin= g (50.15%) # 32.9 % tma_backend= _bound # 32.9 % tma_fronten= d_bound (50.34%) 86,758,824 cpu_atom/branches/ # 3.1 K/sec = branch_frequency (60.26%) 524,281,539 cpu_core/branches/ # 18.6 K/sec = branch_frequency 1,458 cpu-migrations # 51.7 migrati= ons/sec migrations_per_second 28,178,124,975 cpu-clock # 28.0 CPUs C= PUs_utilized 776,037,182 cpu_atom/cpu-cycles/ # 0.6 instruc= tions insn_per_cycle (60.18%) 1,679,168,140 cpu_core/cpu-cycles/ # 1.8 instruc= tions insn_per_cycle 4,045,615 cpu_atom/branches-misses/ # 5.3 % bran= ch_miss_rate (49.65%) 6,656,795 cpu_core/branches-misses/ # 1.3 % bran= ch_miss_rate 1.007340329 seconds time elapsed ``` After: ``` $ perf stat -a sleep 1 Performance counter stats for 'system wide': 25,701 context-switches # 911.8 cs/sec = cs_per_second 28,187,404,943 cpu-clock # 28.0 CPUs C= PUs_utilized 2,053 cpu-migrations # 72.8 migrati= ons/sec migrations_per_second 12,390 page-faults # 439.6 faults/= sec page_faults_per_second 592,082,798 cpu_core/branches/ # 21.0 K/sec = branch_frequency 7,762,204 cpu_core/branches-misses/ # 1.3 % bran= ch_miss_rate 1,925,833,804 cpu_core/cpu-cycles/ # 0.1 GHz cy= cles_frequency 1,925,848,650 cpu_core/cpu-cycles/ # 1.7 instruc= tions insn_per_cycle 95,449,119 cpu_atom/branches/ # 3.4 K/sec = branch_frequency (59.78%) 4,278,932 cpu_atom/branches-misses/ # 4.3 % bran= ch_miss_rate (50.26%) 980,441,753 cpu_atom/cpu-cycles/ # 0.0 GHz cy= cles_frequency (50.34%) 1,091,626,599 cpu_atom/cpu-cycles/ # 0.6 instruc= tions insn_per_cycle (50.37%) TopdownL1 (cpu_core) # 9.1 % tma_bad_spe= culation # 27.3 % tma_fronten= d_bound # 35.7 % tma_backend= _bound # 27.9 % tma_retiring TopdownL1 (cpu_atom) # 31.1 % tma_backend= _bound # 34.3 % tma_fronten= d_bound (49.74%) # 24.1 % tma_bad_spe= culation # 10.5 % tma_retirin= g (59.57%) ``` Signed-off-by: Ian Rogers --- tools/perf/builtin-stat.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 0ac3c8906668..bd48448bd085 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -74,6 +74,7 @@ #include "util/intel-tpebs.h" #include "asm/bug.h" =20 +#include #include #include #include @@ -1857,6 +1858,35 @@ static int perf_stat_init_aggr_mode_file(struct perf= _stat *st) return 0; } =20 +static int default_evlist_evsel_cmp(void *priv __maybe_unused, + const struct list_head *l, + const struct list_head *r) +{ + const struct perf_evsel *lhs_core =3D container_of(l, struct perf_evsel, = node); + const struct evsel *lhs =3D container_of(lhs_core, struct evsel, core); + const struct perf_evsel *rhs_core =3D container_of(r, struct perf_evsel, = node); + const struct evsel *rhs =3D container_of(rhs_core, struct evsel, core); + + if (evsel__leader(lhs) =3D=3D evsel__leader(rhs)) { + /* Within the same group, respect the original order. */ + return lhs_core->idx - rhs_core->idx; + } + + /* Sort default metrics evsels first, and default show events before thos= e. */ + if (lhs->default_metricgroup !=3D rhs->default_metricgroup) + return lhs->default_metricgroup ? -1 : 1; + + if (lhs->default_show_events !=3D rhs->default_show_events) + return lhs->default_show_events ? -1 : 1; + + /* Sort by PMU type (prefers legacy types first). */ + if (lhs->pmu !=3D rhs->pmu) + return lhs->pmu->type - rhs->pmu->type; + + /* Sort by name. */ + return strcmp(evsel__name((struct evsel *)lhs), evsel__name((struct evsel= *)rhs)); +} + /* * Add default events, if there were no attributes specified or * if -d/--detailed, -d -d or -d -d -d is used: @@ -2023,6 +2053,8 @@ static int add_default_events(void) &metric_evlist->metric_events); evlist__delete(metric_evlist); } + list_sort(/*priv=3D*/NULL, &evlist->core.entries, default_evlist_evsel_c= mp); + } out: if (!ret) { --=20 2.51.2.1041.gc1ab5b90ca-goog From nobody Fri Dec 19 17:18:16 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 5F6E42E0922 for ; Thu, 6 Nov 2025 23:15:58 +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=1762470960; cv=none; b=KTJUXJqIbRKs4q19xYPAazIAnQYlhTuDq+6zey7LS8cOLHwqUOJniQsw2Ck1ZR+ecvU80QFkecz7A/qs68nbY7e2BhwDMVvfaYKCQYkPChREU9tk1LM9Xw5YwiD/w1wWpX5szhPA9JruAPA32paeJ4Fqwy7dHyPFFNpZ3BpPGZY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470960; c=relaxed/simple; bh=3kfszh9GvrFi8Y4HcNCDpFFabOoNANjoDq9+KWDc9ZY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=fRxUoyLu4FapRfngX7IRpCGKA8wA2QKuxmnKPCJ7G9zaaAAhUk/4Hy70VejoZO7cg42jbYQSoSRaIVn59ouOt8/mv8af433videhcDG/FGeFbsFUmFXOYEatK3NhQ9Zb+e2SOzHcjOrgfqJeXg1qbTWd8pa479fhan94Uk9s7Us= 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=WGDz71ku; 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="WGDz71ku" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-29557f43d56so1818085ad.3 for ; Thu, 06 Nov 2025 15:15:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1762470958; x=1763075758; 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=blAae1b4UuHw+1SOJAzDhtKVe5EnHpicO6Ta+cSn2vM=; b=WGDz71ku5MjqA/ubNhzpLSQQneU2FkyuzlIzECa9P7HSKKkGl0deojofTB193Lqy16 RGXNK0rq2NhBfjkpPJPVkZv18FUeHjfNGn64Nt5KM37dCRl3deBRzOvlPsJc3A6ESSe3 gvlx50YL2TnwnBV21uUpURzLmmDlEytKsl87PkuSEyAYk3bqz26ETXjPexDiD/fZMT7T RXFZM4/kAXg0CQVmDNLYmzRwYuUixNw/LS5858YFn3UMx+zOuuR7owfpsI/xZpnP+cKo 8mW+vB2SWkbeEFg9HeMJAnLzq1kvdRFyqonuAnxrkior1NONlaUmgtH8o5ysGL2I/2AB gRXA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762470958; x=1763075758; 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=blAae1b4UuHw+1SOJAzDhtKVe5EnHpicO6Ta+cSn2vM=; b=ngR93PyCzYrEZJP+OQnqnlGFtYRRZu6Ei+G/AnUhand7GyMAEwo0i3KppWXLZc9U6l 0M0kUSbyLUKpvTWdOzaLrm/0FTcggsRCJ4qRgA/YMF46uvLzkbJ/fel0YJ3FH6BuHomB bw/4RZwHEtWqN/S/iMMpBT9V/gZF6fOHLyYOOgG+uIk5X2OVnvONkdq0WQ0PostjJYxJ DBXNvqZJItweINk+pVUpIj7Tkjtn76fl/ATihMZPy0IsO2Xl2l9INoIDiQgFDnllWjnG 4FFTDuZzIOfw6PZIUW2qJS6kA6SUBFPpciCZfyS17JQHrzMVuOx1HiCdvuXLU7FJ4lfW g4GA== X-Forwarded-Encrypted: i=1; AJvYcCXl4FqWgL9nFuQbYD30GdXukdlbYzjSjDZgws5oUCnvrIAdxpTZqWLTQ/YbW56PUC4JtOKGqmwVzztF+iE=@vger.kernel.org X-Gm-Message-State: AOJu0Yx5n/w3fOh9hZ6g9yerFDIdVO7KGbI394uRU0C+Dg+kPo4GtuE8 h+M1QYOfAw41JKF0WtvairLR+a5eLDrBrmMcL6XagSnrT5QDqlg46+pOcfpYsAqZN/v1RHfvx0W 4jHSe0QvD2A== X-Google-Smtp-Source: AGHT+IGusCIzgTLNZfY2mSSQ1Usvy6ejq0IMq2fUL4lvimGrlWfdC7717TTTc5KiNRvFZvcE483VuMJlifRr X-Received: from plof10.prod.google.com ([2002:a17:902:860a:b0:290:9ee0:e8cb]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:e78e:b0:294:fcae:826 with SMTP id d9443c01a7336-297c0478227mr15537655ad.59.1762470957691; Thu, 06 Nov 2025 15:15:57 -0800 (PST) Date: Thu, 6 Nov 2025 15:15:00 -0800 In-Reply-To: <20251106231508.448793-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: <20251106231508.448793-1-irogers@google.com> X-Mailer: git-send-email 2.51.2.1041.gc1ab5b90ca-goog Message-ID: <20251106231508.448793-11-irogers@google.com> Subject: [PATCH v2 10/18] perf stat: Remove "unit" workarounds for metric-only From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Xu Yang , Chun-Tse Shao , Thomas Richter , Sumanth Korikkar , Collin Funk , Thomas Falcon , Howard Chu , Dapeng Mi , Levi Yun , Yang Li , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Andi Kleen , Weilin Wang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Remove code that tested the "unit" as in KB/sec for certain hard coded metric values and did workarounds. Signed-off-by: Ian Rogers --- tools/perf/util/stat-display.c | 47 ++++++---------------------------- 1 file changed, 8 insertions(+), 39 deletions(-) diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c index eabeab5e6614..b3596f9f5cdd 100644 --- a/tools/perf/util/stat-display.c +++ b/tools/perf/util/stat-display.c @@ -592,42 +592,18 @@ static void print_metricgroup_header_std(struct perf_= stat_config *config, fprintf(config->output, "%*s", MGROUP_LEN - n - 1, ""); } =20 -/* Filter out some columns that don't work well in metrics only mode */ - -static bool valid_only_metric(const char *unit) -{ - if (!unit) - return false; - if (strstr(unit, "/sec") || - strstr(unit, "CPUs utilized")) - return false; - return true; -} - -static const char *fixunit(char *buf, struct evsel *evsel, - const char *unit) -{ - if (!strncmp(unit, "of all", 6)) { - snprintf(buf, 1024, "%s %s", evsel__name(evsel), - unit); - return buf; - } - return unit; -} - static void print_metric_only(struct perf_stat_config *config, void *ctx, enum metric_threshold_classify thresh, const char *fmt, const char *unit, double val) { struct outstate *os =3D ctx; FILE *out =3D os->fh; - char buf[1024], str[1024]; + char str[1024]; unsigned mlen =3D config->metric_only_len; const char *color =3D metric_threshold_classify__color(thresh); =20 - if (!valid_only_metric(unit)) - return; - unit =3D fixunit(buf, os->evsel, unit); + if (!unit) + unit =3D ""; if (mlen < strlen(unit)) mlen =3D strlen(unit) + 1; =20 @@ -643,16 +619,15 @@ static void print_metric_only_csv(struct perf_stat_co= nfig *config __maybe_unused void *ctx, enum metric_threshold_classify thresh __maybe_unused, const char *fmt, - const char *unit, double val) + const char *unit __maybe_unused, double val) { struct outstate *os =3D ctx; FILE *out =3D os->fh; char buf[64], *vals, *ends; - char tbuf[1024]; =20 - if (!valid_only_metric(unit)) + if (!unit) return; - unit =3D fixunit(tbuf, os->evsel, unit); + snprintf(buf, sizeof(buf), fmt ?: "", val); ends =3D vals =3D skip_spaces(buf); while (isdigit(*ends) || *ends =3D=3D '.') @@ -670,13 +645,9 @@ static void print_metric_only_json(struct perf_stat_co= nfig *config __maybe_unuse { struct outstate *os =3D ctx; char buf[64], *ends; - char tbuf[1024]; const char *vals; =20 - if (!valid_only_metric(unit)) - return; - unit =3D fixunit(tbuf, os->evsel, unit); - if (!unit[0]) + if (!unit || !unit[0]) return; snprintf(buf, sizeof(buf), fmt ?: "", val); vals =3D ends =3D skip_spaces(buf); @@ -695,7 +666,6 @@ static void print_metric_header(struct perf_stat_config= *config, const char *unit, double val __maybe_unused) { struct outstate *os =3D ctx; - char tbuf[1024]; =20 /* In case of iostat, print metric header for first root port only */ if (config->iostat_run && @@ -705,9 +675,8 @@ static void print_metric_header(struct perf_stat_config= *config, if (os->evsel->cgrp !=3D os->cgrp) return; =20 - if (!valid_only_metric(unit)) + if (!unit) return; - unit =3D fixunit(tbuf, os->evsel, unit); =20 if (config->json_output) return; --=20 2.51.2.1041.gc1ab5b90ca-goog From nobody Fri Dec 19 17:18:16 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 73319358D22 for ; Thu, 6 Nov 2025 23:16:00 +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=1762470962; cv=none; b=RIq2DGyB80igx5qDe/k406V2O6sG1uKBU0SQ1NmDJV3yFojcE2GS1bg1MLpiJvQ7O3E9hQDtgh4O3f8UYegn/VYMXxkWiHlMh8u8g3OrCdf46dnJGTgAjunoLtSN3nVPVVUW8oWjrjZaO0WpbF51aIQtX+Yw5RpL1dcORfD5beM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470962; c=relaxed/simple; bh=vsAC+bALI30qElPFV06AjAurdz8WlWhRwpAQxUMz2cg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=bLlz2fYvP4rrogOC2SaHDQkPk/4erEXRWGnqfJcz7F5p5cIHhQE3CtaZ02NYP5WdLni9daZr2H0E3RuHrHnfiYJPCLOkRy2KwyZBvnLRVnKhVlA45UVR8a6707NLgPxZCQC3jnwhqF1NNNVRCYRLTB44T0Y4TVx5wAk/HQoQ8fE= 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=MvbgYCNX; 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="MvbgYCNX" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2930e2e8e7fso1949375ad.2 for ; Thu, 06 Nov 2025 15:16:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1762470960; x=1763075760; 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=ScLENsyYSFxSsSXeHlp0LDfphHjWjgXO0/fUWwSEsxM=; b=MvbgYCNXDgx6Kez59C5aClvU6tiGpApTI4UK9WJEE8bE11buT/K3A9GSB6z2MMLcWI XP2uj20eENuvWWaOkN9Rm8ahGTVQxXs36dLVp+BkGV1Rf6Pckbv2sqFYzwbz65+ej8bz XZH0ZcorUrFmcmBOB6DtA9bYgrS22K30rs6IJj0MkwL4+bYw6vc5J7lXtYLej3KbMnED H7s7wIax7lEphBxryMNMxdBeN7CdZANKeX/2x0TGqYTkKTClglepRJc/ojeiVPr27sq1 eqh+47W/6KUrP3g93oXwPpoX9ZpNs8UzUY5GyMdoNPPQvQ67+kNpzhK4M1172DKAEA5V r7wQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762470960; x=1763075760; 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=ScLENsyYSFxSsSXeHlp0LDfphHjWjgXO0/fUWwSEsxM=; b=mztfP/r/Efm6YS/hapFL7hdorE4Td7qy+VlEoODYXyfK04n26KNvixC+xLRAF1V9Cx EwhnS8gwY/xY2jNpoDcnH9h9M/RO6SU2VRbLMb5GZxb67OyaZBDMcA9Va4TA7dkMRXk4 aa+2UhWK+JkcXzW+PnDO2uNnmfS1waLp0/INq5DR8fSgezdvKJKnKbrJDAwG+hbj9AWz ZjtTSbRsn90mtADnSQH4WRiNKdQ1upwiSfhstWqnbBr1usN/ah2BQ5b6K3icFvKqqHd4 xizeqGfi1JL6EMSXNEZYH5qrVjykL8vcVP/IMtiL78bw+n86Qmd2eyF8ej9L7Bmuazp3 oJ/Q== X-Forwarded-Encrypted: i=1; AJvYcCW7ljOezDM8Mmthku8ggIPFBaWQtxnqthpn9h9648W5kFUkfX3/OVHzF/7eRe6RvfXWarMqxk0xPgGGA9Q=@vger.kernel.org X-Gm-Message-State: AOJu0Yw1ogJIsOl6YH+3Fj7ALnrm4sX1l3O/rdLlTUTMncRDXMB21gps /EIQl7eyMnN7GOnCo30nJLlfK/6snUyATFfpFizCyuOSIQFUY1NimmjzzyyBpBJ95+DBaUG5Glg cnvgdeeiSkg== X-Google-Smtp-Source: AGHT+IF7+Q0cPmYHz5/abpijevA/om0VtU1+3MKAlA1OEDRxVqteWbaXmduw+smzYLuvecGGWKpEaTo9uj7A X-Received: from dlai18.prod.google.com ([2002:a05:701b:2712:b0:119:49ca:6b9c]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:ce82:b0:295:5a06:308d with SMTP id d9443c01a7336-297c03a84a8mr14347725ad.14.1762470959559; Thu, 06 Nov 2025 15:15:59 -0800 (PST) Date: Thu, 6 Nov 2025 15:15:01 -0800 In-Reply-To: <20251106231508.448793-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: <20251106231508.448793-1-irogers@google.com> X-Mailer: git-send-email 2.51.2.1041.gc1ab5b90ca-goog Message-ID: <20251106231508.448793-12-irogers@google.com> Subject: [PATCH v2 11/18] perf test stat+json: Improve metric-only testing From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Xu Yang , Chun-Tse Shao , Thomas Richter , Sumanth Korikkar , Collin Funk , Thomas Falcon , Howard Chu , Dapeng Mi , Levi Yun , Yang Li , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Andi Kleen , Weilin Wang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When testing metric-only, pass a metric to perf rather than expecting a hard coded metric value to be generated. Remove keys that were really metric-only units and instead don't expect metric only to have a matching json key as it encodes metrics as {"metric_name", "metric_value"}. Signed-off-by: Ian Rogers --- tools/perf/tests/shell/lib/perf_json_output_lint.py | 4 ++-- tools/perf/tests/shell/stat+json_output.sh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/perf/tests/shell/lib/perf_json_output_lint.py b/tools/pe= rf/tests/shell/lib/perf_json_output_lint.py index c6750ef06c0f..1369baaa0361 100644 --- a/tools/perf/tests/shell/lib/perf_json_output_lint.py +++ b/tools/perf/tests/shell/lib/perf_json_output_lint.py @@ -65,8 +65,6 @@ def check_json_output(expected_items): 'socket': lambda x: True, 'thread': lambda x: True, 'unit': lambda x: True, - 'insn per cycle': lambda x: isfloat(x), - 'GHz': lambda x: True, # FIXME: it seems unintended for --metric-on= ly } input =3D '[\n' + ','.join(Lines) + '\n]' for item in json.loads(input): @@ -88,6 +86,8 @@ def check_json_output(expected_items): f' in \'{item}\'') for key, value in item.items(): if key not in checks: + if args.metric_only: + continue raise RuntimeError(f'Unexpected key: key=3D{key} value=3D{value}') if not checks[key](value): raise RuntimeError(f'Check failed for: key=3D{key} value=3D{value}= ') diff --git a/tools/perf/tests/shell/stat+json_output.sh b/tools/perf/tests/= shell/stat+json_output.sh index 98fb65274ac4..85d1ad7186c6 100755 --- a/tools/perf/tests/shell/stat+json_output.sh +++ b/tools/perf/tests/shell/stat+json_output.sh @@ -181,7 +181,7 @@ check_metric_only() echo "[Skip] CPU-measurement counter facility not installed" return fi - perf stat -j --metric-only -e instructions,cycles -o "${stat_output}" true + perf stat -j --metric-only -M page_faults_per_second -o "${stat_output}" = true $PYTHON $pythonchecker --metric-only --file "${stat_output}" echo "[Success]" } --=20 2.51.2.1041.gc1ab5b90ca-goog From nobody Fri Dec 19 17:18:16 2025 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (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 7C6C2359FA2 for ; Thu, 6 Nov 2025 23:16:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470964; cv=none; b=Kok+ZFL1Bu2XfSoRRCo3g7c05zPpXmCF7Mh/FQ/mUAVElMntbbOCmVW4340ZlMC5Yxn3LaNUPxYTg1fC8EJundfQ7djeEF7t52uDeB0A8kdpk/VUBdgE0/uF5RhVdkdQz68J9UkeuLD5SpqOZMyRMMVC3h/kSAgznFQDraCw7OQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470964; c=relaxed/simple; bh=QjO8gSjusfZ0mPendJr0+QHEFToVhbHiU4PqR4DkANY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=R+Au+3xMvCQgYb7C3viQq14+rKhtWLpYrkuyeeUjcSpt6roYO5yiYt4W3sQTDmoEpXcaWROdxW2QV5qZ70F4m6eX1ow5jLF+7/aNinQ/1353ibkupXHbyEdHCuoowr2nlb+ZV/pdL23ZI2T4cLXmu3EoBhtvCpLbXTcCGLTWPy0= 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=cpObOfek; arc=none smtp.client-ip=209.85.214.202 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="cpObOfek" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-29555415c09so2107655ad.0 for ; Thu, 06 Nov 2025 15:16:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1762470962; x=1763075762; 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=DlhPdv0WtdedRwVAzlOAlu+LBijAGUItUQ61/Soo80E=; b=cpObOfekKgmF/Wr/e2BhDr9Id0SkoWP0yK6vGkdkeuDCC/ijjHbwqvS2hYh9+7xUTD iiJ7UKLi01kq3f1V+/DE/pSr26ENrWyC8uOOOHaLT4CTDuQfAOJOj1eDFfcmPKBZBxFo 5U5GwGwsgkg+qkExfgwd06dWsNvY9hWSuvUC5uCTJvlt3TYNknO2nXNSj5vS2uJAp40Z 5HWmMGJO06VF6jwJndR9yFhKlXbtc9jvf9DycJCOVv+vLy8hlZnTN2aPvpGbOErzkuGY hmOS8E63mFUt9KJ3pyKshJOMUeZuEiGNkweOHX/B4rAbt5PmwEMM3GNiSUsPLYRnD/6s tkQA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762470962; x=1763075762; 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=DlhPdv0WtdedRwVAzlOAlu+LBijAGUItUQ61/Soo80E=; b=rm3EL4Sz4GBZyk/OIeJNHGDUFoaLHwgQh+7mUM6mMifvrzjBDhZatNz6mLuPWWidme GYq0WUPs978T5CfBJhUD7E8UVlKKFn8fOoodVj21MUuVsnf74e4M/h1IZxeFNiQjIKd7 FPk5/rois66mUEq+7vKnmseBikx1AiM7Tk9oaVnWZxkjUfB13tZBjLH2gx1fQl2F2bfK XC1Kz+ceFcTec+FX3IDmLu7R9hjUpFiUx3vEsoBTq4ZrOAVE5eyFXviW7pUdED5DRF5Y 18IopTDJDcFIcMg7xyM9+/MHws8JiQcwsMXOwW/PVZwXSy9uaGcazBcsB0W+kkG5YyFk 0lJA== X-Forwarded-Encrypted: i=1; AJvYcCU5pZbthB9G0zN4pUHwbsC9zN/k9fq2cOPDgv6m7eQil9AWmvKN6Nuxd2GPI9RYWbt+SCIdmJVoczSBuWA=@vger.kernel.org X-Gm-Message-State: AOJu0Yx4XRpTkw2oiavxQo9zpPqf5IczvHait+WYvZ9u0GQbU1VeSiBN sPzxE2g06WyEqej+GmZGKj4QbjnjiSxG96afJhYEW3imKjqgWuax6+FL7zMhPJI9mvidQag3EVY 8kZJKTASuSQ== X-Google-Smtp-Source: AGHT+IHGozQui+AGGQhIfFXH2HFvKRA7CZtWpQ/Mv2fL+bTBN/Rcs9YJrd0UGOU3Fx1UbKXIr+g8XrJOLICv X-Received: from dlbrs16.prod.google.com ([2002:a05:7022:f690:b0:119:49ca:6b95]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:1a85:b0:295:ac70:10c4 with SMTP id d9443c01a7336-297c04575a6mr15133595ad.47.1762470961751; Thu, 06 Nov 2025 15:16:01 -0800 (PST) Date: Thu, 6 Nov 2025 15:15:02 -0800 In-Reply-To: <20251106231508.448793-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: <20251106231508.448793-1-irogers@google.com> X-Mailer: git-send-email 2.51.2.1041.gc1ab5b90ca-goog Message-ID: <20251106231508.448793-13-irogers@google.com> Subject: [PATCH v2 12/18] perf test stat: Ignore failures in Default[234] metricgroups From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Xu Yang , Chun-Tse Shao , Thomas Richter , Sumanth Korikkar , Collin Funk , Thomas Falcon , Howard Chu , Dapeng Mi , Levi Yun , Yang Li , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Andi Kleen , Weilin Wang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The Default[234] metric groups may contain unsupported legacy events. Allow those metric groups to fail. Signed-off-by: Ian Rogers --- tools/perf/tests/shell/stat_all_metricgroups.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/perf/tests/shell/stat_all_metricgroups.sh b/tools/perf/t= ests/shell/stat_all_metricgroups.sh index c6d61a4ac3e7..1400880ec01f 100755 --- a/tools/perf/tests/shell/stat_all_metricgroups.sh +++ b/tools/perf/tests/shell/stat_all_metricgroups.sh @@ -37,6 +37,9 @@ do then err=3D2 # Skip fi + elif [[ "$m" =3D=3D @(Default2|Default3|Default4) ]] + then + echo "Ignoring failures in $m that may contain unsupported legacy ev= ents" else echo "Metric group $m failed" echo $result --=20 2.51.2.1041.gc1ab5b90ca-goog From nobody Fri Dec 19 17:18:16 2025 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (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 897A83590D1 for ; Thu, 6 Nov 2025 23:16:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470968; cv=none; b=t9bT3nPI2R5P+18M0cIvAK4zeq3G4b3hIIAa7Cw7/5jpQxbaRc/FB3k2vtyIJ3yAs+XQ0XAGZ2Ls2ebjqwUnjTRE6rBjP8zzUzcPjfiuYPgU68ZYnrrutSo778uaaUFCd8/fUQ/X/PZ27xNdft4dt9BW1AcrCBfuzFl9jsk2e/A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470968; c=relaxed/simple; bh=7NP/VCWcDtaQ9ddY1vDzUSspDiDop3c4KIH6lorm7/g=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=d+A/PctZxeqdhxr0VX/qblBwKA0JSB0SiFr7aTo31o4SE1Jt7Q39KGN2wnK2W9/vexEpxlUSjyZ4te0vF/J/BCZGVrHuE7fQAgXWRlyBkpysWanFzYteEY9CGfnAP6q3jArwZcS922+9/vS43BUXInTGkwOgvvD8v5oYHn69rsg= 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=xeMaEbx0; arc=none smtp.client-ip=209.85.214.202 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="xeMaEbx0" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2954d676f9dso1455925ad.0 for ; Thu, 06 Nov 2025 15:16:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1762470964; x=1763075764; 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=bf2tG0VSbGuTREXl21iJqSVPQmFIFuxPe8RAulQFiSU=; b=xeMaEbx08Izr0EBYBeICtvQU6q+mCCr8H/B4iS1/vGZW9q18QgGonmvl+e4ULOzMkD M+FEBLKyD23TFmpIt0sg4zqMOEUh+UNge3Brzgm2pjZEil+zjpDcz/+Ib4Ud4WzaLXj4 Ok8YZ5nAhHB8HpxcImlbeJKltfEBER21wmGrW9sp+pjKZ+Vae0Q3cSVe47nXQ0k9Ujsc peayfcWlL8KoL/67xuSZ6ViJyfNX113EgopXehKHTGV3/ZYCvgIsxV5Jcba1tIwW7E1b TdPG6ssZys+dbBOWiBblOZzDBCgBPKLcXWX9FToKeIPX3jaKbUGQLfNKUmDUg0wkVDTw /h1g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762470964; x=1763075764; 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=bf2tG0VSbGuTREXl21iJqSVPQmFIFuxPe8RAulQFiSU=; b=Ei76Tj3ISuQ4phJNaDAyDPmgsF21yJYMKp2X8fKI5pjpWjpp2wl48LZge3SiggL3ms mnPvqoVpbXY37j+KZfG2CjK0W/k83v6B4pXdrUAYZiM4ZTauz0ISm3jT7omjkwBBxzSb go2PwByISURY9lDTMuOD4IW8yuCtfw9FNcsmoxy3wZgsVNpjfySBmx/Bv2glSNDhSLgw feWLAhxBShOYdzXCJvbxwchZdiVffCZ60+kVlWtrWWSoe3KHajSrvG7l0bLbvItCqyB8 bKUbHNBcOkV3R6twjEjbTBMVx/dDPZuuJHfX/SfY3PgWfgpU70U/fo3b+jCeS29lUvcj 2I6w== X-Forwarded-Encrypted: i=1; AJvYcCVMxx4br4kRASZ671tojrNkmwZci81A81zTjWhpKMZtkHYVKFz6WLdhBNg0E53YSboWiM9b2ZVUBU9+4o4=@vger.kernel.org X-Gm-Message-State: AOJu0Yw1RsmSiMa8KxtzdC9zMVhz531WPKYXEqtitYOEmJTg7AnUgrAZ vXnUpyJbjpaoTw2/kzzTWB5bvhIeVy3iV7G7F6K72uc1XckNAHIRqXcFjlvsZQPzxI3giCE1F5T om06ieT7tUw== X-Google-Smtp-Source: AGHT+IFF93GvfK+PjXvMqPfUfs+sHTR0IeNpRh7CfwAQAd60QtdPtuxvWGZFwwLWH5LM0DIsyh/lKwBdwpHn X-Received: from dlbrx9.prod.google.com ([2002:a05:7022:1709:b0:119:78ff:fe16]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:1af0:b0:295:59ef:df96 with SMTP id d9443c01a7336-297c03e9c63mr13878215ad.13.1762470963377; Thu, 06 Nov 2025 15:16:03 -0800 (PST) Date: Thu, 6 Nov 2025 15:15:03 -0800 In-Reply-To: <20251106231508.448793-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: <20251106231508.448793-1-irogers@google.com> X-Mailer: git-send-email 2.51.2.1041.gc1ab5b90ca-goog Message-ID: <20251106231508.448793-14-irogers@google.com> Subject: [PATCH v2 13/18] perf test stat: Update std_output testing metric expectations From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Xu Yang , Chun-Tse Shao , Thomas Richter , Sumanth Korikkar , Collin Funk , Thomas Falcon , Howard Chu , Dapeng Mi , Levi Yun , Yang Li , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Andi Kleen , Weilin Wang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Make the expectations match json metrics rather than the previous hard coded ones. Signed-off-by: Ian Rogers --- tools/perf/tests/shell/stat+std_output.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/perf/tests/shell/stat+std_output.sh b/tools/perf/tests/s= hell/stat+std_output.sh index ec41f24299d9..9c4b92ecf448 100755 --- a/tools/perf/tests/shell/stat+std_output.sh +++ b/tools/perf/tests/shell/stat+std_output.sh @@ -12,8 +12,8 @@ set -e stat_output=3D$(mktemp /tmp/__perf_test.stat_output.std.XXXXX) =20 event_name=3D(cpu-clock task-clock context-switches cpu-migrations page-fa= ults stalled-cycles-frontend stalled-cycles-backend cycles instructions bra= nches branch-misses) -event_metric=3D("CPUs utilized" "CPUs utilized" "/sec" "/sec" "/sec" "fron= tend cycles idle" "backend cycles idle" "GHz" "insn per cycle" "/sec" "of a= ll branches") -skip_metric=3D("stalled cycles per insn" "tma_" "retiring" "frontend_bound= " "bad_speculation" "backend_bound" "TopdownL1" "percent of slots") +event_metric=3D("CPUs_utilized" "CPUs_utilized" "cs/sec" "migrations/sec" = "faults/sec" "frontend_cycles_idle" "backend_cycles_idle" "GHz" "insn_per_c= ycle" "/sec" "branch_miss_rate") +skip_metric=3D("tma_" "TopdownL1") =20 cleanup() { rm -f "${stat_output}" --=20 2.51.2.1041.gc1ab5b90ca-goog From nobody Fri Dec 19 17:18:16 2025 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (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 A38AF35A141 for ; Thu, 6 Nov 2025 23:16:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470968; cv=none; b=luDxk4WKv3eM7m8KrIhwVWWS6Wu6UA6TR2vvtTihAe8A7M89avSk/knNvwKVQZ7NcWSuA4is2Hcj/3leNoTUhwXS2HweWcA2mV5DvxsRv1U+ZuwKcg98RMNbNjwZXNXmtEzejH7IhHjG2ZFubrQ0TcQbOmT4aThc3GzxdEg1iUM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470968; c=relaxed/simple; bh=bWlWZmoSbjMlQJvhT1Kc+8bbCD51npTRBtHHE+YWJoI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=mNp4C9Ttuw3ZX47r9tDOskbiy+4SQQf9tXO0K6lqkBxXicMW2+PW16beeaPmcySGhwW7nR5I1ZF9ODGbxZTw2jAUqE4VF7AiT2x89jgIXQu1r47ngFxk5WaXp668Y+oG0HaIMW6c/DScFvt+CHiIOD3na6obE705zS6UpUd7TU0= 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=I6lfZtOY; arc=none smtp.client-ip=209.85.215.202 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="I6lfZtOY" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-b6ceeea4addso159184a12.1 for ; Thu, 06 Nov 2025 15:16:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1762470966; x=1763075766; 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=ja604hKaX8qDrZr8dkd1ADzyH8Os+oHlUQ1fcptNWsg=; b=I6lfZtOY+vYKdpXfsWpCP0LB4JY1R3IB0Oyif8bh+EzrDzPGQuCAzFn48FoU8SVYpY KQbBl0BpbePp5N4J0+kzfZc8pdPR6vBccN7oFSX90CXEWxoqESXRR3uth43rh6XhvDQl XAbbZX+iGICvo06jNAMkkWcpwxx4HTkM9b7lDrJunQ50DGsgyGBQeYBf/4Esz7yRLbfY 6RKNuK7VaEg7ueJDHttC5hwOEk7gedIixTd6Yx1GqZ7N1+AyWcErSW3mbxQkjkDKQ/Pz dklB/QhMgbTzOtw3cZGMSE3iDjsS7gl5eevYN73Ed2o9XQu/NWPjuYt+ioeWTYCsRzrr oA5g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762470966; x=1763075766; 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=ja604hKaX8qDrZr8dkd1ADzyH8Os+oHlUQ1fcptNWsg=; b=CreGIsu+C9jb8baP/sr3diGIup2ALAFKj8G/CVs2B/Ghsk8ZSNOkO/fzJaV6TVZH+Z eVYNEWBmQVqs2yzdZvZkMu6WXNVCn6PW+TZ/QhotshbrVxu8oNGRJRaz5kw1qQbLlhz7 ALmHERFRINT14zj9Y2TAZhSVyEtCJnPFojFvp/RqZTa+mbr5kFIku/DJvD/xHupIMzBf WgDZ04AA3J54nP/11hHScho0S+Pc6f2r3sq79pDlch9HpqjW7SKuvOruzsS7941Uw9MF BoX3Qf6Ar1SjaATYbk25sNspbQUOZv88xb4PpxYkVYaT1FqoX4QYMFNxlZEQxlCnMi6l QlpA== X-Forwarded-Encrypted: i=1; AJvYcCUU+SNWZHh63hs3J2QVfVzVjDOHY45exeHl+M3/NU0iO3XXN6IQS7jFWyIyzPbBOxPytyWnA00koQ8YWT0=@vger.kernel.org X-Gm-Message-State: AOJu0Yw9eZC7lBeKcLwd33EH/nA9hBdHcERsLMmxIPVP4ZOYv9eQAJVj 2PrucnDIsHwgq6etQps0D1NUpJKlbync6Nb41sT/qxyt3mLGpOQjNbJqe+hGAuKO9jenMVsMOvo krmhWpUEzEQ== X-Google-Smtp-Source: AGHT+IGlOsxlmvFm0qB6YZd991xh+uwXx3guS1pzc+tFdgny+jz5mNn6wDhurHuoiQ+/Bno1TZVtodykc9GF X-Received: from dlk17.prod.google.com ([2002:a05:7022:111:b0:119:49ca:6b87]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:2f8d:b0:295:7b8c:661c with SMTP id d9443c01a7336-297c03fe292mr15047305ad.26.1762470965861; Thu, 06 Nov 2025 15:16:05 -0800 (PST) Date: Thu, 6 Nov 2025 15:15:04 -0800 In-Reply-To: <20251106231508.448793-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: <20251106231508.448793-1-irogers@google.com> X-Mailer: git-send-email 2.51.2.1041.gc1ab5b90ca-goog Message-ID: <20251106231508.448793-15-irogers@google.com> Subject: [PATCH v2 14/18] perf test metrics: Update all metrics for possibly failing default metrics From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Xu Yang , Chun-Tse Shao , Thomas Richter , Sumanth Korikkar , Collin Funk , Thomas Falcon , Howard Chu , Dapeng Mi , Levi Yun , Yang Li , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Andi Kleen , Weilin Wang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Default metrics may use unsupported events and be ignored. These metrics shouldn't cause metric testing to fail. Signed-off-by: Ian Rogers --- tools/perf/tests/shell/stat_all_metrics.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tools/perf/tests/shell/stat_all_metrics.sh b/tools/perf/tests/= shell/stat_all_metrics.sh index 6fa585a1e34c..a7edf01b3943 100755 --- a/tools/perf/tests/shell/stat_all_metrics.sh +++ b/tools/perf/tests/shell/stat_all_metrics.sh @@ -25,8 +25,13 @@ for m in $(perf list --raw-dump metrics); do # No error result and metric shown. continue fi - if [[ "$result" =3D~ "Cannot resolve IDs for" ]] + if [[ "$result" =3D~ "Cannot resolve IDs for" || "$result" =3D~ "No supp= orted events found" ]] then + if [[ "$m" =3D=3D @(l1_prefetch_miss_rate|stalled_cycles_per_instructi= on) ]] + then + # Default metrics that may use unsupported events. + continue + fi echo "Metric contains missing events" echo $result err=3D1 # Fail --=20 2.51.2.1041.gc1ab5b90ca-goog From nobody Fri Dec 19 17:18:16 2025 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (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 4C12D35A925 for ; Thu, 6 Nov 2025 23:16:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470970; cv=none; b=EpBpNqFmDyHMmhliSPTRUBq/jJUUphoEQQu3U/Th7TVxoX3MK+Gk/OdB+gxqdg0dPejBMER3PM8V5346hWwzotQirBSRFlo6yFpYsT1XE5UwJETB+VtUHF93vo97vYeymORxcOCi/fRUgFSPymZIv3st3zPfXVNRWwdk+zhWiI8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470970; c=relaxed/simple; bh=NQZLwrJVuAq7AnAGYojD2+FNeBDfMGlmTWdY5sb/Yxo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=cly64mHsH8DOkbqGyFYsciPccjg1VlyeX0EI2cEvYhk6UvmsMdcCGn/bweICf2dOE5G5U4GlxEgM0+PCR+YIwpcizC0IEoEGGqwuJAAXuUPM4Czi/UWLVOWXTpBuJeMGS+XgtD+i/Us56Za5krrv0M7Tii3IR35Bit0nabFS9bs= 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=NWFOQQUe; arc=none smtp.client-ip=209.85.214.202 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="NWFOQQUe" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-29085106b99so2982285ad.1 for ; Thu, 06 Nov 2025 15:16:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1762470967; x=1763075767; 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=Snl9m+Gsuclyili9Jia8BWYLwnDqexlNgmsV+/z8jHs=; b=NWFOQQUe8v8/GpDgi/IMW4HZTWq3cryI1Af1I0SHMizuR/ijzlyxSuF768DZnJUQqO cvYhwbBoVufnjvwDR2CUP36PWn9FvGL8cLgmnav78K6VJwjCjlZEHVYfBmiEMUGD1Xni bT3SJnEDebyWA3nxJDn10CvxMm8aS4Y4wA2jJ8yTU3P16kUBAi2+pvN4sG37W3z6nsJM r+uPlKSx9cUUMVL3wvbMtDt3qFxXpkzLpBE53rOZFrqfvQWseTOndBb1vC+4B3ofGRF2 ZL/2456Lh/nnqg8eNs8Eze1P0F1RIbYO56BAEQm4SN6m6HcLFkHbdhhCLypBGaKLJ/sm TeQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762470967; x=1763075767; 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=Snl9m+Gsuclyili9Jia8BWYLwnDqexlNgmsV+/z8jHs=; b=MZrhijmePPX4JyA7a0gNdptlAyXWmvWZ6nd6CNevgAFdTS+83+Z2JhiCjCvCl/cBeV pUyz/gCE0MppxoZczdLs2A0PXBvnMKDLXrv4x18W2uL6GxLFfIRGpvgpZRhcAoVO7f2G MYmRzTg6QZ4CCnB/QFvtbKdLjodN70Chj+mvEdWKWL9Z2iE05vQIwPXZqaqMV2Ah8Fuh 3PRQBk6wn14NJnjXwNOuvaRrBVEsUAo2NqEj2ZvVp3j3Ra2xHylrapePxmz/mXYijaqe lGrYGrwOtj8b70WXa5EEpIU263MkKKePHiQUZy0LKm9hOn2zry6og7Hx5aInrlcpv9fY CAsw== X-Forwarded-Encrypted: i=1; AJvYcCUGqnoRCWrCVj4oEsD/A2mLo7T6PTAfkzNk0oiRvubt+wBH2r3Y8XDc1riEvc5YdC395wrlB4Y2R/xC2E4=@vger.kernel.org X-Gm-Message-State: AOJu0YyymVHGQyFlO70wS6CMacI0+bTHlVbcSJ5Hj8LirXT7wgXU8ohf iGV04/C5yaRJGDJXvbuFwOsyLEaaxmEl/RNR6KieobV2M8ly4lPggCDy5fG5yaQAHPqr1SaJZqL vubW8N5GEaA== X-Google-Smtp-Source: AGHT+IFc3t+pl+dtq2Ew3dKGXbYWje+bXWKgsuDNMN96A/1Pua+fxj/lreuHJRndBsoMYTI4pD+iANneYzz2 X-Received: from dlbps9.prod.google.com ([2002:a05:7023:889:b0:119:49ca:6bac]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:dac4:b0:262:2ae8:2517 with SMTP id d9443c01a7336-297c03936f3mr16182735ad.5.1762470967518; Thu, 06 Nov 2025 15:16:07 -0800 (PST) Date: Thu, 6 Nov 2025 15:15:05 -0800 In-Reply-To: <20251106231508.448793-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: <20251106231508.448793-1-irogers@google.com> X-Mailer: git-send-email 2.51.2.1041.gc1ab5b90ca-goog Message-ID: <20251106231508.448793-16-irogers@google.com> Subject: [PATCH v2 15/18] perf test stat: Update shadow test to use metrics From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Xu Yang , Chun-Tse Shao , Thomas Richter , Sumanth Korikkar , Collin Funk , Thomas Falcon , Howard Chu , Dapeng Mi , Levi Yun , Yang Li , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Andi Kleen , Weilin Wang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Previously '-e cycles,instructions' would implicitly create an IPC metric. This now has to be explicit with '-M insn_per_cycle'. Signed-off-by: Ian Rogers --- tools/perf/tests/shell/stat+shadow_stat.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/perf/tests/shell/stat+shadow_stat.sh b/tools/perf/tests/= shell/stat+shadow_stat.sh index 8824f445d343..cabbbf17c662 100755 --- a/tools/perf/tests/shell/stat+shadow_stat.sh +++ b/tools/perf/tests/shell/stat+shadow_stat.sh @@ -14,7 +14,7 @@ perf stat -a -e cycles sleep 1 2>&1 | grep -e cpu_core &&= exit 2 =20 test_global_aggr() { - perf stat -a --no-big-num -e cycles,instructions sleep 1 2>&1 | \ + perf stat -a --no-big-num -M insn_per_cycle sleep 1 2>&1 | \ grep -e cycles -e instructions | \ while read num evt _ ipc rest do @@ -53,7 +53,7 @@ test_global_aggr() =20 test_no_aggr() { - perf stat -a -A --no-big-num -e cycles,instructions sleep 1 2>&1 | \ + perf stat -a -A --no-big-num -M insn_per_cycle sleep 1 2>&1 | \ grep ^CPU | \ while read cpu num evt _ ipc rest do --=20 2.51.2.1041.gc1ab5b90ca-goog From nobody Fri Dec 19 17:18:16 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 8B68635A93C for ; Thu, 6 Nov 2025 23:16:10 +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=1762470972; cv=none; b=ZE9NMKhs6LPUqKzT4MN0NYPY43ZtuEj4FC//klqxZYXyxtBBzmRX4sw0Z3kNthcC9j4Xd2n54Digcuw/MitkyKNVg8d7F5ABFde9DWenwsn+/IW8BP2o6uBRArv9VwbA3Z0m6GzunurvSbBSLJHrLvGNj6aoJ18ZCYfapLsmz48= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470972; c=relaxed/simple; bh=LLn9FDAlPcwSWZjUFvp9EB4XY1jJAmyC35CaM/eue2A=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=MNEfsCC1V2C6L08zby1w3Y0c8+JUA4ieJHsPq7LzOpv7B7cGgdjjxSH/8EOGzNFNPn2MLilA4kl88Rxa1tVT4o+yasYXGlkcVlefJfqJPmuHFKaFHlMJv5Or2cYzgmnsWwRVJZuGAgU9UuNpkxQrkZ/YANJ0dXNWtPFdRVi5gxY= 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=1NLcQ74E; 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="1NLcQ74E" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-297b355d33eso2093055ad.2 for ; Thu, 06 Nov 2025 15:16:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1762470970; x=1763075770; 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=5Et4hjqXaxJjcCbzTA1Cjej6Oy43GlvxgQk6XgvQSd0=; b=1NLcQ74EZgycn3kNOtoGOgJIIjzLWz/BF7TUsHn9xcXkoq7AzNkTY6Wng8zgvJTDph uVw4D7ZP2mhh3r5Z04VJ11X7mjfKTc+ZOv0EDwEXvmExAPKkvT0SZekY8BmrqxTRnhd3 UT71wtsvrrmF7sWrHxT++6ILcNA4DP+auE6wUnO5GzZRqRiItMWQOuY66IEwrW/rew7z 9shjHLeqJ616FO2goCvdQHQtJEGKe8yWDKbnjsdI2unpZABp6GsmaZ0eUuV2B+v5ciC0 P5tPCgz4WU2yw58mJVdIkMI6Tap2cHmoepDwilC1qyD4c5GBaL8evrK0yqJMmes06XLv 6Qmw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762470970; x=1763075770; 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=5Et4hjqXaxJjcCbzTA1Cjej6Oy43GlvxgQk6XgvQSd0=; b=X0XBgoC0WzCSUxMYBZULNJGjTeWxUlplyRtPH2GYtc/MuqMl8lYoDjZJZsy01kLEbc HYTf3BmoJAkkmApmcgh94GbHClwqycD12bWxhVpbxp9KZuMOJYxvQt8IWQjBohJ0l4DR Do1d1mIWm0cAbGBvdy3H2EpzNsos8lLzyPbOaKFb6M1tmG02CPlXe7bTWfF6kQWQM4gd PwPtr9Nwre1dkCnw4zArRaAjWDadPUXzYazkat8/02mLDJwaWOHFIoPHWBUCLPd/KwWB Fht+QvL1Js/eQ+h8W6u1tC381b0QtTGZhMLiagQLoJJtOepdrIFGry0oDNzmQlz/68xh TieA== X-Forwarded-Encrypted: i=1; AJvYcCXhC6Jkh8MKsG3dWjMWNR7XJ0r+Kqxj1zNm+OzQ58XD9fwrG8hgW2hs5I5ABhcybsrEFQ+C65MzWpf8ChE=@vger.kernel.org X-Gm-Message-State: AOJu0YxM5Kru7X2PbduHcTlMxHF2JwKOZWhiZgc5dKwG2X56nwIhujpS R9hxnar1DXqZTBli8QucOVS5hrmBB06NTG7reqJ0UpS5vo4sOVlrpKwmzxx3baGc1tj1ryT3w9t gthYNPtfM3g== X-Google-Smtp-Source: AGHT+IFCzEWuu8E6wOVwBRXCBSsioiFshS7Q4FDnLNqnIcuUiZKmhlPwpMmYDVVdcfSiH6o8aL2K6ccpLJe+ X-Received: from dlbqs13.prod.google.com ([2002:a05:7023:d0d:b0:119:b185:ea75]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:dacf:b0:27e:ee83:fc80 with SMTP id d9443c01a7336-297c04aaa05mr14080615ad.57.1762470969776; Thu, 06 Nov 2025 15:16:09 -0800 (PST) Date: Thu, 6 Nov 2025 15:15:06 -0800 In-Reply-To: <20251106231508.448793-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: <20251106231508.448793-1-irogers@google.com> X-Mailer: git-send-email 2.51.2.1041.gc1ab5b90ca-goog Message-ID: <20251106231508.448793-17-irogers@google.com> Subject: [PATCH v2 16/18] perf test stat: Update test expectations and events From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Xu Yang , Chun-Tse Shao , Thomas Richter , Sumanth Korikkar , Collin Funk , Thomas Falcon , Howard Chu , Dapeng Mi , Levi Yun , Yang Li , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Andi Kleen , Weilin Wang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" test_stat_record_report and test_stat_record_script used default output which triggers a bug when sending metrics. As this isn't relevant to the test switch to using named software events. Update the match in test_hybrid as the cycles event is now cpu-cycles to workaround potential ARM issues. Signed-off-by: Ian Rogers --- tools/perf/tests/shell/stat.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/perf/tests/shell/stat.sh b/tools/perf/tests/shell/stat.sh index 8a100a7f2dc1..985adc02749e 100755 --- a/tools/perf/tests/shell/stat.sh +++ b/tools/perf/tests/shell/stat.sh @@ -18,7 +18,7 @@ test_default_stat() { =20 test_stat_record_report() { echo "stat record and report test" - if ! perf stat record -o - true | perf stat report -i - 2>&1 | \ + if ! perf stat record -e task-clock -o - true | perf stat report -i - 2>= &1 | \ grep -E -q "Performance counter stats for 'pipe':" then echo "stat record and report test [Failed]" @@ -30,7 +30,7 @@ test_stat_record_report() { =20 test_stat_record_script() { echo "stat record and script test" - if ! perf stat record -o - true | perf script -i - 2>&1 | \ + if ! perf stat record -e task-clock -o - true | perf script -i - 2>&1 | \ grep -E -q "CPU[[:space:]]+THREAD[[:space:]]+VAL[[:space:]]+ENA[[:spac= e:]]+RUN[[:space:]]+TIME[[:space:]]+EVENT" then echo "stat record and script test [Failed]" @@ -196,7 +196,7 @@ test_hybrid() { fi =20 # Run default Perf stat - cycles_events=3D$(perf stat -- true 2>&1 | grep -E "/cycles/[uH]*| cycl= es[:uH]* " -c) + cycles_events=3D$(perf stat -a -- sleep 0.1 2>&1 | grep -E "/cpu-cycles/= [uH]*| cpu-cycles[:uH]* " -c) =20 # The expectation is that default output will have a cycles events on ea= ch # hybrid PMU. In situations with no cycles PMU events, like virtualized,= this --=20 2.51.2.1041.gc1ab5b90ca-goog From nobody Fri Dec 19 17:18:16 2025 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (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 A99A835B129 for ; Thu, 6 Nov 2025 23:16:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470974; cv=none; b=FPXD8yCDmx0Bdw124k4NakNuBwz0cV/B23n3JmuMeSVSQvT+fB5WomHVinWUvpY3nPA+GJjY+mNytXjaK0cmj3sepQJbyLoCdAdnSaMVhghfLB9YoOI3wyGf4nw2Vl/aFVNVsbH3/J3WdYxpp3R6DSJcAznRQkpXN9ZwSjL+zzw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470974; c=relaxed/simple; bh=sWmDIev9bpAFqHQEit38MtJHcI5r4PnZTO5Rq4PESvU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=eeQU+HVWHPEklX7JhMP0S63AWvHtONGczuPLdVS88PHGO7NO5LStRxteuiomqIBq/FWE82M9pXwPzaOcSTTxRDQ32Qk5PxYNCwj22DsBaz5ewDsz6YvYFyq2KofMvxsdowutiGkPFrX48j5+A3lI630OWseWN1atFrwScywKpj4= 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=D2ci66lE; arc=none smtp.client-ip=209.85.214.202 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="D2ci66lE" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2930e2e8e7fso1950875ad.2 for ; Thu, 06 Nov 2025 15:16:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1762470972; x=1763075772; 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=9rrubnbGxO/GZTc54MaEZH3FM5tqPTfV8BFx99302Q0=; b=D2ci66lE5nc0lGXVaHHf5foxMEWSar90Mj1MkBNZKKbUWirP+ujQsdEXq0FPvy7257 +2ImzMEvwIX4WmjM0psZuDeL6tvABEjRGCrvogSXSXg0HUZfKlsxeIP5CVoKKh7jLMej zP+9i965PrpoiLUztK1/5Yui+xiLS7nnrWOTsRHBK1f4a44iQRrWxL6hCi61eleJcVr2 jA44uVOQEqNjs5YdH03GDfhlAuhkkiU+vmq7V349CNHbApR6Mm+7nNRGhnQi5w8qExXh wXWxPkGNiyQbYCpmQnF2EY+ljetsb28qn/gyOspe9bwSTCR7sNzdyRL4/Ev4+emliuIX frQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762470972; x=1763075772; 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=9rrubnbGxO/GZTc54MaEZH3FM5tqPTfV8BFx99302Q0=; b=AG8e9rSUhCr9hxjHnXpu28NDYEOYIRTWJ8V1jn11kYn8Rucj9fW42+7oBJEB5wcKU/ N7BUOYJ4QrZFBzDpXYOi0CLQir2R8ee4hJV5atOGHZ8/D8jDpt/h9Wf9utdoQIxxe7hh LO4uFp5/HU9d8pQyXT9HxnACl3MiHQNiyZ0dI6cld/tLxcqKOvrjENuF4uTWKLYVKjCh KbuMMLwdI1UWqjPWY9NOBAviq9qxByUVZtviFw37i5BMYMbZan1edTAQKE85l7QAkuqq /BH35hk4v8VO4dBI9wNu6QizqwfcOCIkYIxA7oT7lH0rYXcuubcP5hHcqlREwhZ3PA7G Xpkw== X-Forwarded-Encrypted: i=1; AJvYcCW0qh3vjnTjmvDlsuK97y9f4S1UzPWzQdY3j791VXbd/aUkyolnt0CvdSAhgQ9/wP/Nf1tA2EoOLSNa/oQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yzc+ZXWrxn0ABI9JAwF5DdSZ6/HJ+Gc5Dh9ytc9/LOGLHAs6ccc zhNgL0TUdNjNdiSEIlnb8OqNhYrPYOP7noKg8xCdhzvX7atsUwy5hjsWxJOcbnWHQR/ziD5WVfI KYftwrKfq6g== X-Google-Smtp-Source: AGHT+IGBJoqUSUV5oY44MlCZl/Yj+DzzQV47ahJQCa0URDEki8/IhMDxl1V00M/JS6qtnjUKZxP5yWJpJHYa X-Received: from dlii34.prod.google.com ([2002:a05:7022:41a2:b0:119:c6ec:cc42]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:d481:b0:23f:fa79:15d0 with SMTP id d9443c01a7336-297c04545b0mr16134955ad.46.1762470971950; Thu, 06 Nov 2025 15:16:11 -0800 (PST) Date: Thu, 6 Nov 2025 15:15:07 -0800 In-Reply-To: <20251106231508.448793-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: <20251106231508.448793-1-irogers@google.com> X-Mailer: git-send-email 2.51.2.1041.gc1ab5b90ca-goog Message-ID: <20251106231508.448793-18-irogers@google.com> Subject: [PATCH v2 17/18] perf test stat csv: Update test expectations and events From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Xu Yang , Chun-Tse Shao , Thomas Richter , Sumanth Korikkar , Collin Funk , Thomas Falcon , Howard Chu , Dapeng Mi , Levi Yun , Yang Li , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Andi Kleen , Weilin Wang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Explicitly use a metric rather than implicitly expecting '-e instructions,cycles' to produce a metric. Use a metric with software events to make it more compatible. Signed-off-by: Ian Rogers --- tools/perf/tests/shell/lib/stat_output.sh | 2 +- tools/perf/tests/shell/stat+csv_output.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/perf/tests/shell/lib/stat_output.sh b/tools/perf/tests/s= hell/lib/stat_output.sh index c2ec7881ec1d..3c36e80fe422 100644 --- a/tools/perf/tests/shell/lib/stat_output.sh +++ b/tools/perf/tests/shell/lib/stat_output.sh @@ -156,7 +156,7 @@ check_metric_only() echo "[Skip] CPU-measurement counter facility not installed" return fi - perf stat --metric-only $2 -e instructions,cycles true + perf stat --metric-only $2 -M page_faults_per_second true commachecker --metric-only echo "[Success]" } diff --git a/tools/perf/tests/shell/stat+csv_output.sh b/tools/perf/tests/s= hell/stat+csv_output.sh index 7a6f6e177402..cd6fff597091 100755 --- a/tools/perf/tests/shell/stat+csv_output.sh +++ b/tools/perf/tests/shell/stat+csv_output.sh @@ -44,7 +44,7 @@ function commachecker() ;; "--per-die") exp=3D8 ;; "--per-cluster") exp=3D8 ;; "--per-cache") exp=3D8 - ;; "--metric-only") exp=3D2 + ;; "--metric-only") exp=3D1 esac =20 while read line --=20 2.51.2.1041.gc1ab5b90ca-goog From nobody Fri Dec 19 17:18:16 2025 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (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 673BB35B13F for ; Thu, 6 Nov 2025 23:16:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470977; cv=none; b=pbHbJS8c7+ehVLrvnN0w2wMliqPczylv+QQGDo56xYanaCITKorvgyND0H7M7G0dWCEEWRe0rJ51OQDs9X/FKhhoarZ0lqgXw4XOaDhav9pQ8lBRDxQ/GPbk0pjD7CZG1N3IyGfHIkiv8/fch+Q1pkhawqzc8ASw7Tyd27R6+Vw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762470977; c=relaxed/simple; bh=AFcs6+rjxtStyzpkioRSsmyt39X8o4eClMImkcveLCE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=H3Dx1d4vZj8EbwJEAxb5FlWjWV8AtpBsXZt+KZKPmctBuuGgcmM/Kr9sXM0gFkSJkcUOnf5dUoBL1edY3iNDqk+syNdCmRDMO3rUuYF5LqXelPIAcdKJwzub9OUAkQgJSw+DlrrMC2hd1nUeoTgNxrGr/A04pGc1mpJxmMIcgv8= 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=c8aL5Xy7; arc=none smtp.client-ip=209.85.214.202 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="c8aL5Xy7" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2930e2e8e7fso1951055ad.2 for ; Thu, 06 Nov 2025 15:16:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1762470974; x=1763075774; darn=vger.kernel.org; h=content-transfer-encoding:to:from:subject:message-id:references :mime-version:in-reply-to:date:from:to:cc:subject:date:message-id :reply-to; bh=8cRYA0ERZ0V23DLhAFevtzUM8W7rleEmFjmg1uBWjV8=; b=c8aL5Xy7IlaxJtDiDUC8ol5vnCbZomRrcDZd0gJBn28azGDJ4pQHSMekb7TOm+mwIg +9eqpmueqbkU+A5ooXV6vILQXUMX2KBF7XfVpwd4LsiO87pte0XZBvTVjlZVg5ISE2m5 D7RKyL634IlRDjJM4wUbaYS4ocKL+QHE2C6sqRIkFZXijeU64DPqHY4dw6b5hdPh2pCZ C0YVCAfps3fZ61Y2EHMJYa0FHnmIrQR+8oxpBEtPUfV4NmogwlmtaErv/RtltnYiC6Nx IG255LokArGpPDD6bwWFhJYQoQa+izMW6FbAUo2ytS1knL+lOq4Z0HUMJA5Ue8RDPEeZ 2ZzA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762470974; x=1763075774; h=content-transfer-encoding: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=8cRYA0ERZ0V23DLhAFevtzUM8W7rleEmFjmg1uBWjV8=; b=rcdajEaHvvNS2k85pXclT8iT6x5HW2wUPXknt5uEprb7CVmLf0dGjTrEBSJHBzmJDz u7cLBX/4PYNISXp9f/6YSCxc/EGfsT+Vf5NGd+Jj09WxSnwSThHi8L7xRHaccLzp4Hmp 7x4qCceDr7F6BhoYn2LgKTSIGsZ1+5xl7pGIYOUxY2G3s5HBCX5vMBjZ8ah+jpoFlUVF 4OHFsxbg9RhDesshLYNlCIKZ06AxyrwW5aok21e/cpcB8+hEnPXBZ+M21uFx8Gvn0lrI Yp3sW7TzmUxngnWNpQazSmipGRCYGtOarrsy0CFZgD3eHfYcTn7d+gV8h/av9+6OWL9y KSxQ== X-Forwarded-Encrypted: i=1; AJvYcCUWdw9/MHCaYt+sOimLs5UoePTSYlntj+cSyKgIc30l2kFTEp2eVHEbCOm9vpWF5eedwV4S2vehMeR1RYg=@vger.kernel.org X-Gm-Message-State: AOJu0Yw3liFTk+T7RAVUVeMUa2ephJnh6NfYZUw7E2TNpPi19SBKiuk+ Y33Z/00LRwl56mYNgRn0FJc5ExNvfUpb3smnyp6RYOyW0cb+hSkw6SD72W8Hzf4CfyDQP9BrNit teqv+SExABQ== X-Google-Smtp-Source: AGHT+IF6plEej6OlCU/kCAZQl6PR6TsZQAaYuBXrN9z+AncmSBmk5WknCrMJ0N+I06n2TLUteFZEdWBtsc68 X-Received: from dlf6.prod.google.com ([2002:a05:7022:406:b0:119:b185:ea6d]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:1585:b0:295:589a:d12a with SMTP id d9443c01a7336-297c0380fc3mr11675455ad.8.1762470973640; Thu, 06 Nov 2025 15:16:13 -0800 (PST) Date: Thu, 6 Nov 2025 15:15:08 -0800 In-Reply-To: <20251106231508.448793-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: <20251106231508.448793-1-irogers@google.com> X-Mailer: git-send-email 2.51.2.1041.gc1ab5b90ca-goog Message-ID: <20251106231508.448793-19-irogers@google.com> Subject: [PATCH v2 18/18] perf tool_pmu: Make core_wide and target_cpu json events From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Xu Yang , Chun-Tse Shao , Thomas Richter , Sumanth Korikkar , Collin Funk , Thomas Falcon , Howard Chu , Dapeng Mi , Levi Yun , Yang Li , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Andi Kleen , Weilin Wang Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" For the sake of better documentation, add core_wide and target_cpu to the tool.json. When the values of system_wide and user_requested_cpu_list are unknown, use the values from the global stat_config. Example output showing how '-a' modifies the values in `perf stat`: ``` $ perf stat -e core_wide,target_cpu true Performance counter stats for 'true': 0 core_wide 0 target_cpu 0.000993787 seconds time elapsed 0.001128000 seconds user 0.000000000 seconds sys $ perf stat -e core_wide,target_cpu -a true Performance counter stats for 'system wide': 1 core_wide 1 target_cpu 0.002271723 seconds time elapsed $ perf list ... tool: core_wide [1 if not SMT,if SMT are events being gathered on all SMT threads 1 = otherwise 0. Unit: tool] ... target_cpu [1 if CPUs being analyzed,0 if threads/processes. Unit: tool] ... ``` Signed-off-by: Ian Rogers --- .../pmu-events/arch/common/common/tool.json | 12 + tools/perf/pmu-events/empty-pmu-events.c | 228 +++++++++--------- tools/perf/util/expr.c | 11 +- tools/perf/util/stat-shadow.c | 2 + tools/perf/util/tool_pmu.c | 24 +- tools/perf/util/tool_pmu.h | 9 +- 6 files changed, 163 insertions(+), 123 deletions(-) diff --git a/tools/perf/pmu-events/arch/common/common/tool.json b/tools/per= f/pmu-events/arch/common/common/tool.json index 12f2ef1813a6..14d0d60a1976 100644 --- a/tools/perf/pmu-events/arch/common/common/tool.json +++ b/tools/perf/pmu-events/arch/common/common/tool.json @@ -70,5 +70,17 @@ "EventName": "system_tsc_freq", "BriefDescription": "The amount a Time Stamp Counter (TSC) increases p= er second", "ConfigCode": "12" + }, + { + "Unit": "tool", + "EventName": "core_wide", + "BriefDescription": "1 if not SMT, if SMT are events being gathered on= all SMT threads 1 otherwise 0", + "ConfigCode": "13" + }, + { + "Unit": "tool", + "EventName": "target_cpu", + "BriefDescription": "1 if CPUs being analyzed, 0 if threads/processes", + "ConfigCode": "14" } ] diff --git a/tools/perf/pmu-events/empty-pmu-events.c b/tools/perf/pmu-even= ts/empty-pmu-events.c index e882c645fbbe..be904c243f80 100644 --- a/tools/perf/pmu-events/empty-pmu-events.c +++ b/tools/perf/pmu-events/empty-pmu-events.c @@ -1279,62 +1279,64 @@ static const char *const big_c_string =3D /* offset=3D125873 */ "slots\000tool\000Number of functional units that in= parallel can execute parts of an instruction\000config=3D0xa\000\00000\000= \000\000\000\000" /* offset=3D125983 */ "smt_on\000tool\0001 if simultaneous multithreading = (aka hyperthreading) is enable otherwise 0\000config=3D0xb\000\00000\000\00= 0\000\000\000" /* offset=3D126090 */ "system_tsc_freq\000tool\000The amount a Time Stamp = Counter (TSC) increases per second\000config=3D0xc\000\00000\000\000\000\00= 0\000" -/* offset=3D126189 */ "bp_l1_btb_correct\000branch\000L1 BTB Correction\00= 0event=3D0x8a\000\00000\000\000\000\000\000" -/* offset=3D126251 */ "bp_l2_btb_correct\000branch\000L2 BTB Correction\00= 0event=3D0x8b\000\00000\000\000\000\000\000" -/* offset=3D126313 */ "l3_cache_rd\000cache\000L3 cache access, read\000ev= ent=3D0x40\000\00000\000\000\000\000Attributable Level 3 cache access, read= \000" -/* offset=3D126411 */ "segment_reg_loads.any\000other\000Number of segment= register loads\000event=3D6,period=3D200000,umask=3D0x80\000\00000\000\000= \000\000\000" -/* offset=3D126513 */ "dispatch_blocked.any\000other\000Memory cluster sig= nals to block micro-op dispatch for any reason\000event=3D9,period=3D200000= ,umask=3D0x20\000\00000\000\000\000\000\000" -/* offset=3D126646 */ "eist_trans\000other\000Number of Enhanced Intel Spe= edStep(R) Technology (EIST) transitions\000event=3D0x3a,period=3D200000\000= \00000\000\000\000\000\000" -/* offset=3D126764 */ "hisi_sccl,ddrc\000" -/* offset=3D126779 */ "uncore_hisi_ddrc.flux_wcmd\000uncore\000DDRC write = commands\000event=3D2\000\00000\000\000\000\000\000" -/* offset=3D126849 */ "uncore_cbox\000" -/* offset=3D126861 */ "unc_cbo_xsnp_response.miss_eviction\000uncore\000A = cross-core snoop resulted from L3 Eviction which misses in some processor c= ore\000event=3D0x22,umask=3D0x81\000\00000\000\000\000\000\000" -/* offset=3D127015 */ "event-hyphen\000uncore\000UNC_CBO_HYPHEN\000event= =3D0xe0\000\00000\000\000\000\000\000" -/* offset=3D127069 */ "event-two-hyph\000uncore\000UNC_CBO_TWO_HYPH\000eve= nt=3D0xc0\000\00000\000\000\000\000\000" -/* offset=3D127127 */ "hisi_sccl,l3c\000" -/* offset=3D127141 */ "uncore_hisi_l3c.rd_hit_cpipe\000uncore\000Total rea= d hits\000event=3D7\000\00000\000\000\000\000\000" -/* offset=3D127209 */ "uncore_imc_free_running\000" -/* offset=3D127233 */ "uncore_imc_free_running.cache_miss\000uncore\000Tot= al cache misses\000event=3D0x12\000\00000\000\000\000\000\000" -/* offset=3D127313 */ "uncore_imc\000" -/* offset=3D127324 */ "uncore_imc.cache_hits\000uncore\000Total cache hits= \000event=3D0x34\000\00000\000\000\000\000\000" -/* offset=3D127389 */ "uncore_sys_ddr_pmu\000" -/* offset=3D127408 */ "sys_ddr_pmu.write_cycles\000uncore\000ddr write-cyc= les event\000event=3D0x2b\000v8\00000\000\000\000\000\000" -/* offset=3D127484 */ "uncore_sys_ccn_pmu\000" -/* offset=3D127503 */ "sys_ccn_pmu.read_cycles\000uncore\000ccn read-cycle= s event\000config=3D0x2c\0000x01\00000\000\000\000\000\000" -/* offset=3D127580 */ "uncore_sys_cmn_pmu\000" -/* offset=3D127599 */ "sys_cmn_pmu.hnf_cache_miss\000uncore\000Counts tota= l cache misses in first lookup result (high priority)\000eventid=3D1,type= =3D5\000(434|436|43c|43a).*\00000\000\000\000\000\000" -/* offset=3D127742 */ "CPUs_utilized\000Default\000(software@cpu\\-clock\\= ,name\\=3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,name\\= =3Dtask\\-clock@) / (duration_time * 1e9)\000\000Average CPU utilization\00= 0\0001CPUs\000\000\000\000011" -/* offset=3D127928 */ "cs_per_second\000Default\000software@context\\-swit= ches\\,name\\=3Dcontext\\-switches@ * 1e9 / (software@cpu\\-clock\\,name\\= =3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\= -clock@)\000\000Context switches per CPU second\000\0001cs/sec\000\000\000\= 000011" -/* offset=3D128161 */ "migrations_per_second\000Default\000software@cpu\\-= migrations\\,name\\=3Dcpu\\-migrations@ * 1e9 / (software@cpu\\-clock\\,nam= e\\=3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtas= k\\-clock@)\000\000Process migrations to a new CPU per CPU second\000\0001m= igrations/sec\000\000\000\000011" -/* offset=3D128421 */ "page_faults_per_second\000Default\000software@page\= \-faults\\,name\\=3Dpage\\-faults@ * 1e9 / (software@cpu\\-clock\\,name\\= =3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\= -clock@)\000\000Page faults per CPU second\000\0001faults/sec\000\000\000\0= 00011" -/* offset=3D128652 */ "insn_per_cycle\000Default\000instructions / cpu\\-c= ycles\000insn_per_cycle < 1\000Instructions Per Cycle\000\0001instructions\= 000\000\000\000001" -/* offset=3D128765 */ "stalled_cycles_per_instruction\000Default\000max(st= alled\\-cycles\\-frontend, stalled\\-cycles\\-backend) / instructions\000\0= 00Max front or backend stalls per instruction\000\000\000\000\000\000001" -/* offset=3D128929 */ "frontend_cycles_idle\000Default\000stalled\\-cycles= \\-frontend / cpu\\-cycles\000frontend_cycles_idle > 0.1\000Frontend stalls= per cycle\000\000\000\000\000\000001" -/* offset=3D129059 */ "backend_cycles_idle\000Default\000stalled\\-cycles\= \-backend / cpu\\-cycles\000backend_cycles_idle > 0.2\000Backend stalls per= cycle\000\000\000\000\000\000001" -/* offset=3D129185 */ "cycles_frequency\000Default\000cpu\\-cycles / (soft= ware@cpu\\-clock\\,name\\=3Dcpu\\-clock@ if #target_cpu else software@task\= \-clock\\,name\\=3Dtask\\-clock@)\000\000Cycles per CPU second\000\0001GHz\= 000\000\000\000011" -/* offset=3D129361 */ "branch_frequency\000Default\000branches / (software= @cpu\\-clock\\,name\\=3Dcpu\\-clock@ if #target_cpu else software@task\\-cl= ock\\,name\\=3Dtask\\-clock@)\000\000Branches per CPU second\000\0001000K/s= ec\000\000\000\000011" -/* offset=3D129541 */ "branch_miss_rate\000Default\000branch\\-misses / br= anches\000branch_miss_rate > 0.05\000Branch miss rate\000\000100%\000\000\0= 00\000001" -/* offset=3D129645 */ "l1d_miss_rate\000Default2\000L1\\-dcache\\-load\\-m= isses / L1\\-dcache\\-loads\000l1d_miss_rate > 0.05\000L1D miss rate\000\0= 00100%\000\000\000\000001" -/* offset=3D129761 */ "llc_miss_rate\000Default2\000LLC\\-load\\-misses / = LLC\\-loads\000llc_miss_rate > 0.05\000LLC miss rate\000\000100%\000\000\00= 0\000001" -/* offset=3D129862 */ "l1i_miss_rate\000Default3\000L1\\-icache\\-load\\-m= isses / L1\\-icache\\-loads\000l1i_miss_rate > 0.05\000L1I miss rate\000\00= 0100%\000\000\000\000001" -/* offset=3D129977 */ "dtlb_miss_rate\000Default3\000dTLB\\-load\\-misses = / dTLB\\-loads\000dtlb_miss_rate > 0.05\000dTLB miss rate\000\000100%\000\0= 00\000\000001" -/* offset=3D130083 */ "itlb_miss_rate\000Default3\000iTLB\\-load\\-misses = / iTLB\\-loads\000itlb_miss_rate > 0.05\000iTLB miss rate\000\000100%\000\0= 00\000\000001" -/* offset=3D130189 */ "l1_prefetch_miss_rate\000Default4\000L1\\-dcache\\-= prefetch\\-misses / L1\\-dcache\\-prefetches\000l1_prefetch_miss_rate > 0.0= 5\000L1 prefetch miss rate\000\000100%\000\000\000\000001" -/* offset=3D130337 */ "CPI\000\0001 / IPC\000\000\000\000\000\000\000\0000= 00" -/* offset=3D130360 */ "IPC\000group1\000inst_retired.any / cpu_clk_unhalte= d.thread\000\000\000\000\000\000\000\000000" -/* offset=3D130424 */ "Frontend_Bound_SMT\000\000idq_uops_not_delivered.co= re / (4 * (cpu_clk_unhalted.thread / 2 * (1 + cpu_clk_unhalted.one_thread_a= ctive / cpu_clk_unhalted.ref_xclk)))\000\000\000\000\000\000\000\000000" -/* offset=3D130591 */ "dcache_miss_cpi\000\000l1d\\-loads\\-misses / inst_= retired.any\000\000\000\000\000\000\000\000000" -/* offset=3D130656 */ "icache_miss_cycles\000\000l1i\\-loads\\-misses / in= st_retired.any\000\000\000\000\000\000\000\000000" -/* offset=3D130724 */ "cache_miss_cycles\000group1\000dcache_miss_cpi + ic= ache_miss_cycles\000\000\000\000\000\000\000\000000" -/* offset=3D130796 */ "DCache_L2_All_Hits\000\000l2_rqsts.demand_data_rd_h= it + l2_rqsts.pf_hit + l2_rqsts.rfo_hit\000\000\000\000\000\000\000\000000" -/* offset=3D130891 */ "DCache_L2_All_Miss\000\000max(l2_rqsts.all_demand_d= ata_rd - l2_rqsts.demand_data_rd_hit, 0) + l2_rqsts.pf_miss + l2_rqsts.rfo_= miss\000\000\000\000\000\000\000\000000" -/* offset=3D131026 */ "DCache_L2_All\000\000DCache_L2_All_Hits + DCache_L2= _All_Miss\000\000\000\000\000\000\000\000000" -/* offset=3D131091 */ "DCache_L2_Hits\000\000d_ratio(DCache_L2_All_Hits, D= Cache_L2_All)\000\000\000\000\000\000\000\000000" -/* offset=3D131160 */ "DCache_L2_Misses\000\000d_ratio(DCache_L2_All_Miss,= DCache_L2_All)\000\000\000\000\000\000\000\000000" -/* offset=3D131231 */ "M1\000\000ipc + M2\000\000\000\000\000\000\000\0000= 00" -/* offset=3D131254 */ "M2\000\000ipc + M1\000\000\000\000\000\000\000\0000= 00" -/* offset=3D131277 */ "M3\000\0001 / M3\000\000\000\000\000\000\000\000000" -/* offset=3D131298 */ "L1D_Cache_Fill_BW\000\00064 * l1d.replacement / 1e9= / duration_time\000\000\000\000\000\000\000\000000" +/* offset=3D126189 */ "core_wide\000tool\0001 if not SMT, if SMT are event= s being gathered on all SMT threads 1 otherwise 0\000config=3D0xd\000\00000= \000\000\000\000\000" +/* offset=3D126303 */ "target_cpu\000tool\0001 if CPUs being analyzed, 0 i= f threads/processes\000config=3D0xe\000\00000\000\000\000\000\000" +/* offset=3D126387 */ "bp_l1_btb_correct\000branch\000L1 BTB Correction\00= 0event=3D0x8a\000\00000\000\000\000\000\000" +/* offset=3D126449 */ "bp_l2_btb_correct\000branch\000L2 BTB Correction\00= 0event=3D0x8b\000\00000\000\000\000\000\000" +/* offset=3D126511 */ "l3_cache_rd\000cache\000L3 cache access, read\000ev= ent=3D0x40\000\00000\000\000\000\000Attributable Level 3 cache access, read= \000" +/* offset=3D126609 */ "segment_reg_loads.any\000other\000Number of segment= register loads\000event=3D6,period=3D200000,umask=3D0x80\000\00000\000\000= \000\000\000" +/* offset=3D126711 */ "dispatch_blocked.any\000other\000Memory cluster sig= nals to block micro-op dispatch for any reason\000event=3D9,period=3D200000= ,umask=3D0x20\000\00000\000\000\000\000\000" +/* offset=3D126844 */ "eist_trans\000other\000Number of Enhanced Intel Spe= edStep(R) Technology (EIST) transitions\000event=3D0x3a,period=3D200000\000= \00000\000\000\000\000\000" +/* offset=3D126962 */ "hisi_sccl,ddrc\000" +/* offset=3D126977 */ "uncore_hisi_ddrc.flux_wcmd\000uncore\000DDRC write = commands\000event=3D2\000\00000\000\000\000\000\000" +/* offset=3D127047 */ "uncore_cbox\000" +/* offset=3D127059 */ "unc_cbo_xsnp_response.miss_eviction\000uncore\000A = cross-core snoop resulted from L3 Eviction which misses in some processor c= ore\000event=3D0x22,umask=3D0x81\000\00000\000\000\000\000\000" +/* offset=3D127213 */ "event-hyphen\000uncore\000UNC_CBO_HYPHEN\000event= =3D0xe0\000\00000\000\000\000\000\000" +/* offset=3D127267 */ "event-two-hyph\000uncore\000UNC_CBO_TWO_HYPH\000eve= nt=3D0xc0\000\00000\000\000\000\000\000" +/* offset=3D127325 */ "hisi_sccl,l3c\000" +/* offset=3D127339 */ "uncore_hisi_l3c.rd_hit_cpipe\000uncore\000Total rea= d hits\000event=3D7\000\00000\000\000\000\000\000" +/* offset=3D127407 */ "uncore_imc_free_running\000" +/* offset=3D127431 */ "uncore_imc_free_running.cache_miss\000uncore\000Tot= al cache misses\000event=3D0x12\000\00000\000\000\000\000\000" +/* offset=3D127511 */ "uncore_imc\000" +/* offset=3D127522 */ "uncore_imc.cache_hits\000uncore\000Total cache hits= \000event=3D0x34\000\00000\000\000\000\000\000" +/* offset=3D127587 */ "uncore_sys_ddr_pmu\000" +/* offset=3D127606 */ "sys_ddr_pmu.write_cycles\000uncore\000ddr write-cyc= les event\000event=3D0x2b\000v8\00000\000\000\000\000\000" +/* offset=3D127682 */ "uncore_sys_ccn_pmu\000" +/* offset=3D127701 */ "sys_ccn_pmu.read_cycles\000uncore\000ccn read-cycle= s event\000config=3D0x2c\0000x01\00000\000\000\000\000\000" +/* offset=3D127778 */ "uncore_sys_cmn_pmu\000" +/* offset=3D127797 */ "sys_cmn_pmu.hnf_cache_miss\000uncore\000Counts tota= l cache misses in first lookup result (high priority)\000eventid=3D1,type= =3D5\000(434|436|43c|43a).*\00000\000\000\000\000\000" +/* offset=3D127940 */ "CPUs_utilized\000Default\000(software@cpu\\-clock\\= ,name\\=3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,name\\= =3Dtask\\-clock@) / (duration_time * 1e9)\000\000Average CPU utilization\00= 0\0001CPUs\000\000\000\000011" +/* offset=3D128126 */ "cs_per_second\000Default\000software@context\\-swit= ches\\,name\\=3Dcontext\\-switches@ * 1e9 / (software@cpu\\-clock\\,name\\= =3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\= -clock@)\000\000Context switches per CPU second\000\0001cs/sec\000\000\000\= 000011" +/* offset=3D128359 */ "migrations_per_second\000Default\000software@cpu\\-= migrations\\,name\\=3Dcpu\\-migrations@ * 1e9 / (software@cpu\\-clock\\,nam= e\\=3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtas= k\\-clock@)\000\000Process migrations to a new CPU per CPU second\000\0001m= igrations/sec\000\000\000\000011" +/* offset=3D128619 */ "page_faults_per_second\000Default\000software@page\= \-faults\\,name\\=3Dpage\\-faults@ * 1e9 / (software@cpu\\-clock\\,name\\= =3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\= -clock@)\000\000Page faults per CPU second\000\0001faults/sec\000\000\000\0= 00011" +/* offset=3D128850 */ "insn_per_cycle\000Default\000instructions / cpu\\-c= ycles\000insn_per_cycle < 1\000Instructions Per Cycle\000\0001instructions\= 000\000\000\000001" +/* offset=3D128963 */ "stalled_cycles_per_instruction\000Default\000max(st= alled\\-cycles\\-frontend, stalled\\-cycles\\-backend) / instructions\000\0= 00Max front or backend stalls per instruction\000\000\000\000\000\000001" +/* offset=3D129127 */ "frontend_cycles_idle\000Default\000stalled\\-cycles= \\-frontend / cpu\\-cycles\000frontend_cycles_idle > 0.1\000Frontend stalls= per cycle\000\000\000\000\000\000001" +/* offset=3D129257 */ "backend_cycles_idle\000Default\000stalled\\-cycles\= \-backend / cpu\\-cycles\000backend_cycles_idle > 0.2\000Backend stalls per= cycle\000\000\000\000\000\000001" +/* offset=3D129383 */ "cycles_frequency\000Default\000cpu\\-cycles / (soft= ware@cpu\\-clock\\,name\\=3Dcpu\\-clock@ if #target_cpu else software@task\= \-clock\\,name\\=3Dtask\\-clock@)\000\000Cycles per CPU second\000\0001GHz\= 000\000\000\000011" +/* offset=3D129559 */ "branch_frequency\000Default\000branches / (software= @cpu\\-clock\\,name\\=3Dcpu\\-clock@ if #target_cpu else software@task\\-cl= ock\\,name\\=3Dtask\\-clock@)\000\000Branches per CPU second\000\0001000K/s= ec\000\000\000\000011" +/* offset=3D129739 */ "branch_miss_rate\000Default\000branch\\-misses / br= anches\000branch_miss_rate > 0.05\000Branch miss rate\000\000100%\000\000\0= 00\000001" +/* offset=3D129843 */ "l1d_miss_rate\000Default2\000L1\\-dcache\\-load\\-m= isses / L1\\-dcache\\-loads\000l1d_miss_rate > 0.05\000L1D miss rate\000\0= 00100%\000\000\000\000001" +/* offset=3D129959 */ "llc_miss_rate\000Default2\000LLC\\-load\\-misses / = LLC\\-loads\000llc_miss_rate > 0.05\000LLC miss rate\000\000100%\000\000\00= 0\000001" +/* offset=3D130060 */ "l1i_miss_rate\000Default3\000L1\\-icache\\-load\\-m= isses / L1\\-icache\\-loads\000l1i_miss_rate > 0.05\000L1I miss rate\000\00= 0100%\000\000\000\000001" +/* offset=3D130175 */ "dtlb_miss_rate\000Default3\000dTLB\\-load\\-misses = / dTLB\\-loads\000dtlb_miss_rate > 0.05\000dTLB miss rate\000\000100%\000\0= 00\000\000001" +/* offset=3D130281 */ "itlb_miss_rate\000Default3\000iTLB\\-load\\-misses = / iTLB\\-loads\000itlb_miss_rate > 0.05\000iTLB miss rate\000\000100%\000\0= 00\000\000001" +/* offset=3D130387 */ "l1_prefetch_miss_rate\000Default4\000L1\\-dcache\\-= prefetch\\-misses / L1\\-dcache\\-prefetches\000l1_prefetch_miss_rate > 0.0= 5\000L1 prefetch miss rate\000\000100%\000\000\000\000001" +/* offset=3D130535 */ "CPI\000\0001 / IPC\000\000\000\000\000\000\000\0000= 00" +/* offset=3D130558 */ "IPC\000group1\000inst_retired.any / cpu_clk_unhalte= d.thread\000\000\000\000\000\000\000\000000" +/* offset=3D130622 */ "Frontend_Bound_SMT\000\000idq_uops_not_delivered.co= re / (4 * (cpu_clk_unhalted.thread / 2 * (1 + cpu_clk_unhalted.one_thread_a= ctive / cpu_clk_unhalted.ref_xclk)))\000\000\000\000\000\000\000\000000" +/* offset=3D130789 */ "dcache_miss_cpi\000\000l1d\\-loads\\-misses / inst_= retired.any\000\000\000\000\000\000\000\000000" +/* offset=3D130854 */ "icache_miss_cycles\000\000l1i\\-loads\\-misses / in= st_retired.any\000\000\000\000\000\000\000\000000" +/* offset=3D130922 */ "cache_miss_cycles\000group1\000dcache_miss_cpi + ic= ache_miss_cycles\000\000\000\000\000\000\000\000000" +/* offset=3D130994 */ "DCache_L2_All_Hits\000\000l2_rqsts.demand_data_rd_h= it + l2_rqsts.pf_hit + l2_rqsts.rfo_hit\000\000\000\000\000\000\000\000000" +/* offset=3D131089 */ "DCache_L2_All_Miss\000\000max(l2_rqsts.all_demand_d= ata_rd - l2_rqsts.demand_data_rd_hit, 0) + l2_rqsts.pf_miss + l2_rqsts.rfo_= miss\000\000\000\000\000\000\000\000000" +/* offset=3D131224 */ "DCache_L2_All\000\000DCache_L2_All_Hits + DCache_L2= _All_Miss\000\000\000\000\000\000\000\000000" +/* offset=3D131289 */ "DCache_L2_Hits\000\000d_ratio(DCache_L2_All_Hits, D= Cache_L2_All)\000\000\000\000\000\000\000\000000" +/* offset=3D131358 */ "DCache_L2_Misses\000\000d_ratio(DCache_L2_All_Miss,= DCache_L2_All)\000\000\000\000\000\000\000\000000" +/* offset=3D131429 */ "M1\000\000ipc + M2\000\000\000\000\000\000\000\0000= 00" +/* offset=3D131452 */ "M2\000\000ipc + M1\000\000\000\000\000\000\000\0000= 00" +/* offset=3D131475 */ "M3\000\0001 / M3\000\000\000\000\000\000\000\000000" +/* offset=3D131496 */ "L1D_Cache_Fill_BW\000\00064 * l1d.replacement / 1e9= / duration_time\000\000\000\000\000\000\000\000000" ; =20 static const struct compact_pmu_event pmu_events__common_default_core[] = =3D { @@ -2587,6 +2589,7 @@ static const struct compact_pmu_event pmu_events__com= mon_software[] =3D { { 123599 }, /* task-clock\000software\000Per-task high-resolution timer ba= sed event\000config=3D1\000\00000\000\000\000\000\000 */ }; static const struct compact_pmu_event pmu_events__common_tool[] =3D { +{ 126189 }, /* core_wide\000tool\0001 if not SMT, if SMT are events being = gathered on all SMT threads 1 otherwise 0\000config=3D0xd\000\00000\000\000= \000\000\000 */ { 125056 }, /* duration_time\000tool\000Wall clock interval time in nanose= conds\000config=3D1\000\00000\000\000\000\000\000 */ { 125270 }, /* has_pmem\000tool\0001 if persistent memory installed otherw= ise 0\000config=3D4\000\00000\000\000\000\000\000 */ { 125346 }, /* num_cores\000tool\000Number of cores. A core consists of 1 = or more thread, with each thread being associated with a logical Linux CPU\= 000config=3D5\000\00000\000\000\000\000\000 */ @@ -2598,6 +2601,7 @@ static const struct compact_pmu_event pmu_events__com= mon_tool[] =3D { { 125983 }, /* smt_on\000tool\0001 if simultaneous multithreading (aka hyp= erthreading) is enable otherwise 0\000config=3D0xb\000\00000\000\000\000\00= 0\000 */ { 125202 }, /* system_time\000tool\000System/kernel time in nanoseconds\00= 0config=3D3\000\00000\000\000\000\000\000 */ { 126090 }, /* system_tsc_freq\000tool\000The amount a Time Stamp Counter = (TSC) increases per second\000config=3D0xc\000\00000\000\000\000\000\000 */ +{ 126303 }, /* target_cpu\000tool\0001 if CPUs being analyzed, 0 if thread= s/processes\000config=3D0xe\000\00000\000\000\000\000\000 */ { 125132 }, /* user_time\000tool\000User (non-kernel) time in nanoseconds\= 000config=3D2\000\00000\000\000\000\000\000 */ =20 }; @@ -2621,23 +2625,23 @@ static const struct pmu_table_entry pmu_events__com= mon[] =3D { }; =20 static const struct compact_pmu_event pmu_metrics__common_default_core[] = =3D { -{ 127742 }, /* CPUs_utilized\000Default\000(software@cpu\\-clock\\,name\\= =3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\= -clock@) / (duration_time * 1e9)\000\000Average CPU utilization\000\0001CPU= s\000\000\000\000011 */ -{ 129059 }, /* backend_cycles_idle\000Default\000stalled\\-cycles\\-backen= d / cpu\\-cycles\000backend_cycles_idle > 0.2\000Backend stalls per cycle\0= 00\000\000\000\000\000001 */ -{ 129361 }, /* branch_frequency\000Default\000branches / (software@cpu\\-c= lock\\,name\\=3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,na= me\\=3Dtask\\-clock@)\000\000Branches per CPU second\000\0001000K/sec\000\0= 00\000\000011 */ -{ 129541 }, /* branch_miss_rate\000Default\000branch\\-misses / branches\0= 00branch_miss_rate > 0.05\000Branch miss rate\000\000100%\000\000\000\00000= 1 */ -{ 127928 }, /* cs_per_second\000Default\000software@context\\-switches\\,n= ame\\=3Dcontext\\-switches@ * 1e9 / (software@cpu\\-clock\\,name\\=3Dcpu\\-= clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\-clock@)\= 000\000Context switches per CPU second\000\0001cs/sec\000\000\000\000011 */ -{ 129185 }, /* cycles_frequency\000Default\000cpu\\-cycles / (software@cpu= \\-clock\\,name\\=3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\= \,name\\=3Dtask\\-clock@)\000\000Cycles per CPU second\000\0001GHz\000\000\= 000\000011 */ -{ 129977 }, /* dtlb_miss_rate\000Default3\000dTLB\\-load\\-misses / dTLB\\= -loads\000dtlb_miss_rate > 0.05\000dTLB miss rate\000\000100%\000\000\000\0= 00001 */ -{ 128929 }, /* frontend_cycles_idle\000Default\000stalled\\-cycles\\-front= end / cpu\\-cycles\000frontend_cycles_idle > 0.1\000Frontend stalls per cyc= le\000\000\000\000\000\000001 */ -{ 128652 }, /* insn_per_cycle\000Default\000instructions / cpu\\-cycles\00= 0insn_per_cycle < 1\000Instructions Per Cycle\000\0001instructions\000\000\= 000\000001 */ -{ 130083 }, /* itlb_miss_rate\000Default3\000iTLB\\-load\\-misses / iTLB\\= -loads\000itlb_miss_rate > 0.05\000iTLB miss rate\000\000100%\000\000\000\0= 00001 */ -{ 130189 }, /* l1_prefetch_miss_rate\000Default4\000L1\\-dcache\\-prefetch= \\-misses / L1\\-dcache\\-prefetches\000l1_prefetch_miss_rate > 0.05\000L1 = prefetch miss rate\000\000100%\000\000\000\000001 */ -{ 129645 }, /* l1d_miss_rate\000Default2\000L1\\-dcache\\-load\\-misses / = L1\\-dcache\\-loads\000l1d_miss_rate > 0.05\000L1D miss rate\000\000100%\0= 00\000\000\000001 */ -{ 129862 }, /* l1i_miss_rate\000Default3\000L1\\-icache\\-load\\-misses / = L1\\-icache\\-loads\000l1i_miss_rate > 0.05\000L1I miss rate\000\000100%\00= 0\000\000\000001 */ -{ 129761 }, /* llc_miss_rate\000Default2\000LLC\\-load\\-misses / LLC\\-lo= ads\000llc_miss_rate > 0.05\000LLC miss rate\000\000100%\000\000\000\000001= */ -{ 128161 }, /* migrations_per_second\000Default\000software@cpu\\-migratio= ns\\,name\\=3Dcpu\\-migrations@ * 1e9 / (software@cpu\\-clock\\,name\\=3Dcp= u\\-clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\-cloc= k@)\000\000Process migrations to a new CPU per CPU second\000\0001migration= s/sec\000\000\000\000011 */ -{ 128421 }, /* page_faults_per_second\000Default\000software@page\\-faults= \\,name\\=3Dpage\\-faults@ * 1e9 / (software@cpu\\-clock\\,name\\=3Dcpu\\-c= lock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\-clock@)\0= 00\000Page faults per CPU second\000\0001faults/sec\000\000\000\000011 */ -{ 128765 }, /* stalled_cycles_per_instruction\000Default\000max(stalled\\-= cycles\\-frontend, stalled\\-cycles\\-backend) / instructions\000\000Max fr= ont or backend stalls per instruction\000\000\000\000\000\000001 */ +{ 127940 }, /* CPUs_utilized\000Default\000(software@cpu\\-clock\\,name\\= =3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\= -clock@) / (duration_time * 1e9)\000\000Average CPU utilization\000\0001CPU= s\000\000\000\000011 */ +{ 129257 }, /* backend_cycles_idle\000Default\000stalled\\-cycles\\-backen= d / cpu\\-cycles\000backend_cycles_idle > 0.2\000Backend stalls per cycle\0= 00\000\000\000\000\000001 */ +{ 129559 }, /* branch_frequency\000Default\000branches / (software@cpu\\-c= lock\\,name\\=3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\\,na= me\\=3Dtask\\-clock@)\000\000Branches per CPU second\000\0001000K/sec\000\0= 00\000\000011 */ +{ 129739 }, /* branch_miss_rate\000Default\000branch\\-misses / branches\0= 00branch_miss_rate > 0.05\000Branch miss rate\000\000100%\000\000\000\00000= 1 */ +{ 128126 }, /* cs_per_second\000Default\000software@context\\-switches\\,n= ame\\=3Dcontext\\-switches@ * 1e9 / (software@cpu\\-clock\\,name\\=3Dcpu\\-= clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\-clock@)\= 000\000Context switches per CPU second\000\0001cs/sec\000\000\000\000011 */ +{ 129383 }, /* cycles_frequency\000Default\000cpu\\-cycles / (software@cpu= \\-clock\\,name\\=3Dcpu\\-clock@ if #target_cpu else software@task\\-clock\= \,name\\=3Dtask\\-clock@)\000\000Cycles per CPU second\000\0001GHz\000\000\= 000\000011 */ +{ 130175 }, /* dtlb_miss_rate\000Default3\000dTLB\\-load\\-misses / dTLB\\= -loads\000dtlb_miss_rate > 0.05\000dTLB miss rate\000\000100%\000\000\000\0= 00001 */ +{ 129127 }, /* frontend_cycles_idle\000Default\000stalled\\-cycles\\-front= end / cpu\\-cycles\000frontend_cycles_idle > 0.1\000Frontend stalls per cyc= le\000\000\000\000\000\000001 */ +{ 128850 }, /* insn_per_cycle\000Default\000instructions / cpu\\-cycles\00= 0insn_per_cycle < 1\000Instructions Per Cycle\000\0001instructions\000\000\= 000\000001 */ +{ 130281 }, /* itlb_miss_rate\000Default3\000iTLB\\-load\\-misses / iTLB\\= -loads\000itlb_miss_rate > 0.05\000iTLB miss rate\000\000100%\000\000\000\0= 00001 */ +{ 130387 }, /* l1_prefetch_miss_rate\000Default4\000L1\\-dcache\\-prefetch= \\-misses / L1\\-dcache\\-prefetches\000l1_prefetch_miss_rate > 0.05\000L1 = prefetch miss rate\000\000100%\000\000\000\000001 */ +{ 129843 }, /* l1d_miss_rate\000Default2\000L1\\-dcache\\-load\\-misses / = L1\\-dcache\\-loads\000l1d_miss_rate > 0.05\000L1D miss rate\000\000100%\0= 00\000\000\000001 */ +{ 130060 }, /* l1i_miss_rate\000Default3\000L1\\-icache\\-load\\-misses / = L1\\-icache\\-loads\000l1i_miss_rate > 0.05\000L1I miss rate\000\000100%\00= 0\000\000\000001 */ +{ 129959 }, /* llc_miss_rate\000Default2\000LLC\\-load\\-misses / LLC\\-lo= ads\000llc_miss_rate > 0.05\000LLC miss rate\000\000100%\000\000\000\000001= */ +{ 128359 }, /* migrations_per_second\000Default\000software@cpu\\-migratio= ns\\,name\\=3Dcpu\\-migrations@ * 1e9 / (software@cpu\\-clock\\,name\\=3Dcp= u\\-clock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\-cloc= k@)\000\000Process migrations to a new CPU per CPU second\000\0001migration= s/sec\000\000\000\000011 */ +{ 128619 }, /* page_faults_per_second\000Default\000software@page\\-faults= \\,name\\=3Dpage\\-faults@ * 1e9 / (software@cpu\\-clock\\,name\\=3Dcpu\\-c= lock@ if #target_cpu else software@task\\-clock\\,name\\=3Dtask\\-clock@)\0= 00\000Page faults per CPU second\000\0001faults/sec\000\000\000\000011 */ +{ 128963 }, /* stalled_cycles_per_instruction\000Default\000max(stalled\\-= cycles\\-frontend, stalled\\-cycles\\-backend) / instructions\000\000Max fr= ont or backend stalls per instruction\000\000\000\000\000\000001 */ =20 }; =20 @@ -2650,29 +2654,29 @@ static const struct pmu_table_entry pmu_metrics__co= mmon[] =3D { }; =20 static const struct compact_pmu_event pmu_events__test_soc_cpu_default_cor= e[] =3D { -{ 126189 }, /* bp_l1_btb_correct\000branch\000L1 BTB Correction\000event= =3D0x8a\000\00000\000\000\000\000\000 */ -{ 126251 }, /* bp_l2_btb_correct\000branch\000L2 BTB Correction\000event= =3D0x8b\000\00000\000\000\000\000\000 */ -{ 126513 }, /* dispatch_blocked.any\000other\000Memory cluster signals to = block micro-op dispatch for any reason\000event=3D9,period=3D200000,umask= =3D0x20\000\00000\000\000\000\000\000 */ -{ 126646 }, /* eist_trans\000other\000Number of Enhanced Intel SpeedStep(R= ) Technology (EIST) transitions\000event=3D0x3a,period=3D200000\000\00000\0= 00\000\000\000\000 */ -{ 126313 }, /* l3_cache_rd\000cache\000L3 cache access, read\000event=3D0x= 40\000\00000\000\000\000\000Attributable Level 3 cache access, read\000 */ -{ 126411 }, /* segment_reg_loads.any\000other\000Number of segment registe= r loads\000event=3D6,period=3D200000,umask=3D0x80\000\00000\000\000\000\000= \000 */ +{ 126387 }, /* bp_l1_btb_correct\000branch\000L1 BTB Correction\000event= =3D0x8a\000\00000\000\000\000\000\000 */ +{ 126449 }, /* bp_l2_btb_correct\000branch\000L2 BTB Correction\000event= =3D0x8b\000\00000\000\000\000\000\000 */ +{ 126711 }, /* dispatch_blocked.any\000other\000Memory cluster signals to = block micro-op dispatch for any reason\000event=3D9,period=3D200000,umask= =3D0x20\000\00000\000\000\000\000\000 */ +{ 126844 }, /* eist_trans\000other\000Number of Enhanced Intel SpeedStep(R= ) Technology (EIST) transitions\000event=3D0x3a,period=3D200000\000\00000\0= 00\000\000\000\000 */ +{ 126511 }, /* l3_cache_rd\000cache\000L3 cache access, read\000event=3D0x= 40\000\00000\000\000\000\000Attributable Level 3 cache access, read\000 */ +{ 126609 }, /* segment_reg_loads.any\000other\000Number of segment registe= r loads\000event=3D6,period=3D200000,umask=3D0x80\000\00000\000\000\000\000= \000 */ }; static const struct compact_pmu_event pmu_events__test_soc_cpu_hisi_sccl_d= drc[] =3D { -{ 126779 }, /* uncore_hisi_ddrc.flux_wcmd\000uncore\000DDRC write commands= \000event=3D2\000\00000\000\000\000\000\000 */ +{ 126977 }, /* uncore_hisi_ddrc.flux_wcmd\000uncore\000DDRC write commands= \000event=3D2\000\00000\000\000\000\000\000 */ }; static const struct compact_pmu_event pmu_events__test_soc_cpu_hisi_sccl_l= 3c[] =3D { -{ 127141 }, /* uncore_hisi_l3c.rd_hit_cpipe\000uncore\000Total read hits\0= 00event=3D7\000\00000\000\000\000\000\000 */ +{ 127339 }, /* uncore_hisi_l3c.rd_hit_cpipe\000uncore\000Total read hits\0= 00event=3D7\000\00000\000\000\000\000\000 */ }; static const struct compact_pmu_event pmu_events__test_soc_cpu_uncore_cbox= [] =3D { -{ 127015 }, /* event-hyphen\000uncore\000UNC_CBO_HYPHEN\000event=3D0xe0\00= 0\00000\000\000\000\000\000 */ -{ 127069 }, /* event-two-hyph\000uncore\000UNC_CBO_TWO_HYPH\000event=3D0xc= 0\000\00000\000\000\000\000\000 */ -{ 126861 }, /* unc_cbo_xsnp_response.miss_eviction\000uncore\000A cross-co= re snoop resulted from L3 Eviction which misses in some processor core\000e= vent=3D0x22,umask=3D0x81\000\00000\000\000\000\000\000 */ +{ 127213 }, /* event-hyphen\000uncore\000UNC_CBO_HYPHEN\000event=3D0xe0\00= 0\00000\000\000\000\000\000 */ +{ 127267 }, /* event-two-hyph\000uncore\000UNC_CBO_TWO_HYPH\000event=3D0xc= 0\000\00000\000\000\000\000\000 */ +{ 127059 }, /* unc_cbo_xsnp_response.miss_eviction\000uncore\000A cross-co= re snoop resulted from L3 Eviction which misses in some processor core\000e= vent=3D0x22,umask=3D0x81\000\00000\000\000\000\000\000 */ }; static const struct compact_pmu_event pmu_events__test_soc_cpu_uncore_imc[= ] =3D { -{ 127324 }, /* uncore_imc.cache_hits\000uncore\000Total cache hits\000even= t=3D0x34\000\00000\000\000\000\000\000 */ +{ 127522 }, /* uncore_imc.cache_hits\000uncore\000Total cache hits\000even= t=3D0x34\000\00000\000\000\000\000\000 */ }; static const struct compact_pmu_event pmu_events__test_soc_cpu_uncore_imc_= free_running[] =3D { -{ 127233 }, /* uncore_imc_free_running.cache_miss\000uncore\000Total cache= misses\000event=3D0x12\000\00000\000\000\000\000\000 */ +{ 127431 }, /* uncore_imc_free_running.cache_miss\000uncore\000Total cache= misses\000event=3D0x12\000\00000\000\000\000\000\000 */ =20 }; =20 @@ -2685,46 +2689,46 @@ static const struct pmu_table_entry pmu_events__tes= t_soc_cpu[] =3D { { .entries =3D pmu_events__test_soc_cpu_hisi_sccl_ddrc, .num_entries =3D ARRAY_SIZE(pmu_events__test_soc_cpu_hisi_sccl_ddrc), - .pmu_name =3D { 126764 /* hisi_sccl,ddrc\000 */ }, + .pmu_name =3D { 126962 /* hisi_sccl,ddrc\000 */ }, }, { .entries =3D pmu_events__test_soc_cpu_hisi_sccl_l3c, .num_entries =3D ARRAY_SIZE(pmu_events__test_soc_cpu_hisi_sccl_l3c), - .pmu_name =3D { 127127 /* hisi_sccl,l3c\000 */ }, + .pmu_name =3D { 127325 /* hisi_sccl,l3c\000 */ }, }, { .entries =3D pmu_events__test_soc_cpu_uncore_cbox, .num_entries =3D ARRAY_SIZE(pmu_events__test_soc_cpu_uncore_cbox), - .pmu_name =3D { 126849 /* uncore_cbox\000 */ }, + .pmu_name =3D { 127047 /* uncore_cbox\000 */ }, }, { .entries =3D pmu_events__test_soc_cpu_uncore_imc, .num_entries =3D ARRAY_SIZE(pmu_events__test_soc_cpu_uncore_imc), - .pmu_name =3D { 127313 /* uncore_imc\000 */ }, + .pmu_name =3D { 127511 /* uncore_imc\000 */ }, }, { .entries =3D pmu_events__test_soc_cpu_uncore_imc_free_running, .num_entries =3D ARRAY_SIZE(pmu_events__test_soc_cpu_uncore_imc_free_= running), - .pmu_name =3D { 127209 /* uncore_imc_free_running\000 */ }, + .pmu_name =3D { 127407 /* uncore_imc_free_running\000 */ }, }, }; =20 static const struct compact_pmu_event pmu_metrics__test_soc_cpu_default_co= re[] =3D { -{ 130337 }, /* CPI\000\0001 / IPC\000\000\000\000\000\000\000\000000 */ -{ 131026 }, /* DCache_L2_All\000\000DCache_L2_All_Hits + DCache_L2_All_Mis= s\000\000\000\000\000\000\000\000000 */ -{ 130796 }, /* DCache_L2_All_Hits\000\000l2_rqsts.demand_data_rd_hit + l2_= rqsts.pf_hit + l2_rqsts.rfo_hit\000\000\000\000\000\000\000\000000 */ -{ 130891 }, /* DCache_L2_All_Miss\000\000max(l2_rqsts.all_demand_data_rd -= l2_rqsts.demand_data_rd_hit, 0) + l2_rqsts.pf_miss + l2_rqsts.rfo_miss\000= \000\000\000\000\000\000\000000 */ -{ 131091 }, /* DCache_L2_Hits\000\000d_ratio(DCache_L2_All_Hits, DCache_L2= _All)\000\000\000\000\000\000\000\000000 */ -{ 131160 }, /* DCache_L2_Misses\000\000d_ratio(DCache_L2_All_Miss, DCache_= L2_All)\000\000\000\000\000\000\000\000000 */ -{ 130424 }, /* Frontend_Bound_SMT\000\000idq_uops_not_delivered.core / (4 = * (cpu_clk_unhalted.thread / 2 * (1 + cpu_clk_unhalted.one_thread_active / = cpu_clk_unhalted.ref_xclk)))\000\000\000\000\000\000\000\000000 */ -{ 130360 }, /* IPC\000group1\000inst_retired.any / cpu_clk_unhalted.thread= \000\000\000\000\000\000\000\000000 */ -{ 131298 }, /* L1D_Cache_Fill_BW\000\00064 * l1d.replacement / 1e9 / durat= ion_time\000\000\000\000\000\000\000\000000 */ -{ 131231 }, /* M1\000\000ipc + M2\000\000\000\000\000\000\000\000000 */ -{ 131254 }, /* M2\000\000ipc + M1\000\000\000\000\000\000\000\000000 */ -{ 131277 }, /* M3\000\0001 / M3\000\000\000\000\000\000\000\000000 */ -{ 130724 }, /* cache_miss_cycles\000group1\000dcache_miss_cpi + icache_mis= s_cycles\000\000\000\000\000\000\000\000000 */ -{ 130591 }, /* dcache_miss_cpi\000\000l1d\\-loads\\-misses / inst_retired.= any\000\000\000\000\000\000\000\000000 */ -{ 130656 }, /* icache_miss_cycles\000\000l1i\\-loads\\-misses / inst_retir= ed.any\000\000\000\000\000\000\000\000000 */ +{ 130535 }, /* CPI\000\0001 / IPC\000\000\000\000\000\000\000\000000 */ +{ 131224 }, /* DCache_L2_All\000\000DCache_L2_All_Hits + DCache_L2_All_Mis= s\000\000\000\000\000\000\000\000000 */ +{ 130994 }, /* DCache_L2_All_Hits\000\000l2_rqsts.demand_data_rd_hit + l2_= rqsts.pf_hit + l2_rqsts.rfo_hit\000\000\000\000\000\000\000\000000 */ +{ 131089 }, /* DCache_L2_All_Miss\000\000max(l2_rqsts.all_demand_data_rd -= l2_rqsts.demand_data_rd_hit, 0) + l2_rqsts.pf_miss + l2_rqsts.rfo_miss\000= \000\000\000\000\000\000\000000 */ +{ 131289 }, /* DCache_L2_Hits\000\000d_ratio(DCache_L2_All_Hits, DCache_L2= _All)\000\000\000\000\000\000\000\000000 */ +{ 131358 }, /* DCache_L2_Misses\000\000d_ratio(DCache_L2_All_Miss, DCache_= L2_All)\000\000\000\000\000\000\000\000000 */ +{ 130622 }, /* Frontend_Bound_SMT\000\000idq_uops_not_delivered.core / (4 = * (cpu_clk_unhalted.thread / 2 * (1 + cpu_clk_unhalted.one_thread_active / = cpu_clk_unhalted.ref_xclk)))\000\000\000\000\000\000\000\000000 */ +{ 130558 }, /* IPC\000group1\000inst_retired.any / cpu_clk_unhalted.thread= \000\000\000\000\000\000\000\000000 */ +{ 131496 }, /* L1D_Cache_Fill_BW\000\00064 * l1d.replacement / 1e9 / durat= ion_time\000\000\000\000\000\000\000\000000 */ +{ 131429 }, /* M1\000\000ipc + M2\000\000\000\000\000\000\000\000000 */ +{ 131452 }, /* M2\000\000ipc + M1\000\000\000\000\000\000\000\000000 */ +{ 131475 }, /* M3\000\0001 / M3\000\000\000\000\000\000\000\000000 */ +{ 130922 }, /* cache_miss_cycles\000group1\000dcache_miss_cpi + icache_mis= s_cycles\000\000\000\000\000\000\000\000000 */ +{ 130789 }, /* dcache_miss_cpi\000\000l1d\\-loads\\-misses / inst_retired.= any\000\000\000\000\000\000\000\000000 */ +{ 130854 }, /* icache_miss_cycles\000\000l1i\\-loads\\-misses / inst_retir= ed.any\000\000\000\000\000\000\000\000000 */ =20 }; =20 @@ -2737,13 +2741,13 @@ static const struct pmu_table_entry pmu_metrics__te= st_soc_cpu[] =3D { }; =20 static const struct compact_pmu_event pmu_events__test_soc_sys_uncore_sys_= ccn_pmu[] =3D { -{ 127503 }, /* sys_ccn_pmu.read_cycles\000uncore\000ccn read-cycles event\= 000config=3D0x2c\0000x01\00000\000\000\000\000\000 */ +{ 127701 }, /* sys_ccn_pmu.read_cycles\000uncore\000ccn read-cycles event\= 000config=3D0x2c\0000x01\00000\000\000\000\000\000 */ }; static const struct compact_pmu_event pmu_events__test_soc_sys_uncore_sys_= cmn_pmu[] =3D { -{ 127599 }, /* sys_cmn_pmu.hnf_cache_miss\000uncore\000Counts total cache = misses in first lookup result (high priority)\000eventid=3D1,type=3D5\000(4= 34|436|43c|43a).*\00000\000\000\000\000\000 */ +{ 127797 }, /* sys_cmn_pmu.hnf_cache_miss\000uncore\000Counts total cache = misses in first lookup result (high priority)\000eventid=3D1,type=3D5\000(4= 34|436|43c|43a).*\00000\000\000\000\000\000 */ }; static const struct compact_pmu_event pmu_events__test_soc_sys_uncore_sys_= ddr_pmu[] =3D { -{ 127408 }, /* sys_ddr_pmu.write_cycles\000uncore\000ddr write-cycles even= t\000event=3D0x2b\000v8\00000\000\000\000\000\000 */ +{ 127606 }, /* sys_ddr_pmu.write_cycles\000uncore\000ddr write-cycles even= t\000event=3D0x2b\000v8\00000\000\000\000\000\000 */ =20 }; =20 @@ -2751,17 +2755,17 @@ static const struct pmu_table_entry pmu_events__tes= t_soc_sys[] =3D { { .entries =3D pmu_events__test_soc_sys_uncore_sys_ccn_pmu, .num_entries =3D ARRAY_SIZE(pmu_events__test_soc_sys_uncore_sys_ccn_p= mu), - .pmu_name =3D { 127484 /* uncore_sys_ccn_pmu\000 */ }, + .pmu_name =3D { 127682 /* uncore_sys_ccn_pmu\000 */ }, }, { .entries =3D pmu_events__test_soc_sys_uncore_sys_cmn_pmu, .num_entries =3D ARRAY_SIZE(pmu_events__test_soc_sys_uncore_sys_cmn_p= mu), - .pmu_name =3D { 127580 /* uncore_sys_cmn_pmu\000 */ }, + .pmu_name =3D { 127778 /* uncore_sys_cmn_pmu\000 */ }, }, { .entries =3D pmu_events__test_soc_sys_uncore_sys_ddr_pmu, .num_entries =3D ARRAY_SIZE(pmu_events__test_soc_sys_uncore_sys_ddr_p= mu), - .pmu_name =3D { 127389 /* uncore_sys_ddr_pmu\000 */ }, + .pmu_name =3D { 127587 /* uncore_sys_ddr_pmu\000 */ }, }, }; =20 diff --git a/tools/perf/util/expr.c b/tools/perf/util/expr.c index 4df56f2b283d..465fe2e9bbbe 100644 --- a/tools/perf/util/expr.c +++ b/tools/perf/util/expr.c @@ -401,17 +401,12 @@ double expr__get_literal(const char *literal, const s= truct expr_scanner_ctx *ctx if (ev !=3D TOOL_PMU__EVENT_NONE) { u64 count; =20 - if (tool_pmu__read_event(ev, /*evsel=3D*/NULL, &count)) + if (tool_pmu__read_event(ev, /*evsel=3D*/NULL, + ctx->system_wide, ctx->user_requested_cpu_list, + &count)) result =3D count; else pr_err("Failure to read '%s'", literal); - - } else if (!strcmp("#core_wide", literal)) { - result =3D core_wide(ctx->system_wide, ctx->user_requested_cpu_list) - ? 1.0 : 0.0; - } else if (!strcmp("#target_cpu", literal)) { - result =3D (ctx->system_wide || ctx->user_requested_cpu_list) - ? 1.0 : 0.0; } else { pr_err("Unrecognized literal '%s'", literal); } diff --git a/tools/perf/util/stat-shadow.c b/tools/perf/util/stat-shadow.c index c1547128c396..b3b482e1808f 100644 --- a/tools/perf/util/stat-shadow.c +++ b/tools/perf/util/stat-shadow.c @@ -72,6 +72,8 @@ static int prepare_metric(const struct metric_expr *mexp, case TOOL_PMU__EVENT_SLOTS: case TOOL_PMU__EVENT_SMT_ON: case TOOL_PMU__EVENT_SYSTEM_TSC_FREQ: + case TOOL_PMU__EVENT_CORE_WIDE: + case TOOL_PMU__EVENT_TARGET_CPU: default: pr_err("Unexpected tool event '%s'", evsel__name(metric_events[i])); abort(); diff --git a/tools/perf/util/tool_pmu.c b/tools/perf/util/tool_pmu.c index f075098488ba..a72c665ee644 100644 --- a/tools/perf/util/tool_pmu.c +++ b/tools/perf/util/tool_pmu.c @@ -6,6 +6,7 @@ #include "pmu.h" #include "print-events.h" #include "smt.h" +#include "stat.h" #include "time-utils.h" #include "tool_pmu.h" #include "tsc.h" @@ -30,6 +31,8 @@ static const char *const tool_pmu__event_names[TOOL_PMU__= EVENT_MAX] =3D { "slots", "smt_on", "system_tsc_freq", + "core_wide", + "target_cpu", }; =20 bool tool_pmu__skip_event(const char *name __maybe_unused) @@ -329,7 +332,11 @@ static bool has_pmem(void) return has_pmem; } =20 -bool tool_pmu__read_event(enum tool_pmu_event ev, struct evsel *evsel, u64= *result) +bool tool_pmu__read_event(enum tool_pmu_event ev, + struct evsel *evsel, + bool system_wide, + const char *user_requested_cpu_list, + u64 *result) { const struct cpu_topology *topology; =20 @@ -421,6 +428,14 @@ bool tool_pmu__read_event(enum tool_pmu_event ev, stru= ct evsel *evsel, u64 *resu *result =3D arch_get_tsc_freq(); return true; =20 + case TOOL_PMU__EVENT_CORE_WIDE: + *result =3D core_wide(system_wide, user_requested_cpu_list) ? 1 : 0; + return true; + + case TOOL_PMU__EVENT_TARGET_CPU: + *result =3D system_wide || (user_requested_cpu_list !=3D NULL) ? 1 : 0; + return true; + case TOOL_PMU__EVENT_NONE: case TOOL_PMU__EVENT_DURATION_TIME: case TOOL_PMU__EVENT_USER_TIME: @@ -452,11 +467,16 @@ int evsel__tool_pmu_read(struct evsel *evsel, int cpu= _map_idx, int thread) case TOOL_PMU__EVENT_SLOTS: case TOOL_PMU__EVENT_SMT_ON: case TOOL_PMU__EVENT_SYSTEM_TSC_FREQ: + case TOOL_PMU__EVENT_CORE_WIDE: + case TOOL_PMU__EVENT_TARGET_CPU: if (evsel->prev_raw_counts) old_count =3D perf_counts(evsel->prev_raw_counts, cpu_map_idx, thread); val =3D 0; if (cpu_map_idx =3D=3D 0 && thread =3D=3D 0) { - if (!tool_pmu__read_event(ev, evsel, &val)) { + if (!tool_pmu__read_event(ev, evsel, + stat_config.system_wide, + stat_config.user_requested_cpu_list, + &val)) { count->lost++; val =3D 0; } diff --git a/tools/perf/util/tool_pmu.h b/tools/perf/util/tool_pmu.h index d642e7d73910..f1714001bc1d 100644 --- a/tools/perf/util/tool_pmu.h +++ b/tools/perf/util/tool_pmu.h @@ -22,6 +22,8 @@ enum tool_pmu_event { TOOL_PMU__EVENT_SLOTS, TOOL_PMU__EVENT_SMT_ON, TOOL_PMU__EVENT_SYSTEM_TSC_FREQ, + TOOL_PMU__EVENT_CORE_WIDE, + TOOL_PMU__EVENT_TARGET_CPU, =20 TOOL_PMU__EVENT_MAX, }; @@ -34,7 +36,12 @@ enum tool_pmu_event tool_pmu__str_to_event(const char *s= tr); bool tool_pmu__skip_event(const char *name); int tool_pmu__num_skip_events(void); =20 -bool tool_pmu__read_event(enum tool_pmu_event ev, struct evsel *evsel, u64= *result); +bool tool_pmu__read_event(enum tool_pmu_event ev, + struct evsel *evsel, + bool system_wide, + const char *user_requested_cpu_list, + u64 *result); + =20 u64 tool_pmu__cpu_slots_per_cycle(void); =20 --=20 2.51.2.1041.gc1ab5b90ca-goog