From nobody Fri Oct 3 20:26:54 2025 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.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 2FBE929B233 for ; Mon, 25 Aug 2025 21:12:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756156335; cv=none; b=ERQmbC8vEJn2LrIpIQ1oIJiGHD1ct5ukD4M0UPFIqftEFIhN63HjKZ2em7nZyIq9TYIU0NKYDhavUOteRlyGBVFEGzS2nlCxS6H/u6EJyDMbD1Z3CDLB16MBRBDvuGXjKn4El+bPAiP+ZxlpBzLPnICooF13OLDbbdUfOlZ0pvA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756156335; c=relaxed/simple; bh=/EsLmYQedhPDEzjIH37S26bgfjjgEGeEs+W7gCUpg6E=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=tasArfVSnvSSAjAoEzX6Cf2NNNogh4H8N+Zh58npMezN0HGNt6kFHESTSAcPOe/rTov3jkAZ9hHy5zCc0ULxMB35rfUxZiwiZp+4upbir2ssULKXkRLDQrfCU6AMIEUx1HX0/JcAl0N0PQBqdZHBUI0lkcYZUCCgT6fMuar6aZ0= 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=pYhQ5UHR; arc=none smtp.client-ip=209.85.210.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="pYhQ5UHR" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-76ff2335c1eso3479877b3a.1 for ; Mon, 25 Aug 2025 14:12:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1756156333; x=1756761133; 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=6GvX8rYeRAib8iUkm2wWyP4g7MGr6ukV6SY2F6dE8Zk=; b=pYhQ5UHRYZwxDC9W4/jRUHu2bqn/RpyjywM45kOxleIfHg1aT5r5W/JdpBvIv4orZc y0Du0oJ/DryGZd07MneI04K4pW5UROJnC3CW4GtTYT55dTfnZao5szL+IegBV+BsRT9P MbeijM+j4hnUQ6PCSoYqePAS76Q3JHjO8R9pwuMwk3mHUsr+JOJFfcBkT83gdUeoxkS5 fL6HZo2/froFIQbnlQN8gpEDr4zyiY9jZCsTfc6UumpIDHnwyeskMPefb6EA6GFlJpsu NDflP5vSBHjltjMpYVaHleZHWbi+JQYXVtVBnbMUIYR1WBPQtdgTt8GNoZYtu+ZCpZ/R E/9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756156333; x=1756761133; 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=6GvX8rYeRAib8iUkm2wWyP4g7MGr6ukV6SY2F6dE8Zk=; b=H+q8GoGf/ZTM5oR/gKnqlvu4l8NiC2NLM7sKukR6wCrctOF8SiQXVAucEpXLoBjyNo 4jClIehFzNdqT7Aw74DlMSkMjONooPlO/iQnTtnyqUY0dvKBp4lT2TvrlfqHffMaoCdR j7E7EfHQfSjmMni9iGzEezgkN9ZpvYhkiZbet8LlLmOCmwakrWsSUKNds13G4G2wPypx r93TBAlRFX129LamdOo3L0QLg9XBg2M6f/tRn4pNn48iwcfM21X/Sz6Azvd4nNEz8Ma2 0gH3WgDLtjagN3NjdrepMfyja1PfcZBLDyKEDBAbJ5qg/0r30ISUrQYe6IAye8e/dAcc SGNg== X-Forwarded-Encrypted: i=1; AJvYcCWG/Hr3wyTOkqG6RCI9p762tpaqs3CjhUxlFG963y33vHlK7gAbkbFZhG1UI3ydsym9AS9yIGXhRXDbsVU=@vger.kernel.org X-Gm-Message-State: AOJu0Yykz7HRHQAu2F6Q4fQrIn1OkpIDVe6mvYjFrGcja9DnewZuzxfh HAsrfvLWg22NerNcTSXPXkD0BWD3MJWeXJ2YuTDh6lwWTc/FrL1wwsBuIaHgC8Vt/GC4Sc53eUn hZH5hhIgjxg== X-Google-Smtp-Source: AGHT+IFa1H5M7ycoC2jBKHnd/ngG3Chw2ze60hntesDA3TknECh9s8GT1d1pXgsWmJ/FHOPTT6lEOukgjms1 X-Received: from pfbln14.prod.google.com ([2002:a05:6a00:3cce:b0:76b:b0c5:347c]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:3d4b:b0:76e:885a:c340 with SMTP id d2e1a72fcca58-7702fb00564mr13695050b3a.30.1756156333164; Mon, 25 Aug 2025 14:12:13 -0700 (PDT) Date: Mon, 25 Aug 2025 14:12:02 -0700 In-Reply-To: <20250825211204.2784695-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: <20250825211204.2784695-1-irogers@google.com> X-Mailer: git-send-email 2.51.0.261.g7ce5a0a67e-goog Message-ID: <20250825211204.2784695-2-irogers@google.com> Subject: [PATCH v1 1/3] perf evsel: Give warning for broken Intel topdown event grouping From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , James Clark , Greg Kroah-Hartman , Yoshihiro Furudera , Dapeng Mi , Howard Chu , Thomas Falcon , Andi Kleen , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Extend arch_evsel__open_strerror from just AMD IBS events to Intel core PMU events, to give a message when a slots event isn't a group leader or when a perf metric event is duplicated within an event group. As generating the warning happens after non-arch specific warnings are generated, disable the missing system wide (-a) flag warning for the core PMU. This assumes core PMU events should support per-thread/process and system-wide. Signed-off-by: Ian Rogers Reviewed-by: Dapeng Mi Tested-by:=C2=A0Dapeng Mi --- tools/perf/arch/x86/util/evsel.c | 62 +++++++++++++++++++++++++++++--- tools/perf/util/evsel.c | 7 ++-- tools/perf/util/evsel.h | 2 +- 3 files changed, 64 insertions(+), 7 deletions(-) diff --git a/tools/perf/arch/x86/util/evsel.c b/tools/perf/arch/x86/util/ev= sel.c index 9bc80fff3aa0..e67701d26f24 100644 --- a/tools/perf/arch/x86/util/evsel.c +++ b/tools/perf/arch/x86/util/evsel.c @@ -1,10 +1,14 @@ // SPDX-License-Identifier: GPL-2.0 +#include #include #include +#include "util/evlist.h" #include "util/evsel.h" #include "util/env.h" #include "util/pmu.h" #include "util/pmus.h" +#include "util/stat.h" +#include "util/strbuf.h" #include "linux/string.h" #include "topdown.h" #include "evsel.h" @@ -102,13 +106,15 @@ void arch__post_evsel_config(struct evsel *evsel, str= uct perf_event_attr *attr) } } =20 -int arch_evsel__open_strerror(struct evsel *evsel, char *msg, size_t size) +static int amd_evsel__open_strerror(struct evsel *evsel, char *msg, size_t= size) { - if (!x86__is_amd_cpu()) + struct perf_pmu *pmu; + + if (evsel->core.attr.precise_ip =3D=3D 0) return 0; =20 - if (!evsel->core.attr.precise_ip && - !(evsel->pmu && !strncmp(evsel->pmu->name, "ibs", 3))) + pmu =3D evsel__find_pmu(evsel); + if (!pmu || strncmp(pmu->name, "ibs", 3)) return 0; =20 /* More verbose IBS errors. */ @@ -118,6 +124,54 @@ int arch_evsel__open_strerror(struct evsel *evsel, cha= r *msg, size_t size) return scnprintf(msg, size, "AMD IBS doesn't support privilege filtering= . Try " "again without the privilege modifiers (like 'k') at the end."); } + return 0; +} + +static int intel_evsel__open_strerror(struct evsel *evsel, int err, char *= msg, size_t size) +{ + struct strbuf sb =3D STRBUF_INIT; + int ret; + + if (err !=3D EINVAL) + return 0; =20 + if (!topdown_sys_has_perf_metrics()) + return 0; + + if (arch_is_topdown_slots(evsel)) { + if (!evsel__is_group_leader(evsel)) { + evlist__uniquify_evsel_names(evsel->evlist, &stat_config); + evlist__format_evsels(evsel->evlist, &sb, 2048); + ret =3D scnprintf(msg, size, "Topdown slots event can only be group lea= der " + "in '%s'.", sb.buf); + strbuf_release(&sb); + return ret; + } + } else if (arch_is_topdown_metrics(evsel)) { + struct evsel *pos; + + evlist__for_each_entry(evsel->evlist, pos) { + if (pos =3D=3D evsel || !arch_is_topdown_metrics(pos)) + continue; + + if (pos->core.attr.config !=3D evsel->core.attr.config) + continue; + + evlist__uniquify_evsel_names(evsel->evlist, &stat_config); + evlist__format_evsels(evsel->evlist, &sb, 2048); + ret =3D scnprintf(msg, size, "Perf metric event '%s' is duplicated " + "in the same group (only one event is allowed) in '%s'.", + evsel__name(evsel), sb.buf); + strbuf_release(&sb); + return ret; + } + } return 0; } + +int arch_evsel__open_strerror(struct evsel *evsel, int err, char *msg, siz= e_t size) +{ + return x86__is_amd_cpu() + ? amd_evsel__open_strerror(evsel, msg, size) + : intel_evsel__open_strerror(evsel, err, msg, size); +} diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index d264c143b592..796f3bf35f47 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -3716,6 +3716,7 @@ static int dump_perf_event_processes(char *msg, size_= t size) } =20 int __weak arch_evsel__open_strerror(struct evsel *evsel __maybe_unused, + int err __maybe_unused, char *msg __maybe_unused, size_t size __maybe_unused) { @@ -3725,6 +3726,7 @@ int __weak arch_evsel__open_strerror(struct evsel *ev= sel __maybe_unused, int evsel__open_strerror(struct evsel *evsel, struct target *target, int err, char *msg, size_t size) { + struct perf_pmu *pmu; char sbuf[STRERR_BUFSIZE]; int printed =3D 0, enforced =3D 0; int ret; @@ -3840,7 +3842,8 @@ int evsel__open_strerror(struct evsel *evsel, struct = target *target, return scnprintf(msg, size, "The 'aux_action' feature is not supported,= update the kernel."); if (perf_missing_features.aux_output) return scnprintf(msg, size, "The 'aux_output' feature is not supported,= update the kernel."); - if (!target__has_cpu(target)) + pmu =3D evsel__find_pmu(evsel); + if (!pmu->is_core && !target__has_cpu(target)) return scnprintf(msg, size, "Invalid event (%s) in per-thread mode, enable system wide with '-a'.", evsel__name(evsel)); @@ -3853,7 +3856,7 @@ int evsel__open_strerror(struct evsel *evsel, struct = target *target, break; } =20 - ret =3D arch_evsel__open_strerror(evsel, msg, size); + ret =3D arch_evsel__open_strerror(evsel, err, msg, size); if (ret) return ret; =20 diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index 5797a02e5d6a..e927a3a4fe0e 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -341,7 +341,7 @@ void evsel__set_sample_id(struct evsel *evsel, bool use= _sample_identifier); =20 void arch_evsel__set_sample_weight(struct evsel *evsel); void arch__post_evsel_config(struct evsel *evsel, struct perf_event_attr *= attr); -int arch_evsel__open_strerror(struct evsel *evsel, char *msg, size_t size); +int arch_evsel__open_strerror(struct evsel *evsel, int err, char *msg, siz= e_t size); =20 int evsel__set_filter(struct evsel *evsel, const char *filter); int evsel__append_tp_filter(struct evsel *evsel, const char *filter); --=20 2.51.0.261.g7ce5a0a67e-goog From nobody Fri Oct 3 20:26:54 2025 Received: from mail-qk1-f202.google.com (mail-qk1-f202.google.com [209.85.222.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 47F212EFD90 for ; Mon, 25 Aug 2025 21:12:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756156338; cv=none; b=VWrZsxvHI5V4harsoB9dzfTTG068bT9BjiAhSAH6yw92/dxLXS3AlinRWr2nCeKmfUvvymrXxEb9IH231/7FP9B9xLOVtrRvECEICNLrvBj8UXvMEgFXOuv/GYkt8UnrqMxtEVXiixhMjySDrqXbCIt5BsCNJ1aOX5GcgOqSg8M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756156338; c=relaxed/simple; bh=7ZZYccK7pbZzVlX/n45DfA25/ZKv6f9dOGLxGdXzzb8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=oSv2E7q30+tzE9/aYhSJYQmPgLImRUksmWgx/eVTJjTBlPmt2EzkgO9SCefk8uaGCBA49Mr/yHTQRdfLO7gd+GrOK+PMBilo7XA4lYRlFoloGRPNlDUtcj9PgO+EtEf6yDp7dC4kAk6II/pCXsR/K0pGUi7HXqiua9IUcxe9UcU= 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=1LGrzPFo; arc=none smtp.client-ip=209.85.222.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="1LGrzPFo" Received: by mail-qk1-f202.google.com with SMTP id af79cd13be357-7e870627e34so1762792385a.2 for ; Mon, 25 Aug 2025 14:12:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1756156335; x=1756761135; 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=qk8oGFA/uyU0ZUdIq1ApfIlRlwBW+Y7K33XHhOSqdfY=; b=1LGrzPFo+mPLg467UhKzgAZWveVo7dIcXJXZSsxq1iiNAN3B6dbEpfhLAPkReo5wfZ GT5tV3CQRUEytngN2Ip5H6hxqM4zNxtrB0LHsXfIuSGBJHqoB5E0xCvs1ktOTNxJXWuq 17cLYpex2uBk+CjhrApdoys/Q9PHCiL3+EZeKmVaAfgn1/rj8pNPVDUXwmOleorluMUg Dak27Wl1ZIt29pvphYYxHiuhVftZcQsFEQfjA4wQ0XyQQkhna18rus8OEvyjd69yi/g9 /nPuC7nZHn8SCXRGCJ0di5eD96jwiB9+xG6tWMOgSFHuv9dIe5thyk6TmR3ttmxd0d2y 37ag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756156335; x=1756761135; 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=qk8oGFA/uyU0ZUdIq1ApfIlRlwBW+Y7K33XHhOSqdfY=; b=LJrU1CtEIv/fQ5CxKf+uxrVPhdGh6s0k3BzFHiybgGMHVbbWpa4sT21XwyaM43uvsZ UWxeXrH2koQwXjHjdgjvX57t/+QAZaHEMz4GJtk8z0MC4GffpmSUw1t9HL+EVD5le+b9 FzVXR3xpZSa+t7l223k5oIPk4MJHc7XEtUxdPoXeecey2F9W0pR2MqA1ONMHZ7ezd4Jy n2+p9wAfFKlmuH5MrlPX6bfk6ClAjCOCJFW29gg3gQ7hk8PX8RYugSkegnUrKGCtrII/ cR/8du+ISc5N0w+Iwd7gN4qH2MMMSaxcCQIbtLgGmGNaN/sZA0k1ngYFJTNkiQiiY/O6 D4Iw== X-Forwarded-Encrypted: i=1; AJvYcCVnWXi9XzGnzUO889WxUE4Zky++24fLxhZ/Z0SMuYlqsWK56zu5iebAyzZmrHKE4PHeN6QbrBI984X4TWQ=@vger.kernel.org X-Gm-Message-State: AOJu0Ywq0r4BqjQ3C/zr9NIB8D6LVCEOVhHcXWFIAfLQpFxpq/otZh95 oH4FT1FY7EaWmLDqmyQ6b8fzcKY4aVUcD2kuSGmhWKGfpRXXh0ApscbEwWwmqwEhzI5pnTeFjfU I3PhDvtO3xw== X-Google-Smtp-Source: AGHT+IFtQ0ppmwDijKHBq8pxQbBR4WwH6ohRJXDXTfMDmQfyPnLqpC4qIuusDj+MeQPG3v9YNrag7AavM1An X-Received: from qknor4.prod.google.com ([2002:a05:620a:6184:b0:7e8:14fd:d2c0]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:620a:408a:b0:7f3:caf0:8412 with SMTP id af79cd13be357-7f3caf08452mr226815385a.46.1756156335052; Mon, 25 Aug 2025 14:12:15 -0700 (PDT) Date: Mon, 25 Aug 2025 14:12:03 -0700 In-Reply-To: <20250825211204.2784695-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: <20250825211204.2784695-1-irogers@google.com> X-Mailer: git-send-email 2.51.0.261.g7ce5a0a67e-goog Message-ID: <20250825211204.2784695-3-irogers@google.com> Subject: [PATCH v1 2/3] perf stat: Don't skip failing group events From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , James Clark , Greg Kroah-Hartman , Yoshihiro Furudera , Dapeng Mi , Howard Chu , Thomas Falcon , Andi Kleen , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Pass errno to stat_handle_error rather than reading errno after it has potentially been clobbered. Move "skippable" handling first as a skippable event (from the perf stat default list) should always just be skipped. Remove logic to skip rather than fail events in a group when they aren't the group leader. The original logic was added in commit cb5ef60067c1 ("perf stat: Error out unsupported group leader immediately") due to error handling and opening being together and an assertion being raised. Not failing this case causes broken groups to not report values, particularly for topdown events. Reported-by: Dapeng Mi Closes: https://lore.kernel.org/lkml/20250822082233.1850417-1-dapeng1.mi@li= nux.intel.com/ Signed-off-by: Ian Rogers Reviewed-by: Dapeng Mi Tested-by:=C2=A0Dapeng Mi --- tools/perf/builtin-stat.c | 48 +++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 2c38dd98f6ca..ab567919b89a 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -613,33 +613,40 @@ enum counter_recovery { COUNTER_FATAL, }; =20 -static enum counter_recovery stat_handle_error(struct evsel *counter) +static enum counter_recovery stat_handle_error(struct evsel *counter, int = err) { char msg[BUFSIZ]; + + if (counter->skippable) { + if (verbose > 0) { + ui__warning("skipping event %s that kernel failed to open .\n", + evsel__name(counter)); + } + counter->supported =3D false; + counter->errored =3D true; + return COUNTER_SKIP; + } + /* * PPC returns ENXIO for HW counters until 2.6.37 * (behavior changed with commit b0a873e). */ - if (errno =3D=3D EINVAL || errno =3D=3D ENOSYS || - errno =3D=3D ENOENT || errno =3D=3D ENXIO) { - if (verbose > 0) + if (err =3D=3D EINVAL || err =3D=3D ENOSYS || err =3D=3D ENOENT || err = =3D=3D ENXIO) { + if (verbose > 0) { ui__warning("%s event is not supported by the kernel.\n", evsel__name(counter)); + } counter->supported =3D false; /* * errored is a sticky flag that means one of the counter's * cpu event had a problem and needs to be reexamined. */ counter->errored =3D true; - - if ((evsel__leader(counter) !=3D counter) || - !(counter->core.leader->nr_members > 1)) - return COUNTER_SKIP; - } else if (evsel__fallback(counter, &target, errno, msg, sizeof(msg))) { + } else if (evsel__fallback(counter, &target, err, msg, sizeof(msg))) { if (verbose > 0) ui__warning("%s\n", msg); return COUNTER_RETRY; - } else if (target__has_per_thread(&target) && errno !=3D EOPNOTSUPP && + } else if (target__has_per_thread(&target) && err !=3D EOPNOTSUPP && evsel_list->core.threads && evsel_list->core.threads->err_thread !=3D -1) { /* @@ -651,29 +658,16 @@ static enum counter_recovery stat_handle_error(struct= evsel *counter) evsel_list->core.threads->err_thread =3D -1; return COUNTER_RETRY; } - } else if (counter->skippable) { - if (verbose > 0) - ui__warning("skipping event %s that kernel failed to open .\n", - evsel__name(counter)); - counter->supported =3D false; - counter->errored =3D true; - return COUNTER_SKIP; - } - - if (errno =3D=3D EOPNOTSUPP) { + } else if (err =3D=3D EOPNOTSUPP) { if (verbose > 0) { ui__warning("%s event is not supported by the kernel.\n", evsel__name(counter)); } counter->supported =3D false; counter->errored =3D true; - - if ((evsel__leader(counter) !=3D counter) || - !(counter->core.leader->nr_members > 1)) - return COUNTER_SKIP; } =20 - evsel__open_strerror(counter, &target, errno, msg, sizeof(msg)); + evsel__open_strerror(counter, &target, err, msg, sizeof(msg)); ui__error("%s\n", msg); =20 if (child_pid !=3D -1) @@ -761,7 +755,7 @@ static int __run_perf_stat(int argc, const char **argv,= int run_idx) continue; } =20 - switch (stat_handle_error(counter)) { + switch (stat_handle_error(counter, errno)) { case COUNTER_FATAL: err =3D -1; goto err_out; @@ -803,7 +797,7 @@ static int __run_perf_stat(int argc, const char **argv,= int run_idx) if (create_perf_stat_counter(counter, &stat_config, &target, evlist_cpu_itr.cpu_map_idx) < 0) { =20 - switch (stat_handle_error(counter)) { + switch (stat_handle_error(counter, errno)) { case COUNTER_FATAL: err =3D -1; goto err_out; --=20 2.51.0.261.g7ce5a0a67e-goog From nobody Fri Oct 3 20:26:54 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 E9EA829A9FA for ; Mon, 25 Aug 2025 21:12:17 +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=1756156340; cv=none; b=D5R/Mg2JwGYY9yMhvub/rSKExQXh7N7XkwhwsCzg53kq6YpIE3Tbtf4uHWU6lmGnEDrXyF6wA8rpheCg2DbS0XdHc31etWZLDQUVi1NGGjlHNoC4B6Rb9nJXx3DFGgg6R5ydQllZAMtDJwViemODoBIq28Zq17K3b+E+M0x8x/U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756156340; c=relaxed/simple; bh=5c12GW5uW54RCp4fC3zBzGwrDpAxY2DPvKafZkM0t+g=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=l0V5ZEHkMAbFZPgOJtJfQvgno7q4lgBp5ju21B+fryced6WpOFkSyRmhfuVHxY+mxecRGU5Hw/Ub93enJCvw6IO7KxMTjObDmc27REtVaoR6AKpTahmD8onJQUoSd5juLZk5wFAeF8cteiEjZgBwAX7pTaOJYxYaKGq/WhQkpqI= 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=CUMxC6Bd; 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="CUMxC6Bd" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-244581ce13aso89514695ad.2 for ; Mon, 25 Aug 2025 14:12:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1756156337; x=1756761137; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=t+nlrKUtv7jO/bAmeO/87u7JkQohuUh/Ui3QeA1Ivfo=; b=CUMxC6BdKkMuNjXWErLr+cAENCqyOsLX7mvEJ+SE8ZODEJhhD9YssPxQYUUqi/T7Rr CQORqGcw0PUmxqSSDAeSNmfcI61LX7r+UKDSIp2vhqB2gPiMvJubwbZW5jop9roCE4FE B3z4KLO0Vr06P+JBpXOA2Ulewu2MLt9wIwp+vy08bkSStH2IFMOok7z3Vlnkvu2IJ2g4 GzWDpBjgZL+CS1tH3dO5jVvcBo6pB3ZkOhx3m4N3AvaDkVT8TzSLsV7Eq7K9y+eQn1HD oasnmDYFDqAizhArD9i8f/GCJ+loQNCPV+H9rFj/STSVoJBBGAmzIJvJfyCk+JB0l4ze Ox0g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756156337; x=1756761137; h=cc: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=t+nlrKUtv7jO/bAmeO/87u7JkQohuUh/Ui3QeA1Ivfo=; b=C04WqV7mFGNPxyEeBidqu8vX4CcEuEBdiap4cJDecUUz8CXdC0p3qvXIPiztS4TSEV NOQ+W3000T6dbBrg0DqELlU/i9FxM93qNQNYvV9XRAzVflprBAAUlyS6qiveiRVTr87Y 1QMJOj8SC+tI/VzlCPATn+G6gb84+gdOuork9xBY0NaXiWSvDeZodHzL1obcQz7f0B64 Gdz0WuT23dPnBh7O9pZaUliiehCraNOj0Sj89sQ1k/b/Plcpg+ulZqCprDj5W58LfRJG wKWG67yYmoB/6510ksieLTDXCWiOXkcpx91s9lr2SpQAusdW1XWJix6j1VHg25r4cLdp Y4bQ== X-Forwarded-Encrypted: i=1; AJvYcCXZhKWmfNRXY7mFST+6nqSfJU+sbmzFTRXN6V0dqMTzyNYh7dcFOhv69SudpHmUpuodu4r/EawawNARmA4=@vger.kernel.org X-Gm-Message-State: AOJu0Yyaj2mWkqkZOcesMenk3Geh0ytVXljG+dWnV2ZwmOJ/H1paoRLT GkYof/nB+X1YCLNcAwq8Ey+iLVL4k4+wu/N2V2fBXc7Y22wnLdhrC6X2RhTgZRsZauBN3Ie4UVh lRNc/i4KHow== X-Google-Smtp-Source: AGHT+IFC1+eJDKxR+1N1NPkEm4OgKei4TCoV2Sfh3ijf8Zy0FF8kbXPiqkttltdkqM0g5Yucik+hDcSDbPGv X-Received: from plblb13.prod.google.com ([2002:a17:902:fa4d:b0:246:5661:c356]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:ebc5:b0:246:255a:1915 with SMTP id d9443c01a7336-2462eea840emr160319835ad.27.1756156337145; Mon, 25 Aug 2025 14:12:17 -0700 (PDT) Date: Mon, 25 Aug 2025 14:12:04 -0700 In-Reply-To: <20250825211204.2784695-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: <20250825211204.2784695-1-irogers@google.com> X-Mailer: git-send-email 2.51.0.261.g7ce5a0a67e-goog Message-ID: <20250825211204.2784695-4-irogers@google.com> Subject: [PATCH v1 3/3] perf parse-events: Add 'X' modifier to exclude an event from being regrouped From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , James Clark , Greg Kroah-Hartman , Yoshihiro Furudera , Dapeng Mi , Howard Chu , Thomas Falcon , Andi Kleen , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Xudong Hao Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The function parse_events__sort_events_and_fix_groups is needed to fix uncore events like: ``` $ perf stat -e '{data_read,data_write}' ... ``` so that the multiple uncore PMUs have a group each of data_read and data_write events. The same function will perform architecture sorting and group fixing, in particular for Intel topdown/perf-metric events. Grouping multiple perf metric events together causes perf_event_open to fail as the group can only support one. This means command lines like: ``` $ perf stat -e 'slots,slots' ... ``` fail as the slots events are forced into a group together to try to satisfy the perf-metric event constraints. As the user may know better than parse_events__sort_events_and_fix_groups add a 'X' modifier to skip its regrouping behavior. This allows the following to succeed rather than fail on the second slots event being opened: ``` $ perf stat -e 'slots,slots:X' -a sleep 1 Performance counter stats for 'system wide': 6,834,154,071 cpu_core/slots/ = (50.13%) 5,548,629,453 cpu_core/slots/X = (49.87%) 1.002634606 seconds time elapsed ``` Reported-by: Xudong Hao Reported-by: Dapeng Mi Closes: https://lore.kernel.org/lkml/20250822082233.1850417-1-dapeng1.mi@li= nux.intel.com/ Signed-off-by: Ian Rogers Reviewed-by: Dapeng Mi Tested-by:=C2=A0Dapeng Mi --- tools/perf/Documentation/perf-list.txt | 1 + tools/perf/util/evsel.h | 1 + tools/perf/util/parse-events.c | 5 +++-- tools/perf/util/parse-events.h | 1 + tools/perf/util/parse-events.l | 5 +++-- 5 files changed, 9 insertions(+), 4 deletions(-) diff --git a/tools/perf/Documentation/perf-list.txt b/tools/perf/Documentat= ion/perf-list.txt index 28215306a78a..a5039d1614f9 100644 --- a/tools/perf/Documentation/perf-list.txt +++ b/tools/perf/Documentation/perf-list.txt @@ -73,6 +73,7 @@ counted. The following modifiers exist: e - group or event are exclusive and do not share the PMU b - use BPF aggregration (see perf stat --bpf-counters) R - retire latency value of the event + X - don't regroup the event to match PMUs =20 The 'p' modifier can be used for specifying how precise the instruction address should be. The 'p' modifier can be specified multiple times: diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index e927a3a4fe0e..03f9f22e3a0c 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -89,6 +89,7 @@ struct evsel { bool use_config_name; bool skippable; bool retire_lat; + bool dont_regroup; int bpf_fd; struct bpf_object *bpf_obj; struct list_head config_terms; diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 8282ddf68b98..43de19551c81 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -1892,6 +1892,8 @@ static int parse_events__modifier_list(struct parse_e= vents_state *parse_state, evsel->bpf_counter =3D true; if (mod.retire_lat) evsel->retire_lat =3D true; + if (mod.dont_regroup) + evsel->dont_regroup =3D true; } return 0; } @@ -2188,13 +2190,12 @@ static int parse_events__sort_events_and_fix_groups= (struct list_head *list) * Set the group leader respecting the given groupings and that * groups can't span PMUs. */ - if (!cur_leader) { + if (!cur_leader || pos->dont_regroup) { cur_leader =3D pos; cur_leaders_grp =3D &pos->core; if (pos_force_grouped) force_grouped_leader =3D pos; } - cur_leader_pmu_name =3D cur_leader->group_pmu_name; if (strcmp(cur_leader_pmu_name, pos_pmu_name)) { /* PMU changed so the group/leader must change. */ diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index 62dc7202e3ba..a5c5fc39fd6f 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h @@ -216,6 +216,7 @@ struct parse_events_modifier { bool guest : 1; /* 'G' */ bool host : 1; /* 'H' */ bool retire_lat : 1; /* 'R' */ + bool dont_regroup : 1; /* 'X' */ }; =20 int parse_events__modifier_event(struct parse_events_state *parse_state, v= oid *loc, diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l index 2034590eb789..294e943bcdb4 100644 --- a/tools/perf/util/parse-events.l +++ b/tools/perf/util/parse-events.l @@ -206,6 +206,7 @@ static int modifiers(struct parse_events_state *parse_s= tate, yyscan_t scanner) CASE('e', exclusive); CASE('b', bpf); CASE('R', retire_lat); + CASE('X', dont_regroup); default: return PE_ERROR; } @@ -251,10 +252,10 @@ term_name {name_start}[a-zA-Z0-9_*?.\[\]!\-:]* quoted_name [\']{name_start}[a-zA-Z0-9_*?.\[\]!\-:,\.=3D]*[\'] drv_cfg_term [a-zA-Z0-9_\.]+(=3D[a-zA-Z0-9_*?\.:]+)? /* - * If you add a modifier you need to update check_modifier(). + * If you add a modifier you need to update modifiers(). * Also, the letters in modifier_event must not be in modifier_bp. */ -modifier_event [ukhpPGHSDIWebR]{1,16} +modifier_event [ukhpPGHSDIWebRX]{1,17} modifier_bp [rwx]{1,3} lc_type (L1-dcache|l1-d|l1d|L1-data|L1-icache|l1-i|l1i|L1-instruction|LLC= |L2|dTLB|d-tlb|Data-TLB|iTLB|i-tlb|Instruction-TLB|branch|branches|bpu|btb|= bpc|node) lc_op_result (load|loads|read|store|stores|write|prefetch|prefetches|specu= lative-read|speculative-load|refs|Reference|ops|access|misses|miss) --=20 2.51.0.261.g7ce5a0a67e-goog