From nobody Sat Oct 24 13:19:52 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 56D8753D9EA; Tue, 13 Oct 2026 20:14:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922471; cv=none; b=PwqsFBfqmpDv0XGPmbg/SPrE0oCS9NrjOJj7hqhJcFMhQCmK9chE3rOiw0s0PvyjMg75JyCZTQon0zWPJwE8pxfNZ0fTcoLOOojaEwZiGpo3SMyxSSu9HMamhuL+qLs5dbRcKaQesPeqi5sIk5oHtkf4VWZPcSxJfJvHhtFHFLs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922471; c=relaxed/simple; bh=SmxGbot7TR9HDni/Elet4vrkv/9q2gIcEau2siebyHQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jLw/XHhKITitMOf5Mr6+YSLrdTSfC7E7706ygYqHT/SnthzDsZfIDDAVHJ8XA53gk3pD7bCJ2PvMp+H6TldwCo/AxOS8Ryk3BjytqVehXj/bYxDNhj8n0Qih/cuvc6MT5G/zSVDDunuxCoPXV0IXnztbVBgkIa+d1letvSQtOxA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=iG3rYam+; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="iG3rYam+" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8243D1F00893; Tue, 13 Oct 2026 20:14:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1791922469; bh=w5/BfkC1OceS3dX0jV7eo4MrwK7mpfm5mPAWRCk6F7M=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=iG3rYam+sCgtv9ecpz7G83YzJ2TFH4wR3A3opZ1ZNxMusEQzdQkT2KXcuQpsAoJXY AL6ZGzpx1HPajDWJbXgqa2QNsiVYz96QWNAbUvpfWCSXdqML3KAkc5X41PTLK3801H l4yUMFIAJs3/I5K6lRbu2qrKqiggcd3dkN3ReEesKWqJTr1VukhXMW1/7CGe2y/Qu3 QPKjzRwrgUc//N3MbEcHC8F8lKFOr6S/1X17/GsqcDWz/OYioVDcnmDIgvbSWCo7Ne 8VG6SFh3OjwCpna0TwPeJ0WFbuGy6HDWnhJwdK7UFGFgjvxtch0FxDp+7LboaIbdk2 Lv69an7ayyIeg== From: Arnaldo Carvalho de Melo To: Namhyung Kim Cc: Ingo Molnar , Thomas Gleixner , James Clark , Jiri Olsa , Ian Rogers , Adrian Hunter , Clark Williams , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v2 01/19] perf test attr: Fix record dwarf sample_type expectation Date: Tue, 13 Oct 2026 17:13:56 -0300 Message-ID: <20261013201415.36428-2-acme@kernel.org> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20261013201415.36428-1-acme@kernel.org> References: <20261013201415.36428-1-acme@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arnaldo Carvalho de Melo Since commit bdd051e24914 ("perf record: Split --data-mmap option"), record_opts__parse_callchain() sets record_data_mmap instead of record->sample_address for the DWARF unwind mode, so -d/--data and its implied PERF_SAMPLE_DATA_SRC are not enabled implicitly anymore. As a result, --call-graph dwarf no longer sets PERF_SAMPLE_ADDR and PERF_SAMPLE_DATA_SRC, making the test fail: expected sample_type=3D45359, got 12583 where 45359 (0xb12f) is: IP|TID|TIME|ADDR|CALLCHAIN|PERIOD|REGS_USER|STACK_USER|DATA_SRC and 12583 (0x3127) is: IP|TID|TIME|CALLCHAIN|PERIOD|REGS_USER|STACK_USER i.e. the values differ exactly by PERF_SAMPLE_ADDR (0x8) and PERF_SAMPLE_DATA_SRC (0x8000). The mmap_data=3D1 expectation is still correct as DWARF now enables record_data_mmap. This went unnoticed until tests/attr.sh stopped ignoring attr.py's return value. Fixes: bdd051e249141c79 ("perf record: Split --data-mmap option") Assisted-by: LLM Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/tests/shell/attr/test-record-graph-dwarf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/perf/tests/shell/attr/test-record-graph-dwarf b/tools/pe= rf/tests/shell/attr/test-record-graph-dwarf index ae92061d611ded68..fbe0faa8cdb6a8f4 100644 --- a/tools/perf/tests/shell/attr/test-record-graph-dwarf +++ b/tools/perf/tests/shell/attr/test-record-graph-dwarf @@ -4,7 +4,7 @@ args =3D --no-bpf-event --call-graph dwarf -- kill >/dev= /null 2>&1 ret =3D 1 =20 [event:base-record] -sample_type=3D45359 +sample_type=3D12583 exclude_callchain_user=3D1 sample_stack_user=3D8192 # TODO different for each arch, no support for that now --=20 2.55.0 From nobody Sat Oct 24 13:19:52 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6EF0D549364; Tue, 13 Oct 2026 20:14:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922476; cv=none; b=MP5ejxRYAQnuZDdjGLZHTjWqnywLdCGTzqiNFmrsD1SWHn/J2rWZVP92LQ6td8y6gsfL1pw5/GVHkTXXI9+dF8YkbH8x+lES0ZaOS0NHFCF3NRr4amJNTSRN1z0pUaYgJTpH1ZHoHjE79VNJl+LG/kSlnIDTGOqUtXZsVTIiw5A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922476; c=relaxed/simple; bh=fH6APVUvTL2SFovnXC23fY0R7TeHqCBW+rfwxLletRo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=M6oXxuZaKybjk+Twb7hMPkMvh5/D2S+nDjYOS6BEFDTFv3VujNKVHaubNXBCriHpBYrWSzNW6t5kUkG++xMrPUopERTTdLlAFlkl8a/uKNRffAY72kbOuQEgnwvOfpS5ejTEwsCwSbKZobVq7AZaR+tIjFArd6Qp+qyWC2XrPiI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=MT84hEYY; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="MT84hEYY" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 56EBD1F000FF; Tue, 13 Oct 2026 20:14:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1791922472; bh=Ton9px6bri0eGQ+iaaee8QJchVlFT7GF1K2K2iBDlU4=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=MT84hEYY3oh4OL87Y6Rmp9jnTh3N7sgw4ZpBjk1NPo4nOEDdRjCrMNse4HfRKbSUp oosmEElGl8xHfw/hKLOVOqRqTPS2/MAHGfSp+g+8qJ3tORaX5iz/SfiuuJGbxAnv7/ hYQlG+UGxQkm8D+o9KpcjN+9FMXF3sEasljJB/WO/ryLmGq+uUPGCBERQxKA51Po/w kXWEny2R1w+GF9qMc1cPD2KO60QQRop3sL0IX7iBSbBEtHlzgEWluWoKfxEeH2RZs0 sVxG1rYb552pvzRMoD8fFDD+eYUEDiq5qmnNSkU9Z/U2HK1OjgCTdz4yej7cFvMc8w YGM2N6KxABocw== From: Arnaldo Carvalho de Melo To: Namhyung Kim Cc: Ingo Molnar , Thomas Gleixner , James Clark , Jiri Olsa , Ian Rogers , Adrian Hunter , Clark Williams , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v2 02/19] perf test attr: Allow tests to require a core PMU Date: Tue, 13 Oct 2026 17:13:57 -0300 Message-ID: <20261013201415.36428-3-acme@kernel.org> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20261013201415.36428-1-acme@kernel.org> References: <20261013201415.36428-1-acme@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arnaldo Carvalho de Melo On machines without a usable core PMU, like an aarch64 box with no DT node for the ARM PMU, the expectations that pin the legacy hardware encoding can't be checked: without a core PMU at all 'cycles' doesn't even resolve, and with one that can't be opened 'perf record' takes the software fallback and records attributes they can never match: expected type=3D0, got 1 expected config=3D0, got 1 FAILED '.../attr/test-record-group-sampling1' - match failure And since attr.py stops at the first failure, every expectation that would come after that one ends up not being run at all. Add a 'requires' limitation, modelled after the existing 'arch', 'auxv' and 'kernel_since/until' ones, with 'core-pmu' as its first value, that is checked by asking perf itself to open 'cycles' via its python binding: a parse failure or an ENOENT means there is no PMU that can count it, hence nothing to check and the test gets skipped, while any other error means we can't tell, so the test keeps running as it does today, where there is no binding to ask either. An old distro python package may have a 'perf' module without parse_events(), i.e. there is nothing to ask with, so that AttributeError gets the same treatment as the ImportError: let the expectations speak. The expectations that have a strict 'type=3D0', plus the group tests, where the fallback drops a member and leaves nothing to compare the group leader attributes with, now state that they require a core PMU. They are marked here, before the commit that has the group tests ask for the legacy encodings, so the requisite comes with that dependency. Assisted-by: LLM Signed-off-by: Arnaldo Carvalho de Melo --- .../shell/attr/test-record-group-sampling | 1 + .../shell/attr/test-record-group-sampling1 | 1 + .../shell/attr/test-record-group-sampling2 | 1 + .../perf/tests/shell/attr/test-record-group1 | 1 + .../perf/tests/shell/attr/test-record-group2 | 1 + .../perf/tests/shell/attr/test-record-group3 | 1 + tools/perf/tests/shell/attr/test-stat-C0 | 1 + tools/perf/tests/shell/attr/test-stat-basic | 1 + tools/perf/tests/shell/attr/test-stat-default | 1 + .../tests/shell/attr/test-stat-detailed-1 | 1 + .../tests/shell/attr/test-stat-detailed-2 | 1 + .../tests/shell/attr/test-stat-detailed-3 | 1 + tools/perf/tests/shell/attr/test-stat-group1 | 1 + .../tests/shell/attr/test-stat-no-inherit | 1 + tools/perf/tests/shell/lib/attr.py | 44 +++++++++++++++++++ 15 files changed, 58 insertions(+) diff --git a/tools/perf/tests/shell/attr/test-record-group-sampling b/tools= /perf/tests/shell/attr/test-record-group-sampling index 86a940d7895d7404..b43d9fe3af75c096 100644 --- a/tools/perf/tests/shell/attr/test-record-group-sampling +++ b/tools/perf/tests/shell/attr/test-record-group-sampling @@ -3,6 +3,7 @@ command =3D record args =3D --no-bpf-event -e '{cycles,cache-misses}:S' kill >/dev/null 2>= &1 ret =3D 1 kernel_until =3D 6.12 +requires =3D core-pmu =20 [event-1:base-record] fd=3D1 diff --git a/tools/perf/tests/shell/attr/test-record-group-sampling1 b/tool= s/perf/tests/shell/attr/test-record-group-sampling1 index 4748ab7bf68437c7..3def72161820dca3 100644 --- a/tools/perf/tests/shell/attr/test-record-group-sampling1 +++ b/tools/perf/tests/shell/attr/test-record-group-sampling1 @@ -3,6 +3,7 @@ command =3D record args =3D --no-bpf-event -e '{cycles,cache-misses}:S' kill >/dev/null 2>= &1 ret =3D 1 kernel_since =3D 6.12 +requires =3D core-pmu =20 [event-1:base-record] fd=3D1 diff --git a/tools/perf/tests/shell/attr/test-record-group-sampling2 b/tool= s/perf/tests/shell/attr/test-record-group-sampling2 index e0432244a0eb7f6c..227c18bb221c4b2f 100644 --- a/tools/perf/tests/shell/attr/test-record-group-sampling2 +++ b/tools/perf/tests/shell/attr/test-record-group-sampling2 @@ -3,6 +3,7 @@ command =3D record args =3D --no-bpf-event -c 10000 -e '{cycles,cache-misses}:S' kill >/de= v/null 2>&1 ret =3D 1 kernel_since =3D 6.12 +requires =3D core-pmu =20 [event-1:base-record] fd=3D1 diff --git a/tools/perf/tests/shell/attr/test-record-group1 b/tools/perf/te= sts/shell/attr/test-record-group1 index eeb1db392bc9ceac..a57c7ee8aaa4f9c9 100644 --- a/tools/perf/tests/shell/attr/test-record-group1 +++ b/tools/perf/tests/shell/attr/test-record-group1 @@ -2,6 +2,7 @@ command =3D record args =3D --no-bpf-event -e '{cycles,instructions}' kill >/dev/null 2>&1 ret =3D 1 +requires =3D core-pmu =20 [event-1:base-record] fd=3D1 diff --git a/tools/perf/tests/shell/attr/test-record-group2 b/tools/perf/te= sts/shell/attr/test-record-group2 index 891d41a7bddf785a..fb6e664eeacc10ef 100644 --- a/tools/perf/tests/shell/attr/test-record-group2 +++ b/tools/perf/tests/shell/attr/test-record-group2 @@ -3,6 +3,7 @@ command =3D record args =3D --no-bpf-event -e '{cycles/period=3D1234000/,instructions/peri= od=3D6789000/}:S' kill >/dev/null 2>&1 ret =3D 1 kernel_until =3D 6.12 +requires =3D core-pmu =20 [event-1:base-record] fd=3D1 diff --git a/tools/perf/tests/shell/attr/test-record-group3 b/tools/perf/te= sts/shell/attr/test-record-group3 index 249be884959eaaba..7b90b4411d8f4b90 100644 --- a/tools/perf/tests/shell/attr/test-record-group3 +++ b/tools/perf/tests/shell/attr/test-record-group3 @@ -3,6 +3,7 @@ command =3D record args =3D --no-bpf-event -e '{cycles/period=3D1234000/,instructions/peri= od=3D6789000/}:S' kill >/dev/null 2>&1 ret =3D 1 kernel_since =3D 6.12 +requires =3D core-pmu =20 [event-1:base-record] fd=3D1 diff --git a/tools/perf/tests/shell/attr/test-stat-C0 b/tools/perf/tests/sh= ell/attr/test-stat-C0 index a2c76d10b2bb2a15..9d242e93e3a92009 100644 --- a/tools/perf/tests/shell/attr/test-stat-C0 +++ b/tools/perf/tests/shell/attr/test-stat-C0 @@ -2,6 +2,7 @@ command =3D stat args =3D -e cycles -C 0 kill >/dev/null 2>&1 ret =3D 1 +requires =3D core-pmu =20 [event:base-stat] # events are disabled by default when attached to cpu diff --git a/tools/perf/tests/shell/attr/test-stat-basic b/tools/perf/tests= /shell/attr/test-stat-basic index 69867d049fda926f..277897bd2626a41f 100644 --- a/tools/perf/tests/shell/attr/test-stat-basic +++ b/tools/perf/tests/shell/attr/test-stat-basic @@ -2,6 +2,7 @@ command =3D stat args =3D -e cycles kill >/dev/null 2>&1 ret =3D 1 +requires =3D core-pmu =20 [event:base-stat] optional=3D1 diff --git a/tools/perf/tests/shell/attr/test-stat-default b/tools/perf/tes= ts/shell/attr/test-stat-default index 8dd27c1fb661fb77..74691188e859a169 100644 --- a/tools/perf/tests/shell/attr/test-stat-default +++ b/tools/perf/tests/shell/attr/test-stat-default @@ -2,6 +2,7 @@ command =3D stat args =3D kill >/dev/null 2>&1 ret =3D 1 +requires =3D core-pmu =20 # PERF_TYPE_SOFTWARE / PERF_COUNT_SW_TASK_CLOCK [event1:base-stat] diff --git a/tools/perf/tests/shell/attr/test-stat-detailed-1 b/tools/perf/= tests/shell/attr/test-stat-detailed-1 index 12a2ebf4e64a0077..d9a6236054f2dfb1 100644 --- a/tools/perf/tests/shell/attr/test-stat-detailed-1 +++ b/tools/perf/tests/shell/attr/test-stat-detailed-1 @@ -2,6 +2,7 @@ command =3D stat args =3D -d kill >/dev/null 2>&1 ret =3D 1 +requires =3D core-pmu =20 =20 # PERF_TYPE_SOFTWARE / PERF_COUNT_SW_TASK_CLOCK diff --git a/tools/perf/tests/shell/attr/test-stat-detailed-2 b/tools/perf/= tests/shell/attr/test-stat-detailed-2 index 66ea25b7d38f8d59..582a30289ccfa6df 100644 --- a/tools/perf/tests/shell/attr/test-stat-detailed-2 +++ b/tools/perf/tests/shell/attr/test-stat-detailed-2 @@ -2,6 +2,7 @@ command =3D stat args =3D -dd kill >/dev/null 2>&1 ret =3D 1 +requires =3D core-pmu =20 =20 # PERF_TYPE_SOFTWARE / PERF_COUNT_SW_TASK_CLOCK diff --git a/tools/perf/tests/shell/attr/test-stat-detailed-3 b/tools/perf/= tests/shell/attr/test-stat-detailed-3 index 4a27bbfb9f87a538..2d0fca8b5020f504 100644 --- a/tools/perf/tests/shell/attr/test-stat-detailed-3 +++ b/tools/perf/tests/shell/attr/test-stat-detailed-3 @@ -2,6 +2,7 @@ command =3D stat args =3D -ddd kill >/dev/null 2>&1 ret =3D 1 +requires =3D core-pmu =20 =20 # PERF_TYPE_SOFTWARE / PERF_COUNT_SW_TASK_CLOCK diff --git a/tools/perf/tests/shell/attr/test-stat-group1 b/tools/perf/test= s/shell/attr/test-stat-group1 index 1746751123dcb2c4..3d8b44ba42d6ae19 100644 --- a/tools/perf/tests/shell/attr/test-stat-group1 +++ b/tools/perf/tests/shell/attr/test-stat-group1 @@ -2,6 +2,7 @@ command =3D stat args =3D -e '{cycles,instructions}' kill >/dev/null 2>&1 ret =3D 1 +requires =3D core-pmu =20 [event-1:base-stat] fd=3D1 diff --git a/tools/perf/tests/shell/attr/test-stat-no-inherit b/tools/perf/= tests/shell/attr/test-stat-no-inherit index 924fbb9300d16259..38f746855b1b3e11 100644 --- a/tools/perf/tests/shell/attr/test-stat-no-inherit +++ b/tools/perf/tests/shell/attr/test-stat-no-inherit @@ -2,6 +2,7 @@ command =3D stat args =3D -i -e cycles kill >/dev/null 2>&1 ret =3D 1 +requires =3D core-pmu =20 [event:base-stat] inherit=3D0 diff --git a/tools/perf/tests/shell/lib/attr.py b/tools/perf/tests/shell/li= b/attr.py index 68f06df9565a0811..b55c9b881e59852f 100644 --- a/tools/perf/tests/shell/lib/attr.py +++ b/tools/perf/tests/shell/lib/attr.py @@ -1,6 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 =20 import configparser +import errno import os import sys import glob @@ -28,6 +29,34 @@ def data_equal(a, b): =20 return False =20 +def core_pmu_available(): + """ + Is there a core PMU on this machine? Without one hardware events aren't + supported and get replaced by the software fallback, so there's no way= to + check the expectations that pin their legacy encodings. + """ + try: + import perf + parse_events =3D perf.parse_events + except (ImportError, AttributeError): + # Nothing to ask about it, let the expectations speak. + return True + + try: + evlist =3D parse_events('cycles') + except OSError: + # No PMU that can count it, the same as the ENOENT below. + return False + + try: + evlist.open() + except OSError as err: + # Anything else is a permission problem or alike, not our business= here. + return err.errno !=3D errno.ENOENT + evlist.close() + + return True + class Fail(Exception): def __init__(self, test, msg): self.msg =3D msg @@ -138,6 +167,9 @@ def parse_version(version): # 'arch' - architecture specific test (optional) # comma separated list, ! at the beginning # negates it. +# 'requires' - Comma separated list of things the test needs, it is +# skipped when any of them isn't there, currently: +# core-pmu - the machine can count hardware events. # 'auxv' - Truthy statement that is evaled in the scope of the auxv= map. When false, # the test is skipped. For example 'auxv["AT_HWCAP"] =3D= =3D 10'. (optional) # 'kernel_since' - Inclusive kernel version from which the test will s= tart running. Only the @@ -173,6 +205,7 @@ class Test(object): self.arch =3D '' =20 self.auxv =3D parser.get('config', 'auxv', fallback=3DNone) + self.requires =3D parser.get('config', 'requires', fallback=3D'') self.kernel_since =3D parse_version(parser.get('config', 'kernel_s= ince', fallback=3DNone)) self.kernel_until =3D parse_version(parser.get('config', 'kernel_u= ntil', fallback=3DNone)) self.expect =3D {} @@ -242,6 +275,14 @@ class Test(object): return False return True =20 + def skip_test_requires(self): + for requirement in filter(None, map(str.strip, self.requires.split= (','))): + if requirement =3D=3D 'core-pmu' and not core_pmu_available(): + log.warning("test limitation 'requires %s'", requirement) + return True + + return False + def restore_sample_rate(self, value=3D10000): try: # Check value of sample_rate @@ -296,6 +337,9 @@ class Test(object): if self.skip_test_kernel_until(): raise Notest(self, "new kernel skip") =20 + if self.skip_test_requires(): + raise Notest(self, "requirements skip") + self.restore_sample_rate() cmd =3D "PERF_TEST_ATTR=3D%s %s %s -o %s/perf.data %s" % (tempdir, self.perf, self.command, tempdir, self.args) --=20 2.55.0 From nobody Sat Oct 24 13:19:52 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0EF3D548554; Tue, 13 Oct 2026 20:14:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922478; cv=none; b=fw9ViLfl6z3mOZ6KLWhKNiCDl+w8D1Wtl+wcGTe2TCqImqd5nYH6RBE1N8Bzp5xRzFmZLEk+m+DEsPQpyNm2mM0plH5HNtLJg375WTt+BICbLrK7q/ac662aBVQufLwQOfiVs7KX6P7MXRjsWWcBnT1yeHSUMIOEJzKGGyyV118= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922478; c=relaxed/simple; bh=t+E4tfGih3vpPFUBNIItrMqIS5ICE/llhm1+MlVKsK0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tyf7luTwUN+7QC5fcDjQSdHP3//iki8zBjCQou05R9gnr/WThEtANhxmOh1t29IfRqkd0TXOWiUgvQG3JOzW6zxS5GA5pQ8Lu/jzdM0dCjYzkvpqcGESPyUB9Z1JHjYKI3wxe9OFk/k0snCufla2VT79mzKGWMm+Alm3sSVWZQQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=YWztGbTe; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="YWztGbTe" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2D4771F00893; Tue, 13 Oct 2026 20:14:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1791922475; bh=ThfGu+E8dYc3sCcwVfn5sEvFJjR1zE67fI30NdxP95g=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=YWztGbTeHZ8ZsEtvrrYLg2cgsY0+r1sB7wnLek1f5ame0JbAr9vxaj3TICpMx6cg7 mn4BzQQJDSx+ojgaB1lGA2fo1mx/vJhQ8S5Gob8LWqKuOy1trrGZRFOaA3KXeewpXo JjPO4S9msJowJEnVQBFB2MuN0XvhjlI297Qj1OwlG+XHF67Zp51WZVTmrOBc4hb/0S NrOXIjB9zhyBIPCHIfOgW5hZP9R+X9m17N5Ev5i7LGlbYVxGMG0xHIqWf/09UuU6dp z9Y80M1ulznYDGDdZCgaVOWCFNDAgCAxw8FWfpBH0cjHY3RBdO3k5cXqfqPEIL0cVv lC/RIEAZ0K+bQ== From: Arnaldo Carvalho de Melo To: Namhyung Kim Cc: Ingo Molnar , Thomas Gleixner , James Clark , Jiri Olsa , Ian Rogers , Adrian Hunter , Clark Williams , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v2 03/19] perf test attr: Fix legacy event encodings in group tests Date: Tue, 13 Oct 2026 17:13:58 -0300 Message-ID: <20261013201415.36428-4-acme@kernel.org> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20261013201415.36428-1-acme@kernel.org> References: <20261013201415.36428-1-acme@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arnaldo Carvalho de Melo Since commit b1c5efbfd92e ("perf parse-events: Remove hard coded legacy hardware and cache parsing"), event names are resolved with sysfs/JSON priority over the legacy encodings, so bare cache-misses and instructions now become the core PMU sysfs/JSON events (on x86 type 4, configs 0x412e and 0xc0) rather than the legacy PERF_TYPE_HARDWARE/config=3D3 and config=3D1 events the tests expect, e.g.: expected config=3D3, got 0 expected disabled=3D0, got 1 expected mmap=3D0, got 1 expected comm=3D0, got 1 expected freq=3D0, got 1 expected enable_on_exec=3D0, got 1 expected task=3D0, got 1 FAILED '.../test-record-group-sampling1' - match failure The shown diff is against the cycles group leader, as no result event matches the expected cache-misses member anymore. Request the legacy encodings explicitly with the legacy-hardware-config term, introduced for this purpose, keeping the original attribute expectations unchanged, in: test-record-group1 test-record-group2 test-record-group3 test-record-group-sampling test-record-group-sampling1 test-record-group-sampling2 test-stat-group1 This went unnoticed until tests/attr.sh stopped ignoring attr.py's return value. Fixes: b1c5efbfd92eb84d ("perf parse-events: Remove hard coded legacy hardw= are and cache parsing") Assisted-by: LLM Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/tests/shell/attr/README | 10 +++++----- tools/perf/tests/shell/attr/test-record-group-sampling | 4 ++-- .../perf/tests/shell/attr/test-record-group-sampling1 | 4 ++-- .../perf/tests/shell/attr/test-record-group-sampling2 | 4 ++-- tools/perf/tests/shell/attr/test-record-group1 | 2 +- tools/perf/tests/shell/attr/test-record-group2 | 2 +- tools/perf/tests/shell/attr/test-record-group3 | 2 +- tools/perf/tests/shell/attr/test-stat-group1 | 2 +- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/tools/perf/tests/shell/attr/README b/tools/perf/tests/shell/at= tr/README index 67c4ca76b85d5611..c7b49cdf87297177 100644 --- a/tools/perf/tests/shell/attr/README +++ b/tools/perf/tests/shell/attr/README @@ -49,10 +49,10 @@ Following tests are defined (with perf commands): perf record --call-graph dwarf kill (test-record-graph-dwarf) perf record --call-graph fp kill (test-record-graph-fp) perf record --call-graph fp kill (test-record-graph-fp-aarc= h64) - perf record -e '{cycles,instructions}' kill (test-record-group1) - perf record -e '{cycles/period=3D1/,instructions/period=3D2/}:S' kill (t= est-record-group2) - perf record -e '{cycles,cache-misses}:S' kill (test-record-group-samplin= g1) - perf record -c 10000 -e '{cycles,cache-misses}:S' kill (test-record-grou= p-sampling2) + perf record -e '{cycles,default_core/legacy-hardware-config=3D1/}' kill = (test-record-group1) + perf record -e '{cycles/period=3D1234000/,default_core/legacy-hardware-c= onfig=3D1,period=3D6789000/}:S' kill (test-record-group2) + perf record -e '{cycles,default_core/legacy-hardware-config=3D3/}:S' kil= l (test-record-group-sampling1) + perf record -c 10000 -e '{cycles,default_core/legacy-hardware-config=3D3= /}:S' kill (test-record-group-sampling2) perf record -D kill (test-record-no-delay) perf record -i kill (test-record-no-inherit) perf record -n kill (test-record-no-samples) @@ -67,5 +67,5 @@ Following tests are defined (with perf commands): perf stat -d kill (test-stat-detailed-1) perf stat -dd kill (test-stat-detailed-2) perf stat -ddd kill (test-stat-detailed-3) - perf stat -e '{cycles,instructions}' kill (test-stat-group1) + perf stat -e '{cycles,default_core/legacy-hardware-config=3D1/}' kill (t= est-stat-group1) perf stat -i -e cycles kill (test-stat-no-inherit) diff --git a/tools/perf/tests/shell/attr/test-record-group-sampling b/tools= /perf/tests/shell/attr/test-record-group-sampling index b43d9fe3af75c096..ed47dd1e5984535b 100644 --- a/tools/perf/tests/shell/attr/test-record-group-sampling +++ b/tools/perf/tests/shell/attr/test-record-group-sampling @@ -1,6 +1,6 @@ [config] command =3D record -args =3D --no-bpf-event -e '{cycles,cache-misses}:S' kill >/dev/null 2>= &1 +args =3D --no-bpf-event -e '{cycles,default_core/legacy-hardware-config= =3D3/}:S' kill >/dev/null 2>&1 ret =3D 1 kernel_until =3D 6.12 requires =3D core-pmu @@ -16,7 +16,7 @@ inherit=3D0 fd=3D2 group_fd=3D1 =20 -# cache-misses +# cache-misses, explicitly requested with the legacy hardware encoding type=3D0 config=3D3 =20 diff --git a/tools/perf/tests/shell/attr/test-record-group-sampling1 b/tool= s/perf/tests/shell/attr/test-record-group-sampling1 index 3def72161820dca3..9cf013dc03dd0309 100644 --- a/tools/perf/tests/shell/attr/test-record-group-sampling1 +++ b/tools/perf/tests/shell/attr/test-record-group-sampling1 @@ -1,6 +1,6 @@ [config] command =3D record -args =3D --no-bpf-event -e '{cycles,cache-misses}:S' kill >/dev/null 2>= &1 +args =3D --no-bpf-event -e '{cycles,default_core/legacy-hardware-config= =3D3/}:S' kill >/dev/null 2>&1 ret =3D 1 kernel_since =3D 6.12 requires =3D core-pmu @@ -31,7 +31,7 @@ inherit=3D1 fd=3D2 group_fd=3D1 =20 -# cache-misses +# cache-misses, explicitly requested with the legacy hardware encoding type=3D0 config=3D3 =20 diff --git a/tools/perf/tests/shell/attr/test-record-group-sampling2 b/tool= s/perf/tests/shell/attr/test-record-group-sampling2 index 227c18bb221c4b2f..bd1eb4161e4aee46 100644 --- a/tools/perf/tests/shell/attr/test-record-group-sampling2 +++ b/tools/perf/tests/shell/attr/test-record-group-sampling2 @@ -1,6 +1,6 @@ [config] command =3D record -args =3D --no-bpf-event -c 10000 -e '{cycles,cache-misses}:S' kill >/de= v/null 2>&1 +args =3D --no-bpf-event -c 10000 -e '{cycles,default_core/legacy-hardwa= re-config=3D3/}:S' kill >/dev/null 2>&1 ret =3D 1 kernel_since =3D 6.12 requires =3D core-pmu @@ -37,7 +37,7 @@ write_backward=3D0 fd=3D2 group_fd=3D1 =20 -# cache-misses +# cache-misses, explicitly requested with the legacy hardware encoding type=3D0 config=3D3 =20 diff --git a/tools/perf/tests/shell/attr/test-record-group1 b/tools/perf/te= sts/shell/attr/test-record-group1 index a57c7ee8aaa4f9c9..5fdd5288555f32ea 100644 --- a/tools/perf/tests/shell/attr/test-record-group1 +++ b/tools/perf/tests/shell/attr/test-record-group1 @@ -1,6 +1,6 @@ [config] command =3D record -args =3D --no-bpf-event -e '{cycles,instructions}' kill >/dev/null 2>&1 +args =3D --no-bpf-event -e '{cycles,default_core/legacy-hardware-config= =3D1/}' kill >/dev/null 2>&1 ret =3D 1 requires =3D core-pmu =20 diff --git a/tools/perf/tests/shell/attr/test-record-group2 b/tools/perf/te= sts/shell/attr/test-record-group2 index fb6e664eeacc10ef..e7274108f5fd7e7b 100644 --- a/tools/perf/tests/shell/attr/test-record-group2 +++ b/tools/perf/tests/shell/attr/test-record-group2 @@ -1,6 +1,6 @@ [config] command =3D record -args =3D --no-bpf-event -e '{cycles/period=3D1234000/,instructions/peri= od=3D6789000/}:S' kill >/dev/null 2>&1 +args =3D --no-bpf-event -e '{cycles/period=3D1234000/,default_core/lega= cy-hardware-config=3D1,period=3D6789000/}:S' kill >/dev/null 2>&1 ret =3D 1 kernel_until =3D 6.12 requires =3D core-pmu diff --git a/tools/perf/tests/shell/attr/test-record-group3 b/tools/perf/te= sts/shell/attr/test-record-group3 index 7b90b4411d8f4b90..e74fd3a48ac9094f 100644 --- a/tools/perf/tests/shell/attr/test-record-group3 +++ b/tools/perf/tests/shell/attr/test-record-group3 @@ -1,6 +1,6 @@ [config] command =3D record -args =3D --no-bpf-event -e '{cycles/period=3D1234000/,instructions/peri= od=3D6789000/}:S' kill >/dev/null 2>&1 +args =3D --no-bpf-event -e '{cycles/period=3D1234000/,default_core/lega= cy-hardware-config=3D1,period=3D6789000/}:S' kill >/dev/null 2>&1 ret =3D 1 kernel_since =3D 6.12 requires =3D core-pmu diff --git a/tools/perf/tests/shell/attr/test-stat-group1 b/tools/perf/test= s/shell/attr/test-stat-group1 index 3d8b44ba42d6ae19..7a31b27933f11959 100644 --- a/tools/perf/tests/shell/attr/test-stat-group1 +++ b/tools/perf/tests/shell/attr/test-stat-group1 @@ -1,6 +1,6 @@ [config] command =3D stat -args =3D -e '{cycles,instructions}' kill >/dev/null 2>&1 +args =3D -e '{cycles,default_core/legacy-hardware-config=3D1/}' kill >/= dev/null 2>&1 ret =3D 1 requires =3D core-pmu =20 --=20 2.55.0 From nobody Sat Oct 24 13:19:52 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 355A952E073; Tue, 13 Oct 2026 20:14:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922484; cv=none; b=J7jPud6ucjllEpcrMPwuAU5vRWCTZOlQRThHP8YsV2l2r/Vv1bb6jnGKVVIjKf8I1nfWfwN2oTnmZtNMDTg1AcKbFCxpgFgVkjDXmOKYCfKPfBPRxxmEUwvj8bPESJikryWWT/LCaPHAbSlGDuipqoWgG/PEClLaS6b2katbVKc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922484; c=relaxed/simple; bh=MmP4RFliqYrnus/S564MkC5NWOYTX8JmmUnoq2l8ysk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Xl9279+WNOzrX8Z2qyFk8s9ie4wm7bgTaAoPErqH8LJ6BK7JFO8zG5F+bxRosd17u8C6VO3OYYqwng8MJEA0TkVqmOnxadgjKJf4XVkCJYrtZQn+aD290jz9R96fkkxH3V70zSqrS/kloHUMzoaSb+HzH3K900EkYMdVOxZNYPs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=GT5o0rjw; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="GT5o0rjw" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 03DC31F00898; Tue, 13 Oct 2026 20:14:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1791922478; bh=fBpzmlGYZq52k6kSMq+DwQZibdc0/awlZmAUbI2Jh7E=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=GT5o0rjwz2l20TkJ0LbDyCxlk9f8JQZaaSMAFHjP8A743fjkw2zxJLYswIeaElbDM dLbtrbrZZDu68FOhQoLeRPFsPZ2IP9PfKZU6BznMw+8gsaLgKiJPqSrLnhE2yyBgYH AFtcKLGyqklqjhXNJLhPvvCRzF3BZwU1cE7qjKG71FmgSOHH8ViStezn5Rcgh3+FMt zM3y9Qs8K3kmR2ADH9rkRGMB2DXy7M3OBlf6A1owUhovAJfzwynhWEaXRDFN5prnlk P4g3BKVIrZNsGNOu7f1uY2E//ZlYzCttckw2j6Q3idFKTSTd8iFWbz7wqutIMgTg9f 6pjWXrp2KirUg== From: Arnaldo Carvalho de Melo To: Namhyung Kim Cc: Ingo Molnar , Thomas Gleixner , James Clark , Jiri Olsa , Ian Rogers , Adrian Hunter , Clark Williams , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v2 04/19] perf test attr: Fix default stat metrics expectations Date: Tue, 13 Oct 2026 17:13:59 -0300 Message-ID: <20261013201415.36428-5-acme@kernel.org> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20261013201415.36428-1-acme@kernel.org> References: <20261013201415.36428-1-acme@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arnaldo Carvalho de Melo Since commit c7adeb0974f1 ("perf jevents: Add set of common metrics based on default ones") and commit 2dfc0cab3da4 ("perf stat: Add detail -d,-dd,-d= dd metrics") the perf stat default metrics open their events in groups, so group leaders and members have read_format=3D15 and members are enabled without enable_on_exec, while standalone events keep read_format=3D3 and are disabled until exec. Also, since commit b1c5efbfd92e ("perf parse-events: Remove hard coded legacy hardware and cache parsing") bare hardware events resolve to the core PMU sysfs/JSON events (type 4), so add the raw encodings seen on Intel and AMD for instructions, branch-misses, cpu-cycles and stalled-cycles-frontend/backend to test-stat-default and test-stat-detailed-1/2/3. Add base-stat-group, that accepts both the standalone and the group variants of read_format, disabled and enable_on_exec, and point the four default/detailed expectations at it. test-stat-basic, test-stat-C0 and test-stat-no-inherit keep base-stat, whose events aren't opened in a group: for those, a change that groups or enables them differently is still something to catch. test-stat-group1 does open its events in a group, but pins read_format, disabled and enable_on_exec itself, the very terms base-stat-group loosens, so it doesn't need it either. Fixes: b1c5efbfd92eb84d ("perf parse-events: Remove hard coded legacy hardw= are and cache parsing") Fixes: c7adeb0974f18da4 ("perf jevents: Add set of common metrics based on = default ones") Fixes: 2dfc0cab3da4a205 ("perf stat: Add detail -d,-dd,-ddd metrics") Assisted-by: LLM Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/tests/shell/attr/base-stat-group | 45 +++++++ tools/perf/tests/shell/attr/test-stat-default | 90 +++++++++----- .../tests/shell/attr/test-stat-detailed-1 | 98 +++++++++------ .../tests/shell/attr/test-stat-detailed-2 | 110 ++++++++++------- .../tests/shell/attr/test-stat-detailed-3 | 114 +++++++++++------- 5 files changed, 307 insertions(+), 150 deletions(-) create mode 100644 tools/perf/tests/shell/attr/base-stat-group diff --git a/tools/perf/tests/shell/attr/base-stat-group b/tools/perf/tests= /shell/attr/base-stat-group new file mode 100644 index 0000000000000000..9bcb8ab3687ff9fb --- /dev/null +++ b/tools/perf/tests/shell/attr/base-stat-group @@ -0,0 +1,45 @@ +[event] +fd=3D1 +group_fd=3D-1 +# 0 or PERF_FLAG_FD_CLOEXEC flag +flags=3D0|8 +cpu=3D* +type=3D0 +size=3D176 +config=3D0 +sample_period=3D0 +sample_type=3D65536 +# The default and -d/-dd/-ddd metrics open part of their events in groups: +# the members get read_format=3D15 and are enabled right away, the standal= one +# ones keep read_format=3D3 and wait for the exec, and the leaders get 15 = when +# their group has members, 3 when alone, as create_perf_stat_counter() goe= s. +read_format=3D3|15 +disabled=3D0|1 +inherit=3D1 +pinned=3D0 +exclusive=3D0 +exclude_user=3D0 +exclude_kernel=3D0|1 +exclude_hv=3D0|1 +exclude_idle=3D0 +mmap=3D0 +comm=3D0 +freq=3D0 +inherit_stat=3D0 +enable_on_exec=3D0|1 +task=3D0 +watermark=3D0 +precise_ip=3D0 +mmap_data=3D0 +sample_id_all=3D0 +exclude_host=3D0|1 +exclude_guest=3D0|1 +exclude_callchain_kernel=3D0 +exclude_callchain_user=3D0 +wakeup_events=3D0 +bp_type=3D0 +config1=3D0 +config2=3D0 +branch_sample_type=3D0 +sample_regs_user=3D0 +sample_stack_user=3D0 diff --git a/tools/perf/tests/shell/attr/test-stat-default b/tools/perf/tes= ts/shell/attr/test-stat-default index 74691188e859a169..addeb2ce7f1412b9 100644 --- a/tools/perf/tests/shell/attr/test-stat-default +++ b/tools/perf/tests/shell/attr/test-stat-default @@ -5,72 +5,72 @@ ret =3D 1 requires =3D core-pmu =20 # PERF_TYPE_SOFTWARE / PERF_COUNT_SW_TASK_CLOCK -[event1:base-stat] +[event1:base-stat-group] fd=3D1 type=3D1 config=3D1 =20 # PERF_TYPE_SOFTWARE / PERF_COUNT_SW_CONTEXT_SWITCHES -[event2:base-stat] +[event2:base-stat-group] fd=3D2 type=3D1 config=3D3 =20 # PERF_TYPE_SOFTWARE / PERF_COUNT_SW_CPU_MIGRATIONS -[event3:base-stat] +[event3:base-stat-group] fd=3D3 type=3D1 config=3D4 =20 # PERF_TYPE_SOFTWARE / PERF_COUNT_SW_PAGE_FAULTS -[event4:base-stat] +[event4:base-stat-group] fd=3D4 type=3D1 config=3D2 =20 # PERF_TYPE_HARDWARE / PERF_COUNT_HW_CPU_CYCLES -[event5:base-stat] +[event5:base-stat-group] fd=3D5 type=3D0 config=3D0 optional=3D1 =20 # PERF_TYPE_HARDWARE / PERF_COUNT_HW_STALLED_CYCLES_FRONTEND -[event6:base-stat] +[event6:base-stat-group] fd=3D6 type=3D0 config=3D7 optional=3D1 # PERF_TYPE_HARDWARE / PERF_COUNT_HW_STALLED_CYCLES_BACKEND -[event7:base-stat] +[event7:base-stat-group] fd=3D7 type=3D0 config=3D8 optional=3D1 =20 # PERF_TYPE_HARDWARE / PERF_COUNT_HW_INSTRUCTIONS -[event8:base-stat] +[event8:base-stat-group] fd=3D8 type=3D0 config=3D1 optional=3D1 =20 # PERF_TYPE_HARDWARE / PERF_COUNT_HW_BRANCH_INSTRUCTIONS -[event9:base-stat] +[event9:base-stat-group] fd=3D9 type=3D0 config=3D4 optional=3D1 =20 # PERF_TYPE_HARDWARE / PERF_COUNT_HW_BRANCH_MISSES -[event10:base-stat] +[event10:base-stat-group] fd=3D10 type=3D0 config=3D5 optional=3D1 =20 # PERF_TYPE_RAW / slots (0x400) -[event11:base-stat] +[event11:base-stat-group] fd=3D11 group_fd=3D-1 type=3D4 @@ -79,7 +79,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-retiring (0x8000) -[event12:base-stat] +[event12:base-stat-group] fd=3D12 group_fd=3D11 type=3D4 @@ -90,7 +90,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-bad-spec (0x8100) -[event13:base-stat] +[event13:base-stat-group] fd=3D13 group_fd=3D11 type=3D4 @@ -101,7 +101,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-fe-bound (0x8200) -[event14:base-stat] +[event14:base-stat-group] fd=3D14 group_fd=3D11 type=3D4 @@ -112,7 +112,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-be-bound (0x8300) -[event15:base-stat] +[event15:base-stat-group] fd=3D15 group_fd=3D11 type=3D4 @@ -123,7 +123,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-heavy-ops (0x8400) -[event16:base-stat] +[event16:base-stat-group] fd=3D16 group_fd=3D11 type=3D4 @@ -134,7 +134,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-br-mispredict (0x8500) -[event17:base-stat] +[event17:base-stat-group] fd=3D17 group_fd=3D11 type=3D4 @@ -145,7 +145,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-fetch-lat (0x8600) -[event18:base-stat] +[event18:base-stat-group] fd=3D18 group_fd=3D11 type=3D4 @@ -156,7 +156,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-mem-bound (0x8700) -[event19:base-stat] +[event19:base-stat-group] fd=3D19 group_fd=3D11 type=3D4 @@ -167,71 +167,99 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / INT_MISC.UOP_DROPPING -[event20:base-stat] +[event20:base-stat-group] fd=3D20 type=3D4 config=3D4109 optional=3D1 =20 # PERF_TYPE_RAW / cpu/INT_MISC.RECOVERY_CYCLES,cmask=3D1,edge/ -[event21:base-stat] +[event21:base-stat-group] fd=3D21 type=3D4 config=3D17039629 optional=3D1 =20 -# PERF_TYPE_RAW / CPU_CLK_UNHALTED.THREAD -[event22:base-stat] +# PERF_TYPE_RAW / cpu-cycles (core PMU sysfs event; Intel 0x3c, AMD 0x76) +[event22:base-stat-group] fd=3D22 type=3D4 -config=3D60 +config=3D60|118 optional=3D1 =20 # PERF_TYPE_RAW / INT_MISC.RECOVERY_CYCLES_ANY -[event23:base-stat] +[event23:base-stat-group] fd=3D23 type=3D4 config=3D2097421 optional=3D1 =20 # PERF_TYPE_RAW / CPU_CLK_UNHALTED.REF_XCLK -[event24:base-stat] +[event24:base-stat-group] fd=3D24 type=3D4 config=3D316 optional=3D1 =20 # PERF_TYPE_RAW / IDQ_UOPS_NOT_DELIVERED.CORE -[event25:base-stat] +[event25:base-stat-group] fd=3D25 type=3D4 config=3D412 optional=3D1 =20 # PERF_TYPE_RAW / CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE -[event26:base-stat] +[event26:base-stat-group] fd=3D26 type=3D4 config=3D572 optional=3D1 =20 # PERF_TYPE_RAW / UOPS_RETIRED.RETIRE_SLOTS -[event27:base-stat] +[event27:base-stat-group] fd=3D27 type=3D4 config=3D706 optional=3D1 =20 # PERF_TYPE_RAW / UOPS_ISSUED.ANY -[event28:base-stat] +[event28:base-stat-group] fd=3D28 type=3D4 config=3D270 optional=3D1 =20 # PERF_TYPE_RAW / INT_MISC.UOP_DROPPING -[event29:base-stat] +[event29:base-stat-group] fd=3D29 type=3D4 config=3D4269 +optional=3D1 + +# PERF_TYPE_RAW / instructions (core PMU sysfs event) +[event30:base-stat-group] +fd=3D30 +type=3D4 +config=3D192 +optional=3D1 + +# PERF_TYPE_RAW / branch-misses (core PMU sysfs event; Intel 0xc5, AMD 0xc= 3) +[event31:base-stat-group] +fd=3D31 +type=3D4 +config=3D197|195 +optional=3D1 + +# PERF_TYPE_RAW / stalled-cycles-frontend (core PMU sysfs event; AMD 0xd0/= 0x287/0xa9) +[event32:base-stat-group] +fd=3D32 +type=3D4 +config=3D208|647|169 +optional=3D1 + +# PERF_TYPE_RAW / stalled-cycles-backend (core PMU sysfs event; AMD 0xd1/0= x187) +[event33:base-stat-group] +fd=3D33 +type=3D4 +config=3D209|391 optional=3D1 \ No newline at end of file diff --git a/tools/perf/tests/shell/attr/test-stat-detailed-1 b/tools/perf/= tests/shell/attr/test-stat-detailed-1 index d9a6236054f2dfb1..d5a155b4de4c4e6b 100644 --- a/tools/perf/tests/shell/attr/test-stat-detailed-1 +++ b/tools/perf/tests/shell/attr/test-stat-detailed-1 @@ -6,73 +6,73 @@ requires =3D core-pmu =20 =20 # PERF_TYPE_SOFTWARE / PERF_COUNT_SW_TASK_CLOCK -[event1:base-stat] +[event1:base-stat-group] fd=3D1 type=3D1 config=3D1 =20 # PERF_TYPE_SOFTWARE / PERF_COUNT_SW_CONTEXT_SWITCHES -[event2:base-stat] +[event2:base-stat-group] fd=3D2 type=3D1 config=3D3 =20 # PERF_TYPE_SOFTWARE / PERF_COUNT_SW_CPU_MIGRATIONS -[event3:base-stat] +[event3:base-stat-group] fd=3D3 type=3D1 config=3D4 =20 # PERF_TYPE_SOFTWARE / PERF_COUNT_SW_PAGE_FAULTS -[event4:base-stat] +[event4:base-stat-group] fd=3D4 type=3D1 config=3D2 =20 # PERF_TYPE_HARDWARE / PERF_COUNT_HW_CPU_CYCLES -[event5:base-stat] +[event5:base-stat-group] fd=3D5 type=3D0 config=3D0 optional=3D1 =20 # PERF_TYPE_HARDWARE / PERF_COUNT_HW_STALLED_CYCLES_FRONTEND -[event6:base-stat] +[event6:base-stat-group] fd=3D6 type=3D0 config=3D7 optional=3D1 =20 # PERF_TYPE_HARDWARE / PERF_COUNT_HW_STALLED_CYCLES_BACKEND -[event7:base-stat] +[event7:base-stat-group] fd=3D7 type=3D0 config=3D8 optional=3D1 =20 # PERF_TYPE_HARDWARE / PERF_COUNT_HW_INSTRUCTIONS -[event8:base-stat] +[event8:base-stat-group] fd=3D8 type=3D0 config=3D1 optional=3D1 =20 # PERF_TYPE_HARDWARE / PERF_COUNT_HW_BRANCH_INSTRUCTIONS -[event9:base-stat] +[event9:base-stat-group] fd=3D9 type=3D0 config=3D4 optional=3D1 =20 # PERF_TYPE_HARDWARE / PERF_COUNT_HW_BRANCH_MISSES -[event10:base-stat] +[event10:base-stat-group] fd=3D10 type=3D0 config=3D5 optional=3D1 =20 # PERF_TYPE_RAW / slots (0x400) -[event11:base-stat] +[event11:base-stat-group] fd=3D11 group_fd=3D-1 type=3D4 @@ -81,7 +81,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-retiring (0x8000) -[event12:base-stat] +[event12:base-stat-group] fd=3D12 group_fd=3D11 type=3D4 @@ -92,7 +92,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-bad-spec (0x8100) -[event13:base-stat] +[event13:base-stat-group] fd=3D13 group_fd=3D11 type=3D4 @@ -103,7 +103,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-fe-bound (0x8200) -[event14:base-stat] +[event14:base-stat-group] fd=3D14 group_fd=3D11 type=3D4 @@ -114,7 +114,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-be-bound (0x8300) -[event15:base-stat] +[event15:base-stat-group] fd=3D15 group_fd=3D11 type=3D4 @@ -125,7 +125,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-heavy-ops (0x8400) -[event16:base-stat] +[event16:base-stat-group] fd=3D16 group_fd=3D11 type=3D4 @@ -136,7 +136,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-br-mispredict (0x8500) -[event17:base-stat] +[event17:base-stat-group] fd=3D17 group_fd=3D11 type=3D4 @@ -147,7 +147,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-fetch-lat (0x8600) -[event18:base-stat] +[event18:base-stat-group] fd=3D18 group_fd=3D11 type=3D4 @@ -158,7 +158,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-mem-bound (0x8700) -[event19:base-stat] +[event19:base-stat-group] fd=3D19 group_fd=3D11 type=3D4 @@ -169,63 +169,63 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / INT_MISC.UOP_DROPPING -[event20:base-stat] +[event20:base-stat-group] fd=3D20 type=3D4 config=3D4109 optional=3D1 =20 # PERF_TYPE_RAW / cpu/INT_MISC.RECOVERY_CYCLES,cmask=3D1,edge/ -[event21:base-stat] +[event21:base-stat-group] fd=3D21 type=3D4 config=3D17039629 optional=3D1 =20 -# PERF_TYPE_RAW / CPU_CLK_UNHALTED.THREAD -[event22:base-stat] +# PERF_TYPE_RAW / cpu-cycles (core PMU sysfs event; Intel 0x3c, AMD 0x76) +[event22:base-stat-group] fd=3D22 type=3D4 -config=3D60 +config=3D60|118 optional=3D1 =20 # PERF_TYPE_RAW / INT_MISC.RECOVERY_CYCLES_ANY -[event23:base-stat] +[event23:base-stat-group] fd=3D23 type=3D4 config=3D2097421 optional=3D1 =20 # PERF_TYPE_RAW / CPU_CLK_UNHALTED.REF_XCLK -[event24:base-stat] +[event24:base-stat-group] fd=3D24 type=3D4 config=3D316 optional=3D1 =20 # PERF_TYPE_RAW / IDQ_UOPS_NOT_DELIVERED.CORE -[event25:base-stat] +[event25:base-stat-group] fd=3D25 type=3D4 config=3D412 optional=3D1 =20 # PERF_TYPE_RAW / CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE -[event26:base-stat] +[event26:base-stat-group] fd=3D26 type=3D4 config=3D572 optional=3D1 =20 # PERF_TYPE_RAW / UOPS_RETIRED.RETIRE_SLOTS -[event27:base-stat] +[event27:base-stat-group] fd=3D27 type=3D4 config=3D706 optional=3D1 =20 # PERF_TYPE_RAW / UOPS_ISSUED.ANY -[event28:base-stat] +[event28:base-stat-group] fd=3D28 type=3D4 config=3D270 @@ -235,7 +235,7 @@ optional=3D1 # PERF_COUNT_HW_CACHE_L1D << 0 | # (PERF_COUNT_HW_CACHE_OP_READ << 8) | # (PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16) -[event29:base-stat] +[event29:base-stat-group] fd=3D29 type=3D3 config=3D0 @@ -245,7 +245,7 @@ optional=3D1 # PERF_COUNT_HW_CACHE_L1D << 0 | # (PERF_COUNT_HW_CACHE_OP_READ << 8) | # (PERF_COUNT_HW_CACHE_RESULT_MISS << 16) -[event30:base-stat] +[event30:base-stat-group] fd=3D30 type=3D3 config=3D65536 @@ -255,7 +255,7 @@ optional=3D1 # PERF_COUNT_HW_CACHE_LL << 0 | # (PERF_COUNT_HW_CACHE_OP_READ << 8) | # (PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16) -[event31:base-stat] +[event31:base-stat-group] fd=3D31 type=3D3 config=3D2 @@ -265,15 +265,43 @@ optional=3D1 # PERF_COUNT_HW_CACHE_LL << 0 | # (PERF_COUNT_HW_CACHE_OP_READ << 8) | # (PERF_COUNT_HW_CACHE_RESULT_MISS << 16) -[event32:base-stat] +[event32:base-stat-group] fd=3D32 type=3D3 config=3D65538 optional=3D1 =20 # PERF_TYPE_RAW / INT_MISC.UOP_DROPPING -[event33:base-stat] +[event33:base-stat-group] fd=3D33 type=3D4 config=3D4269 +optional=3D1 + +# PERF_TYPE_RAW / instructions (core PMU sysfs event) +[event34:base-stat-group] +fd=3D34 +type=3D4 +config=3D192 +optional=3D1 + +# PERF_TYPE_RAW / branch-misses (core PMU sysfs event; Intel 0xc5, AMD 0xc= 3) +[event35:base-stat-group] +fd=3D35 +type=3D4 +config=3D197|195 +optional=3D1 + +# PERF_TYPE_RAW / stalled-cycles-frontend (core PMU sysfs event; AMD 0xd0/= 0x287/0xa9) +[event36:base-stat-group] +fd=3D36 +type=3D4 +config=3D208|647|169 +optional=3D1 + +# PERF_TYPE_RAW / stalled-cycles-backend (core PMU sysfs event; AMD 0xd1/0= x187) +[event37:base-stat-group] +fd=3D37 +type=3D4 +config=3D209|391 optional=3D1 \ No newline at end of file diff --git a/tools/perf/tests/shell/attr/test-stat-detailed-2 b/tools/perf/= tests/shell/attr/test-stat-detailed-2 index 582a30289ccfa6df..740269dab5884a11 100644 --- a/tools/perf/tests/shell/attr/test-stat-detailed-2 +++ b/tools/perf/tests/shell/attr/test-stat-detailed-2 @@ -6,73 +6,73 @@ requires =3D core-pmu =20 =20 # PERF_TYPE_SOFTWARE / PERF_COUNT_SW_TASK_CLOCK -[event1:base-stat] +[event1:base-stat-group] fd=3D1 type=3D1 config=3D1 =20 # PERF_TYPE_SOFTWARE / PERF_COUNT_SW_CONTEXT_SWITCHES -[event2:base-stat] +[event2:base-stat-group] fd=3D2 type=3D1 config=3D3 =20 # PERF_TYPE_SOFTWARE / PERF_COUNT_SW_CPU_MIGRATIONS -[event3:base-stat] +[event3:base-stat-group] fd=3D3 type=3D1 config=3D4 =20 # PERF_TYPE_SOFTWARE / PERF_COUNT_SW_PAGE_FAULTS -[event4:base-stat] +[event4:base-stat-group] fd=3D4 type=3D1 config=3D2 =20 # PERF_TYPE_HARDWARE / PERF_COUNT_HW_CPU_CYCLES -[event5:base-stat] +[event5:base-stat-group] fd=3D5 type=3D0 config=3D0 optional=3D1 =20 # PERF_TYPE_HARDWARE / PERF_COUNT_HW_STALLED_CYCLES_FRONTEND -[event6:base-stat] +[event6:base-stat-group] fd=3D6 type=3D0 config=3D7 optional=3D1 =20 # PERF_TYPE_HARDWARE / PERF_COUNT_HW_STALLED_CYCLES_BACKEND -[event7:base-stat] +[event7:base-stat-group] fd=3D7 type=3D0 config=3D8 optional=3D1 =20 # PERF_TYPE_HARDWARE / PERF_COUNT_HW_INSTRUCTIONS -[event8:base-stat] +[event8:base-stat-group] fd=3D8 type=3D0 config=3D1 optional=3D1 =20 # PERF_TYPE_HARDWARE / PERF_COUNT_HW_BRANCH_INSTRUCTIONS -[event9:base-stat] +[event9:base-stat-group] fd=3D9 type=3D0 config=3D4 optional=3D1 =20 # PERF_TYPE_HARDWARE / PERF_COUNT_HW_BRANCH_MISSES -[event10:base-stat] +[event10:base-stat-group] fd=3D10 type=3D0 config=3D5 optional=3D1 =20 # PERF_TYPE_RAW / slots (0x400) -[event11:base-stat] +[event11:base-stat-group] fd=3D11 group_fd=3D-1 type=3D4 @@ -81,7 +81,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-retiring (0x8000) -[event12:base-stat] +[event12:base-stat-group] fd=3D12 group_fd=3D11 type=3D4 @@ -92,7 +92,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-bad-spec (0x8100) -[event13:base-stat] +[event13:base-stat-group] fd=3D13 group_fd=3D11 type=3D4 @@ -103,7 +103,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-fe-bound (0x8200) -[event14:base-stat] +[event14:base-stat-group] fd=3D14 group_fd=3D11 type=3D4 @@ -114,7 +114,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-be-bound (0x8300) -[event15:base-stat] +[event15:base-stat-group] fd=3D15 group_fd=3D11 type=3D4 @@ -125,7 +125,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-heavy-ops (0x8400) -[event16:base-stat] +[event16:base-stat-group] fd=3D16 group_fd=3D11 type=3D4 @@ -136,7 +136,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-br-mispredict (0x8500) -[event17:base-stat] +[event17:base-stat-group] fd=3D17 group_fd=3D11 type=3D4 @@ -147,7 +147,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-fetch-lat (0x8600) -[event18:base-stat] +[event18:base-stat-group] fd=3D18 group_fd=3D11 type=3D4 @@ -158,7 +158,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-mem-bound (0x8700) -[event19:base-stat] +[event19:base-stat-group] fd=3D19 group_fd=3D11 type=3D4 @@ -169,63 +169,63 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / INT_MISC.UOP_DROPPING -[event20:base-stat] +[event20:base-stat-group] fd=3D20 type=3D4 config=3D4109 optional=3D1 =20 # PERF_TYPE_RAW / cpu/INT_MISC.RECOVERY_CYCLES,cmask=3D1,edge/ -[event21:base-stat] +[event21:base-stat-group] fd=3D21 type=3D4 config=3D17039629 optional=3D1 =20 -# PERF_TYPE_RAW / CPU_CLK_UNHALTED.THREAD -[event22:base-stat] +# PERF_TYPE_RAW / cpu-cycles (core PMU sysfs event; Intel 0x3c, AMD 0x76) +[event22:base-stat-group] fd=3D22 type=3D4 -config=3D60 +config=3D60|118 optional=3D1 =20 # PERF_TYPE_RAW / INT_MISC.RECOVERY_CYCLES_ANY -[event23:base-stat] +[event23:base-stat-group] fd=3D23 type=3D4 config=3D2097421 optional=3D1 =20 # PERF_TYPE_RAW / CPU_CLK_UNHALTED.REF_XCLK -[event24:base-stat] +[event24:base-stat-group] fd=3D24 type=3D4 config=3D316 optional=3D1 =20 # PERF_TYPE_RAW / IDQ_UOPS_NOT_DELIVERED.CORE -[event25:base-stat] +[event25:base-stat-group] fd=3D25 type=3D4 config=3D412 optional=3D1 =20 # PERF_TYPE_RAW / CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE -[event26:base-stat] +[event26:base-stat-group] fd=3D26 type=3D4 config=3D572 optional=3D1 =20 # PERF_TYPE_RAW / UOPS_RETIRED.RETIRE_SLOTS -[event27:base-stat] +[event27:base-stat-group] fd=3D27 type=3D4 config=3D706 optional=3D1 =20 # PERF_TYPE_RAW / UOPS_ISSUED.ANY -[event28:base-stat] +[event28:base-stat-group] fd=3D28 type=3D4 config=3D270 @@ -235,7 +235,7 @@ optional=3D1 # PERF_COUNT_HW_CACHE_L1D << 0 | # (PERF_COUNT_HW_CACHE_OP_READ << 8) | # (PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16) -[event29:base-stat] +[event29:base-stat-group] fd=3D29 type=3D3 config=3D0 @@ -245,7 +245,7 @@ optional=3D1 # PERF_COUNT_HW_CACHE_L1D << 0 | # (PERF_COUNT_HW_CACHE_OP_READ << 8) | # (PERF_COUNT_HW_CACHE_RESULT_MISS << 16) -[event30:base-stat] +[event30:base-stat-group] fd=3D30 type=3D3 config=3D65536 @@ -255,7 +255,7 @@ optional=3D1 # PERF_COUNT_HW_CACHE_LL << 0 | # (PERF_COUNT_HW_CACHE_OP_READ << 8) | # (PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16) -[event31:base-stat] +[event31:base-stat-group] fd=3D31 type=3D3 config=3D2 @@ -265,7 +265,7 @@ optional=3D1 # PERF_COUNT_HW_CACHE_LL << 0 | # (PERF_COUNT_HW_CACHE_OP_READ << 8) | # (PERF_COUNT_HW_CACHE_RESULT_MISS << 16) -[event32:base-stat] +[event32:base-stat-group] fd=3D32 type=3D3 config=3D65538 @@ -275,7 +275,7 @@ optional=3D1 # PERF_COUNT_HW_CACHE_L1I << 0 | # (PERF_COUNT_HW_CACHE_OP_READ << 8) | # (PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16) -[event33:base-stat] +[event33:base-stat-group] fd=3D33 type=3D3 config=3D1 @@ -285,7 +285,7 @@ optional=3D1 # PERF_COUNT_HW_CACHE_L1I << 0 | # (PERF_COUNT_HW_CACHE_OP_READ << 8) | # (PERF_COUNT_HW_CACHE_RESULT_MISS << 16) -[event34:base-stat] +[event34:base-stat-group] fd=3D34 type=3D3 config=3D65537 @@ -295,7 +295,7 @@ optional=3D1 # PERF_COUNT_HW_CACHE_DTLB << 0 | # (PERF_COUNT_HW_CACHE_OP_READ << 8) | # (PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16) -[event35:base-stat] +[event35:base-stat-group] fd=3D35 type=3D3 config=3D3 @@ -305,7 +305,7 @@ optional=3D1 # PERF_COUNT_HW_CACHE_DTLB << 0 | # (PERF_COUNT_HW_CACHE_OP_READ << 8) | # (PERF_COUNT_HW_CACHE_RESULT_MISS << 16) -[event36:base-stat] +[event36:base-stat-group] fd=3D36 type=3D3 config=3D65539 @@ -315,7 +315,7 @@ optional=3D1 # PERF_COUNT_HW_CACHE_ITLB << 0 | # (PERF_COUNT_HW_CACHE_OP_READ << 8) | # (PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16) -[event37:base-stat] +[event37:base-stat-group] fd=3D37 type=3D3 config=3D4 @@ -325,15 +325,43 @@ optional=3D1 # PERF_COUNT_HW_CACHE_ITLB << 0 | # (PERF_COUNT_HW_CACHE_OP_READ << 8) | # (PERF_COUNT_HW_CACHE_RESULT_MISS << 16) -[event38:base-stat] +[event38:base-stat-group] fd=3D38 type=3D3 config=3D65540 optional=3D1 =20 # PERF_TYPE_RAW / INT_MISC.UOP_DROPPING -[event39:base-stat] +[event39:base-stat-group] fd=3D39 type=3D4 config=3D4269 +optional=3D1 + +# PERF_TYPE_RAW / instructions (core PMU sysfs event) +[event40:base-stat-group] +fd=3D40 +type=3D4 +config=3D192 +optional=3D1 + +# PERF_TYPE_RAW / branch-misses (core PMU sysfs event; Intel 0xc5, AMD 0xc= 3) +[event41:base-stat-group] +fd=3D41 +type=3D4 +config=3D197|195 +optional=3D1 + +# PERF_TYPE_RAW / stalled-cycles-frontend (core PMU sysfs event; AMD 0xd0/= 0x287/0xa9) +[event42:base-stat-group] +fd=3D42 +type=3D4 +config=3D208|647|169 +optional=3D1 + +# PERF_TYPE_RAW / stalled-cycles-backend (core PMU sysfs event; AMD 0xd1/0= x187) +[event43:base-stat-group] +fd=3D43 +type=3D4 +config=3D209|391 optional=3D1 \ No newline at end of file diff --git a/tools/perf/tests/shell/attr/test-stat-detailed-3 b/tools/perf/= tests/shell/attr/test-stat-detailed-3 index 2d0fca8b5020f504..fb061b97e93f5b21 100644 --- a/tools/perf/tests/shell/attr/test-stat-detailed-3 +++ b/tools/perf/tests/shell/attr/test-stat-detailed-3 @@ -6,73 +6,73 @@ requires =3D core-pmu =20 =20 # PERF_TYPE_SOFTWARE / PERF_COUNT_SW_TASK_CLOCK -[event1:base-stat] +[event1:base-stat-group] fd=3D1 type=3D1 config=3D1 =20 # PERF_TYPE_SOFTWARE / PERF_COUNT_SW_CONTEXT_SWITCHES -[event2:base-stat] +[event2:base-stat-group] fd=3D2 type=3D1 config=3D3 =20 # PERF_TYPE_SOFTWARE / PERF_COUNT_SW_CPU_MIGRATIONS -[event3:base-stat] +[event3:base-stat-group] fd=3D3 type=3D1 config=3D4 =20 # PERF_TYPE_SOFTWARE / PERF_COUNT_SW_PAGE_FAULTS -[event4:base-stat] +[event4:base-stat-group] fd=3D4 type=3D1 config=3D2 =20 # PERF_TYPE_HARDWARE / PERF_COUNT_HW_CPU_CYCLES -[event5:base-stat] +[event5:base-stat-group] fd=3D5 type=3D0 config=3D0 optional=3D1 =20 # PERF_TYPE_HARDWARE / PERF_COUNT_HW_STALLED_CYCLES_FRONTEND -[event6:base-stat] +[event6:base-stat-group] fd=3D6 type=3D0 config=3D7 optional=3D1 =20 # PERF_TYPE_HARDWARE / PERF_COUNT_HW_STALLED_CYCLES_BACKEND -[event7:base-stat] +[event7:base-stat-group] fd=3D7 type=3D0 config=3D8 optional=3D1 =20 # PERF_TYPE_HARDWARE / PERF_COUNT_HW_INSTRUCTIONS -[event8:base-stat] +[event8:base-stat-group] fd=3D8 type=3D0 config=3D1 optional=3D1 =20 # PERF_TYPE_HARDWARE / PERF_COUNT_HW_BRANCH_INSTRUCTIONS -[event9:base-stat] +[event9:base-stat-group] fd=3D9 type=3D0 config=3D4 optional=3D1 =20 # PERF_TYPE_HARDWARE / PERF_COUNT_HW_BRANCH_MISSES -[event10:base-stat] +[event10:base-stat-group] fd=3D10 type=3D0 config=3D5 optional=3D1 =20 # PERF_TYPE_RAW / slots (0x400) -[event11:base-stat] +[event11:base-stat-group] fd=3D11 group_fd=3D-1 type=3D4 @@ -81,7 +81,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-retiring (0x8000) -[event12:base-stat] +[event12:base-stat-group] fd=3D12 group_fd=3D11 type=3D4 @@ -92,7 +92,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-bad-spec (0x8100) -[event13:base-stat] +[event13:base-stat-group] fd=3D13 group_fd=3D11 type=3D4 @@ -103,7 +103,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-fe-bound (0x8200) -[event14:base-stat] +[event14:base-stat-group] fd=3D14 group_fd=3D11 type=3D4 @@ -114,7 +114,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-be-bound (0x8300) -[event15:base-stat] +[event15:base-stat-group] fd=3D15 group_fd=3D11 type=3D4 @@ -125,7 +125,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-heavy-ops (0x8400) -[event16:base-stat] +[event16:base-stat-group] fd=3D16 group_fd=3D11 type=3D4 @@ -136,7 +136,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-br-mispredict (0x8500) -[event17:base-stat] +[event17:base-stat-group] fd=3D17 group_fd=3D11 type=3D4 @@ -147,7 +147,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-fetch-lat (0x8600) -[event18:base-stat] +[event18:base-stat-group] fd=3D18 group_fd=3D11 type=3D4 @@ -158,7 +158,7 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / topdown-mem-bound (0x8700) -[event19:base-stat] +[event19:base-stat-group] fd=3D19 group_fd=3D11 type=3D4 @@ -169,63 +169,63 @@ read_format=3D15 optional=3D1 =20 # PERF_TYPE_RAW / INT_MISC.UOP_DROPPING -[event20:base-stat] +[event20:base-stat-group] fd=3D20 type=3D4 config=3D4109 optional=3D1 =20 # PERF_TYPE_RAW / cpu/INT_MISC.RECOVERY_CYCLES,cmask=3D1,edge/ -[event21:base-stat] +[event21:base-stat-group] fd=3D21 type=3D4 config=3D17039629 optional=3D1 =20 -# PERF_TYPE_RAW / CPU_CLK_UNHALTED.THREAD -[event22:base-stat] +# PERF_TYPE_RAW / cpu-cycles (core PMU sysfs event; Intel 0x3c, AMD 0x76) +[event22:base-stat-group] fd=3D22 type=3D4 -config=3D60 +config=3D60|118 optional=3D1 =20 # PERF_TYPE_RAW / INT_MISC.RECOVERY_CYCLES_ANY -[event23:base-stat] +[event23:base-stat-group] fd=3D23 type=3D4 config=3D2097421 optional=3D1 =20 # PERF_TYPE_RAW / CPU_CLK_UNHALTED.REF_XCLK -[event24:base-stat] +[event24:base-stat-group] fd=3D24 type=3D4 config=3D316 optional=3D1 =20 # PERF_TYPE_RAW / IDQ_UOPS_NOT_DELIVERED.CORE -[event25:base-stat] +[event25:base-stat-group] fd=3D25 type=3D4 config=3D412 optional=3D1 =20 # PERF_TYPE_RAW / CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE -[event26:base-stat] +[event26:base-stat-group] fd=3D26 type=3D4 config=3D572 optional=3D1 =20 # PERF_TYPE_RAW / UOPS_RETIRED.RETIRE_SLOTS -[event27:base-stat] +[event27:base-stat-group] fd=3D27 type=3D4 config=3D706 optional=3D1 =20 # PERF_TYPE_RAW / UOPS_ISSUED.ANY -[event28:base-stat] +[event28:base-stat-group] fd=3D28 type=3D4 config=3D270 @@ -235,7 +235,7 @@ optional=3D1 # PERF_COUNT_HW_CACHE_L1D << 0 | # (PERF_COUNT_HW_CACHE_OP_READ << 8) | # (PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16) -[event29:base-stat] +[event29:base-stat-group] fd=3D29 type=3D3 config=3D0 @@ -245,7 +245,7 @@ optional=3D1 # PERF_COUNT_HW_CACHE_L1D << 0 | # (PERF_COUNT_HW_CACHE_OP_READ << 8) | # (PERF_COUNT_HW_CACHE_RESULT_MISS << 16) -[event30:base-stat] +[event30:base-stat-group] fd=3D30 type=3D3 config=3D65536 @@ -255,7 +255,7 @@ optional=3D1 # PERF_COUNT_HW_CACHE_LL << 0 | # (PERF_COUNT_HW_CACHE_OP_READ << 8) | # (PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16) -[event31:base-stat] +[event31:base-stat-group] fd=3D31 type=3D3 config=3D2 @@ -265,7 +265,7 @@ optional=3D1 # PERF_COUNT_HW_CACHE_LL << 0 | # (PERF_COUNT_HW_CACHE_OP_READ << 8) | # (PERF_COUNT_HW_CACHE_RESULT_MISS << 16) -[event32:base-stat] +[event32:base-stat-group] fd=3D32 type=3D3 config=3D65538 @@ -275,7 +275,7 @@ optional=3D1 # PERF_COUNT_HW_CACHE_L1I << 0 | # (PERF_COUNT_HW_CACHE_OP_READ << 8) | # (PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16) -[event33:base-stat] +[event33:base-stat-group] fd=3D33 type=3D3 config=3D1 @@ -285,7 +285,7 @@ optional=3D1 # PERF_COUNT_HW_CACHE_L1I << 0 | # (PERF_COUNT_HW_CACHE_OP_READ << 8) | # (PERF_COUNT_HW_CACHE_RESULT_MISS << 16) -[event34:base-stat] +[event34:base-stat-group] fd=3D34 type=3D3 config=3D65537 @@ -295,7 +295,7 @@ optional=3D1 # PERF_COUNT_HW_CACHE_DTLB << 0 | # (PERF_COUNT_HW_CACHE_OP_READ << 8) | # (PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16) -[event35:base-stat] +[event35:base-stat-group] fd=3D35 type=3D3 config=3D3 @@ -305,7 +305,7 @@ optional=3D1 # PERF_COUNT_HW_CACHE_DTLB << 0 | # (PERF_COUNT_HW_CACHE_OP_READ << 8) | # (PERF_COUNT_HW_CACHE_RESULT_MISS << 16) -[event36:base-stat] +[event36:base-stat-group] fd=3D36 type=3D3 config=3D65539 @@ -315,7 +315,7 @@ optional=3D1 # PERF_COUNT_HW_CACHE_ITLB << 0 | # (PERF_COUNT_HW_CACHE_OP_READ << 8) | # (PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16) -[event37:base-stat] +[event37:base-stat-group] fd=3D37 type=3D3 config=3D4 @@ -325,7 +325,7 @@ optional=3D1 # PERF_COUNT_HW_CACHE_ITLB << 0 | # (PERF_COUNT_HW_CACHE_OP_READ << 8) | # (PERF_COUNT_HW_CACHE_RESULT_MISS << 16) -[event38:base-stat] +[event38:base-stat-group] fd=3D38 type=3D3 config=3D65540 @@ -335,7 +335,7 @@ optional=3D1 # PERF_COUNT_HW_CACHE_L1D << 0 | # (PERF_COUNT_HW_CACHE_OP_PREFETCH << 8) | # (PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16) -[event39:base-stat] +[event39:base-stat-group] fd=3D39 type=3D3 config=3D512 @@ -345,15 +345,43 @@ optional=3D1 # PERF_COUNT_HW_CACHE_L1D << 0 | # (PERF_COUNT_HW_CACHE_OP_PREFETCH << 8) | # (PERF_COUNT_HW_CACHE_RESULT_MISS << 16) -[event40:base-stat] +[event40:base-stat-group] fd=3D40 type=3D3 config=3D66048 optional=3D1 =20 # PERF_TYPE_RAW / INT_MISC.UOP_DROPPING -[event41:base-stat] +[event41:base-stat-group] fd=3D41 type=3D4 config=3D4269 +optional=3D1 + +# PERF_TYPE_RAW / instructions (core PMU sysfs event) +[event42:base-stat-group] +fd=3D42 +type=3D4 +config=3D192 +optional=3D1 + +# PERF_TYPE_RAW / branch-misses (core PMU sysfs event; Intel 0xc5, AMD 0xc= 3) +[event43:base-stat-group] +fd=3D43 +type=3D4 +config=3D197|195 +optional=3D1 + +# PERF_TYPE_RAW / stalled-cycles-frontend (core PMU sysfs event; AMD 0xd0/= 0x287/0xa9) +[event44:base-stat-group] +fd=3D44 +type=3D4 +config=3D208|647|169 +optional=3D1 + +# PERF_TYPE_RAW / stalled-cycles-backend (core PMU sysfs event; AMD 0xd1/0= x187) +[event45:base-stat-group] +fd=3D45 +type=3D4 +config=3D209|391 optional=3D1 \ No newline at end of file --=20 2.55.0 From nobody Sat Oct 24 13:19:52 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 010D954A7C5; Tue, 13 Oct 2026 20:14:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922483; cv=none; b=kIn61/tlekJfE9LSJj/DFKyZoEM1TsW3MBk9ZaLgIBQfzevpaCrALO6ihRPk3GH8j2U6CG3EaWO+TrbQJRv7uYNvKHVZaNG+ElftPkxfFlnoYyM64VaGZJU2SrRw2pLD7l+FeuOI4fpPrPm360AKI2FIS3Lk2Xz/rShT/oNswPo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922483; c=relaxed/simple; bh=shb+X9RZhGe2vFdaniacTlJ0uA+vvD5eiiv7TT/79to=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=j4ZGXCIMroBCmCJhVV5O4ryjsBoZcwA44hcFhPExojNc3Tw8hy2ogDtGa/MnQwLw2qBvgkbGj7jk+w/w1EJqsnMx2ewacU299B3UbDT8hh5ZtIQ63UnZp0wYtP36ZtOPHgVQbT8DaurKkxipcyWLQCyb86UOOD4Sq+mHSmBeSSk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=YlDJ3/wZ; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="YlDJ3/wZ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0492E1F000FF; Tue, 13 Oct 2026 20:14:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1791922481; bh=J75Rf2aefD1rmdHAa8hpd0EVTtpLGr2UwPu74f/0Na8=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=YlDJ3/wZIa3SE8jIq5xPy6g9pi2e9+WO5+WJ4MArw3zaNO63gBZl2XoXfoACSLO+Y KWZgsrHeWQrGjWIV7ObHZ3fwwAfrcV20GI6jUErSI2+OV3x0xO/hD/yYNcAjok2A8X vmb2uqrcsv+XpOKUNF2DWzAgTzu9GGnibHU5fmW7qifwPjMuoIGRea85oxXYP28bHX 2eS0iH0dCWyx94gDs7b/8asyLadUZcitOiFO2Wyn2diZym3wU3607lZnzgJQ/m/gJJ mwNzcvTmYrIsFVme2esG6d6DA5/czKXlf1EMEIAhnPn2N/cmGmJWcMb0R6Hwy5NUaL uKbz7sXPNfSYA== From: Arnaldo Carvalho de Melo To: Namhyung Kim Cc: Ingo Molnar , Thomas Gleixner , James Clark , Jiri Olsa , Ian Rogers , Adrian Hunter , Clark Williams , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v2 05/19] perf test attr: Relax group checking for ungrouped expectations Date: Tue, 13 Oct 2026 17:14:00 -0300 Message-ID: <20261013201415.36428-6-acme@kernel.org> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20261013201415.36428-1-acme@kernel.org> References: <20261013201415.36428-1-acme@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arnaldo Carvalho de Melo When matching the recorded events back against the expectations, attr.py requires every event opened in a group to match an expectation that declares the same group. The perf stat default metrics open the events of each metric in groups, but the test expectations only verify the event attributes, so test-stat-default fails with: FAILED '.../test-stat-default' - group failure Only enforce the group of a recorded event when the expectation it matches declares one. Expectations that ask for a group are still verified in both directions. Fixes: c7adeb0974f18da4 ("perf jevents: Add set of common metrics based on = default ones") Fixes: 2dfc0cab3da4a205 ("perf stat: Add detail -d,-dd,-ddd metrics") Assisted-by: LLM Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/tests/shell/lib/attr.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/tools/perf/tests/shell/lib/attr.py b/tools/perf/tests/shell/li= b/attr.py index b55c9b881e59852f..f254d03c1b253c7a 100644 --- a/tools/perf/tests/shell/lib/attr.py +++ b/tools/perf/tests/shell/lib/attr.py @@ -353,7 +353,7 @@ class Test(object): else: raise Unsup(self) =20 - def compare(self, expect, result): + def compare(self, expect, result, strict_groups=3DTrue): match =3D {} =20 log.debug(" compare") @@ -387,8 +387,9 @@ class Test(object): =20 match[exp_name] =3D exp_list =20 - # For each defined group in the expected events - # check we match the same group in the result. + # Check that each expected group is matched in the result; an event + # opened in a group may match an expectation that doesn't declare + # one, as those only verify the event attributes. for exp_name, exp_event in expect.items(): group =3D exp_event.group =20 @@ -397,6 +398,8 @@ class Test(object): =20 for res_name in match[exp_name]: res_group =3D result[res_name].group + if res_group =3D=3D '' and not strict_groups: + continue if res_group not in match[group]: raise Fail(self, 'group failure') =20 @@ -435,7 +438,7 @@ class Test(object): =20 # do the expectation - results matching - both ways self.compare(self.expect, self.result) - self.compare(self.result, self.expect) + self.compare(self.result, self.expect, strict_groups=3DFalse) =20 finally: # cleanup --=20 2.55.0 From nobody Sat Oct 24 13:19:52 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BEAF954A7D6; Tue, 13 Oct 2026 20:14:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922487; cv=none; b=iOmutPTAthxAg8G6lQkWJTgcbjs4nYekYIRB9MOdsn9o9nE5WzhLIj5tegq7newUn+LypPETKiOMK5ZqV7vdzUL3css39NZTHaH0Dw/NkeljKmu52XbLEjzmRWONW5HnSpm29AxXV0cACND8i4ORSj9m2ZSI+5s6p3zJK6G/L40= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922487; c=relaxed/simple; bh=D6gBH4rzn9ofW182vOzOgRcRuc+ozHzrNi9DP0nNdXg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WyKwstu9KAULzheuksEEs+BOX8d2ocFun51wkHVdATHrHORMQMtdiSXXJWDwO/oU4G9hEqFzmlFl+osKKENCapwCRoYSCY3zf/Of0TJkm+K6+9QB9uKycRDh5/qYOTw53TF8SdTNqz3Di46iwnYnhycDxa589cje5ELUzUQA2qs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jmquucq8; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="jmquucq8" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CDB1E1F00893; Tue, 13 Oct 2026 20:14:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1791922484; bh=wS0fg57Vpynd21ZO3GmtvsnsHKdxN1CGGQHPTIoEj6E=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=jmquucq87XXKwok0upeEZB55Ucbf4DrOd6/ZPzVIr5tggcjOxOEMiGYZ6YVLw4nSb R+jvifyc9VYy5yN3gpQWOXifiw3wxGGjo02kAcTDxxXz3dFFksarvrFQGL2HHigumk t5aPBs0XIqpkrB5+PgJK3NO16ij8Xef5HvD8EaYUYulrFsXT2c2TpJ9IkAlIpZwBmF bcnkHjl876e9FXASlWpLuFjqpJdxLkll4F+2hYW1wdtANuCl7M8sRq4DkYnqk8sOmo LuQ02pf6pM2R4KBlOjQMHbaTzuzC5OvTboHp5yTr1c1idF1TVdTNsdDSBUN7by8Gle Mh9Y346rfRmwg== From: Arnaldo Carvalho de Melo To: Namhyung Kim Cc: Ingo Molnar , Thomas Gleixner , James Clark , Jiri Olsa , Ian Rogers , Adrian Hunter , Clark Williams , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v2 06/19] perf evsel: Mark the event as supported when retrying an open Date: Tue, 13 Oct 2026 17:14:01 -0300 Message-ID: <20261013201415.36428-7-acme@kernel.org> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20261013201415.36428-1-acme@kernel.org> References: <20261013201415.36428-1-acme@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arnaldo Carvalho de Melo Opening a group with perf record on a machine with perf_event_paranoid > 1 and no CAP_PERFMON fails the first perf_event_open() with EACCES, after which evsel__open_cpu() clears evsel->supported; evsel__fallback() then adds exclude_kernel and record__open() retries, and the retry succeeds with supported left false. get_group_fd() treats unsupported events as ungroupable, so the retry opens the group members without their leader: sys_perf_event_open: pid 12345 cpu 0 group_fd -1 FAILED '.../test-record-group-sampling1' - group failure which fails the group subtests of "perf test 82", the Perf attribute expectations test, when it is run as a regular user, while it passes as root or with CAP_PERFMON, where the first open doesn't fail. commit 2cc7aa995ce9 ("perf stat: Refactor retry/skip/fatal error handling") dropped the pos->supported =3D true that record__open() did after a successful open and moved the resets into the stat code only, while saying "When an event is tried the supported is set to true again". Do that in evsel__open_cpu(), which every open entry point funnels through, so that a retry describes its own try instead of the previous failure. Fixes: 2cc7aa995ce9ecd8 ("perf stat: Refactor retry/skip/fatal error handli= ng") Cc: Ian Rogers Assisted-by: LLM Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/evsel.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 9c5e7510f0c019c3..e61f309e93dccc7f 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -3014,6 +3014,12 @@ static int evsel__open_cpu(struct evsel *evsel, stru= ct perf_cpu_map *cpus, enum rlimit_action set_rlimit =3D NO_CHANGE; struct perf_cpu cpu; =20 + /* + * A failed attempt being retried after evsel__fallback() would + * otherwise keep group members out of their group in get_group_fd(). + */ + evsel->supported =3D true; + if (evsel__is_retire_lat(evsel)) { err =3D evsel__tpebs_open(evsel); goto out; --=20 2.55.0 From nobody Sat Oct 24 13:19:52 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2298D54A7E9; Tue, 13 Oct 2026 20:14:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922488; cv=none; b=Kp0aumM5ZfI2PMpYTJ3gGcn6NV2R04+Z1nftrjw1M3CgpYxKg1dq30NsP5JE7JmY8hG5ndwzxa6RSAje+EhDP5yuJE1e3aiEnH54nDkycVCea/p6hDyU/zxk3RpHJ/2vJXPeMxz/y5froZBQ4sIat5v0Q9bJdvinSAqEpInAfgM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922488; c=relaxed/simple; bh=7hX59lycDoHaU8rMUEabBdTev7tKv7p+O9+n+Gi4ORM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ke5XKSvGCcKm4+W6ss54Pl1lCmp56/EcdUFm4UycwIHQB22gox8FdOYFgoxHVNEsFbin6GKd/d+80NjCEGMoSWt2aJhLAgGcD/bObXFKDB5vJPYtv/K0xW8LbvXOB2Apg6n6SkwlXIZPf84H/BV4cwZ/xGjlyVnkgkErMQtEUCk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=iRCBO5s5; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="iRCBO5s5" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A20F81F000FF; Tue, 13 Oct 2026 20:14:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1791922487; bh=tR02+h7iIf/WT5qGhbjUK1w7WM+Nn5hfDvwsG1Y91Jw=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=iRCBO5s5DHpic8PQW7cK5ZEGVpju2rprB7jIlpfoKlFfrSVinkrxKPZnPfrtCcjNb sAP+un9M48K9IpCcCWZuq8MmwKL4DtLWqlHk+N0KN+evlBDjreTVLSBLQM2j0f4vKk PMEgXo4YdWuOBWA/wW7UQQSocFeMsFNL7S5lJZz0J+k4faWZq8knhNCQOG8psRmjL0 w1J0XCMFqGZ2xNdO8PJDOhfVAk2hPsZvQbtoMT7R2makXZ3l09sjWQSvTUU8+5kEOx GYO2Xqe8vxhDzhkIOhBwcpVTnR8GfbZHLxKVi8PLcWsZ6L5EObw1Is93Qfb5OY3pQh 9lOr7PaUN6LqQ== From: Arnaldo Carvalho de Melo To: Namhyung Kim Cc: Ingo Molnar , Thomas Gleixner , James Clark , Jiri Olsa , Ian Rogers , Adrian Hunter , Clark Williams , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v2 07/19] perf test attr: Ignore the core PMU type perf puts in 'config' Date: Tue, 13 Oct 2026 17:14:02 -0300 Message-ID: <20261013201415.36428-8-acme@kernel.org> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20261013201415.36428-1-acme@kernel.org> References: <20261013201415.36428-1-acme@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arnaldo Carvalho de Melo Since commit 55bcf6ef314a ("perf: Extend PERF_TYPE_HARDWARE and PERF_TYPE_HW_CACH= E") in v5.13, and arm_pmu opted in with commit 5c816728651a ("arm_pmu: Add PERF_PMU_CAP_EXTENDED_HW_TYPE capability= ") in v6.6, the kernel can be told which core PMU a legacy type event is meant for, with its type in the top 32 bits of 'config', see perf_pmus__supports_extended_type(), which __parse_events_add_numeric() does for HARDWARE and HW_CACHE events, but only when there is more than one core PMU, i.e. on heterogeneous machines, where asking for one event ends up being one event per core PMU: $ perf stat -e cycles -a -- sleep 1 20,520,998 armv8_cortex_a53/cycles/ 13,029,350 armv8_cortex_a73/cycles/ and what lands in PERF_TEST_ATTR is the extended encoding: type=3D0 config=3D38654705664 # core PMU type 9, PERF_COUNT_HW_CPU_CYCLES so the expectations written for the single core PMU case fail with: expected config=3D0|1, got 38654705664 expected config=3D0, got 38654705664 # 'perf stat -d' L1-dcache events which is what now happens on an Amlogic A311D (2 Cortex-A53 + 4 Cortex-A73), a machine that just got the CPU PMU nodes it was missing. Take those bits out when comparing the 'config' of legacy type events, keeping what these expectations mean on machines with a single core PMU: which of the PMUs is counting is not what we're asking here. Assisted-by: LLM Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/tests/shell/lib/attr.py | 53 ++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/tools/perf/tests/shell/lib/attr.py b/tools/perf/tests/shell/li= b/attr.py index f254d03c1b253c7a..70ff73585cb3ffa9 100644 --- a/tools/perf/tests/shell/lib/attr.py +++ b/tools/perf/tests/shell/lib/attr.py @@ -57,6 +57,32 @@ def core_pmu_available(): =20 return True =20 +PERF_TYPE_HARDWARE =3D 0 +PERF_TYPE_HW_CACHE =3D 3 + +# The legacy event types, where perf may qualify 'config' with the core PMU +# type in its top 32 bits when there is more than one core PMU. +LEGACY_TYPES =3D (str(PERF_TYPE_HARDWARE), str(PERF_TYPE_HW_CACHE)) + +def hide_core_pmu_type(value): + """ + The kernel can be told which core PMU a legacy type event is meant for= by + putting its type in the top 32 bits of 'config', which perf only does = when + there is more than one core PMU, so take those bits out to keep the + expectations written for the single core PMU case matching on + heterogeneous machines. + """ + hidden =3D [] + + for alternative in value.split('|'): + try: + alternative =3D str(int(alternative, 0) & 0xffffffff) + except ValueError: + pass + hidden.append(alternative) + + return '|'.join(hidden) + class Fail(Exception): def __init__(self, test, msg): self.msg =3D msg @@ -130,12 +156,33 @@ class Event(dict): self.add(base) self.add(data) =20 + def hide_core_pmu_type_terms(self, other): + """ + Is this a legacy type event? Then the core PMU type that perf may = have + put in the top 32 bits of 'config' to tell the kernel which core P= MU it + wants isn't part of what we asked for, see hide_core_pmu_type(). + """ + for event in (self, other): + for type in event.get('type', '').split('|'): + if type in LEGACY_TYPES: + return True + + return False + + def hide_core_pmu_type(self, term, value, other): + if term =3D=3D 'config' and self.hide_core_pmu_type_terms(other): + return hide_core_pmu_type(value) + + return value + def equal(self, other): for t in Event.terms: log.debug(" [%s] %s %s", t, self[t], other[t]) if t not in self or t not in other: return False - if not data_equal(self[t], other[t]): + exp =3D self.hide_core_pmu_type(t, self[t], other) + got =3D self.hide_core_pmu_type(t, other[t], other) + if not data_equal(exp, got): return False return True =20 @@ -148,7 +195,9 @@ class Event(dict): for t in Event.terms: if t not in self or t not in other: continue - if not data_equal(self[t], other[t]): + exp =3D self.hide_core_pmu_type(t, self[t], other) + got =3D self.hide_core_pmu_type(t, other[t], other) + if not data_equal(exp, got): log.warning("expected %s=3D%s, got %s", t, self[t], other[= t]) =20 def parse_version(version): --=20 2.55.0 From nobody Sat Oct 24 13:19:52 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 695BA54B1C4; Tue, 13 Oct 2026 20:14:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922492; cv=none; b=s2X9i7EJtCq2QQp91WY5lHUNv9Mdnr9n3hMitIIJEklFJ3KDUQz+uoMzZOuHUWA7YvdBBIuUTYgmqXJxiXB0uNU5UoAgTRmqZgRaVn0yuvQ1AE52S2+toVekynQkt0PTN86p74GabgTTwF8M8z2Dy6qqr2ecFygCcC6J9+xdtlw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922492; c=relaxed/simple; bh=qNHb1CLjTtMHqgMCXUwp0cCKIIKt9WNSlisl2evFjMA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=J2/u39j76DzyHBBSoocfgEvj0kDYQ2TLqFdLtuMscLUViNdL0W/F6i/BKDAOricuplu+TrRzat3O0QybCgSPM2OWDB0ii0oVLTKnireZHqOLlECMcdUb/an6DURLDZu0sJV1289/18MG6v9wbuG9a3FbRvbq70lKdh0B+vmJJno= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=BToMNplz; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="BToMNplz" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 76BD91F00893; Tue, 13 Oct 2026 20:14:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1791922489; bh=eXXSCiITuXuvwb3zfcXD2NXYropFwuSwM81SLh+Zg28=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=BToMNplzG1vh2Fwk+pbmuhrTMfITunMbAnrZD9q4kckL+qBwrfhbBU8GSkTY0bcr4 rrEqyBsozguT4ma+v9SsfrulcKt1oiNvv0oeIrrIO+zRCm3kEx3SkPIsWUzgfCoC2T O9GjtYQdku8CYI/qrqcxTiwWVQw1X4GTpb+pOqvCkyA3DVPvgBlHQkLgvzAhmX6g6w 5pAER8PXdd7gQOlkE0ptto5yg1IbnjX119iD//l4ZpY+6cx5xBmF5CLGiwt/XHkgnZ qIui7WW9OUirGqqs/wKWM1MqRhQZw005pOyU3rwx0jBZnjUkZDYEYuaJSOSxKGDUiC iNbOOsAjv++hg== From: Arnaldo Carvalho de Melo To: Namhyung Kim Cc: Ingo Molnar , Thomas Gleixner , James Clark , Jiri Olsa , Ian Rogers , Adrian Hunter , Clark Williams , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v2 08/19] perf evsel: Don't dump probe events to PERF_TEST_ATTR Date: Tue, 13 Oct 2026 17:14:03 -0300 Message-ID: <20261013201415.36428-9-acme@kernel.org> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20261013201415.36428-1-acme@kernel.org> References: <20261013201415.36428-1-acme@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arnaldo Carvalho de Melo Events opened just to ask if they are supported, i.e. the ones in is_event_supported() and is_libpfm_event_supported(), go through the regular evsel__open() path and thus end up in the event files written to $PERF_TEST_ATTR, with everything but type, config and disabled zeroed: [event-0-38654705664-3] fd=3D3 cpu=3D-1 pid=3D0 type=3D0 size=3D0 config=3D38654705664 sample_type=3D0 ... which 'perf test attr' then takes as one of the events that were asked for, failing with: expected cpu=3D0, got -1 expected size=3D176, got 0 expected sample_type=3D65927, got 0 expected freq=3D1, got 0 This started showing up when there is more than one core PMU, as perf_pmus__supports_extended_type() probes one such event per core PMU, but these records were always bogus: nothing asked for them. Flag those evsels as support probes, keeping the name clear of the kprobe/uprobe meaning probe already has in evsel, and leave them out of the dump. Reported-by: Namhyung Kim Link: https://lore.kernel.org/linux-perf-users/asWQvXRdqp_RK85c@google.com/ Assisted-by: LLM Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/evsel.c | 6 +++++- tools/perf/util/evsel.h | 1 + tools/perf/util/pfm.c | 1 + tools/perf/util/print-events.c | 1 + 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index e61f309e93dccc7f..59318fef03cb17ff 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -3104,7 +3104,11 @@ static int evsel__open_cpu(struct evsel *evsel, stru= ct perf_cpu_map *cpus, =20 bpf_counter__install_pe(evsel, idx, fd); =20 - if (unlikely(test_attr__enabled())) { + /* + * Support probes aren't what was asked for, leave them + * out of the PERF_TEST_ATTR dump. + */ + if (unlikely(test_attr__enabled() && !evsel->support_probe)) { test_attr__open(&evsel->core.attr, pid, cpu, fd, group_fd, evsel->open_flags); } diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index 174f3414fd3cfa0d..53f3641b66e18674 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -120,6 +120,7 @@ struct evsel { u64 db_id; bool uniquified_name; bool supported; + bool support_probe; /* Opened just to check for support. */ bool needs_swap; bool disabled; bool no_aux_samples; diff --git a/tools/perf/util/pfm.c b/tools/perf/util/pfm.c index f80d6b0df47ae64d..ad9bc481da70604e 100644 --- a/tools/perf/util/pfm.c +++ b/tools/perf/util/pfm.c @@ -141,6 +141,7 @@ static bool is_libpfm_event_supported(const char *name,= struct perf_cpu_map *cpu return false; =20 evsel->is_libpfm_event =3D true; + evsel->support_probe =3D true; =20 ret =3D evsel__open(evsel, cpus, threads); if (ret =3D=3D -EACCES) { diff --git a/tools/perf/util/print-events.c b/tools/perf/util/print-events.c index 0242243681b6b6f9..77428d9e73c4f1b6 100644 --- a/tools/perf/util/print-events.c +++ b/tools/perf/util/print-events.c @@ -147,6 +147,7 @@ bool is_event_supported(u8 type, u64 config) =20 evsel =3D evsel__new(&attr); if (evsel) { + evsel->support_probe =3D true; ret =3D evsel__open(evsel, NULL, tmap) >=3D 0; =20 if (!ret) { --=20 2.55.0 From nobody Sat Oct 24 13:19:52 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7C61F54A7FD; Tue, 13 Oct 2026 20:14:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922495; cv=none; b=sn1/xVd8ta6Vx9UStUWtKEgF/XJGvqQUtJSo9CQp3cDlStf33Pnw9SXYtPInA+SCtX/5poAxafrRAc/oE0VIH4E4V1fyQrZYXtJLgnVneV7AiuvdqYhqkPLIpvUVNPxQZwpSaf5EofQQiujtewYJOciBlhuM/lVs+JjGG9KQL6M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922495; c=relaxed/simple; bh=2pah7aneRmk/VwD7rFZ651U2HVcO64QHZQpk6C/3s4k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ME9JNHgRNEGhW9S5LUEUWv8kJ5CepE2I9YznP+wBnuDRE5aFp1t52J1wY878i0Shnv4dmyOXmGx+GU8HQ1D4DjKsLNciT57lQkI6t9TrXkDEQGSBqATCQ4mT74XeeBMP7rVSG/KtSDkX0eK2MY6TrL2Mo1rzrBtFqnh2uRNppho= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=CWowsAdD; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="CWowsAdD" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4B2C21F000FF; Tue, 13 Oct 2026 20:14:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1791922492; bh=1JHTAQY5lRazigJWTIbB4IaVqEjKG6H0hJaojh3mmZg=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=CWowsAdDP9vD0ZBvE9O+s4T1PZpiPKwC3+iLucnwztz21CgHzbUEYRMJ3+PxZigMZ yhHcQCA5Umewf7bhSNPL3pmd+7+bQ7gJqxC6NouRiV7gW82j7gxVbnpMrdvJZmMAd6 VW8A5I2F87wsGS0B8DYfUFQhJcKnTSPLe+x7+maEIxoKfBThK3RS+J0xXgBrNXsZTK CD2S31Rc6J4H5XgV8Ci7RoQx4o+GozojMCfhEfH+78N6ATjftyUbojAzvGO3Sn0PBt vb0d5nOMycJOov7cvXxsTrKz5TPthTqmnY2YczZk7w5630JvmlXfK6gyElWm9MIBgO EAg3atkaBId5g== From: Arnaldo Carvalho de Melo To: Namhyung Kim Cc: Ingo Molnar , Thomas Gleixner , James Clark , Jiri Olsa , Ian Rogers , Adrian Hunter , Clark Williams , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v2 09/19] perf test attr: Introduce mask_bits(), generalizing hide_core_pmu_type() Date: Tue, 13 Oct 2026 17:14:04 -0300 Message-ID: <20261013201415.36428-10-acme@kernel.org> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20261013201415.36428-1-acme@kernel.org> References: <20261013201415.36428-1-acme@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arnaldo Carvalho de Melo What hide_core_pmu_type() does is take a set of bits out of each of the '|'-separated alternatives in a value, wildcards included, keeping the rest of the expression: extract that as mask_bits() and implement hide_core_pmu_type() in terms of it, a prep for using the same thing to ignore, when comparing expectations, the sample id bit perf ends up asking for and the read_format group bit that a PMU count can remove. No change in behaviour. Assisted-by: LLM Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/tests/shell/lib/attr.py | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/tools/perf/tests/shell/lib/attr.py b/tools/perf/tests/shell/li= b/attr.py index 70ff73585cb3ffa9..151b884670952e9f 100644 --- a/tools/perf/tests/shell/lib/attr.py +++ b/tools/perf/tests/shell/lib/attr.py @@ -64,24 +64,31 @@ PERF_TYPE_HW_CACHE =3D 3 # type in its top 32 bits when there is more than one core PMU. LEGACY_TYPES =3D (str(PERF_TYPE_HARDWARE), str(PERF_TYPE_HW_CACHE)) =20 -def hide_core_pmu_type(value): +def mask_bits(value, bits): """ - The kernel can be told which core PMU a legacy type event is meant for= by - putting its type in the top 32 bits of 'config', which perf only does = when - there is more than one core PMU, so take those bits out to keep the - expectations written for the single core PMU case matching on - heterogeneous machines. + Take the bits in 'bits' out of each of the '|'-separated alternatives = in + 'value', keeping the rest of the expression, wildcards included. """ - hidden =3D [] + masked =3D [] =20 for alternative in value.split('|'): try: - alternative =3D str(int(alternative, 0) & 0xffffffff) + alternative =3D str(int(alternative, 0) & ~bits) except ValueError: pass - hidden.append(alternative) + masked.append(alternative) =20 - return '|'.join(hidden) + return '|'.join(masked) + +def hide_core_pmu_type(value): + """ + The kernel can be told which core PMU a legacy type event is meant for= by + putting its type in the top 32 bits of 'config', which perf only does = when + there is more than one core PMU, so take those bits out to keep the + expectations written for the single core PMU case matching on + heterogeneous machines. + """ + return mask_bits(value, 0xffffffff00000000) =20 class Fail(Exception): def __init__(self, test, msg): --=20 2.55.0 From nobody Sat Oct 24 13:19:52 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 011EA54CF6E; Tue, 13 Oct 2026 20:14:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922498; cv=none; b=sCq23aYWci/VOK5AokVA4kAqyCVzd8znUZKIF/bBgyf+z+ABxox6W4lwVMAKGLhXWYBZ6kLyNy6L7dKBly5sNOPenz8IshdIDbaZXKS0guDBnEh9uLIDk+hf64hgfXEDSEnN+j5MPZh9v4uRhQYX2eNY4eGHo1G9/V6mLAyRdAQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922498; c=relaxed/simple; bh=QBndtq93tfcppRnL1Kf9KZ+fCvqQRz6gUB4DNxYLlHc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=s2KeEn0h74T+yqm+4oemF1FtxY6+KekDyc06L2VCfgoT0FOJXq82K5catgvJM5JzxTQReIPSGpsTf0jKJKB+aRAOljvSoGlQApP0TB3+s0DTa66RkS6lg/xQXHlpZipkBcbhpTZ+Hgv3D2eZuN0FvyhZca6KlciUM7sw3qOt9Ag= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=k1sY8WUk; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="k1sY8WUk" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1FC671F00893; Tue, 13 Oct 2026 20:14:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1791922495; bh=YxjM0SWIV4nNdkug9VvUg+uBSrS/xqpPOyJeONSlXqM=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=k1sY8WUkb0woSvxoBTPDxXgyyHeo8eyLv1zPRtS4FQtVdlJ6bA+tTUkBU/I3OeE6k aU45ZsG7gE6JP1VBG46VQyLeKvXU+Es0vQgEdaw13MtQCCX8+SKjbIedPKFc59hRPs tu/Y/gzZ41Tji+1wyBf4LKy5eGAFjIwcL3EaJCqQdyrVQ8GOghYmHl87zJDwsNeY8c 3n+ZEHyXI6u3PrIr/8FJR5+j0djkl9O+81GOK0yEz+ReDpGBIh+Tu14diAjXeCq/CV 0qK0HsM1WuxPoJ8uev5ALL6AEOkLHLz3tDWdnY6Eh3T32hTCBitNE2Zr5JFOt1A9qe niSu3iIHcK4JQ== From: Arnaldo Carvalho de Melo To: Namhyung Kim Cc: Ingo Molnar , Thomas Gleixner , James Clark , Jiri Olsa , Ian Rogers , Adrian Hunter , Clark Williams , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v2 10/19] perf test attr: Accept either sample id bit perf asks for Date: Tue, 13 Oct 2026 17:14:05 -0300 Message-ID: <20261013201415.36428-11-acme@kernel.org> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20261013201415.36428-1-acme@kernel.org> References: <20261013201415.36428-1-acme@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arnaldo Carvalho de Melo evlist__config() asks for a way to tell the samples apart, PERF_SAMPLE_IDENTIFIER where available, PERF_SAMPLE_ID otherwise: bool sample_id =3D opts->sample_id; ... if (opts->full_auxtrace || opts->sample_identifier) { ... use_sample_identifier =3D perf_can_sample_identifier(); sample_id =3D true; } else if (evlist__nr_entries(evlist) > 1) { ... use_sample_identifier =3D perf_can_sample_identifier(); sample_id =3D true; } so the id is asked for whenever the evlist has more than one event, and also when asked to outright, with --sample-identifier or by an auxtrace session, or by record__config() for a pipe run, through opts->sample_id, none of which depends on the sample types: 'perf record --sample-identifier -e cycles' and the arm SPE expectations in this very directory ask for it with a single event. Which one it asks for depends on the composition of the evlist: with more than one core PMU a request for 'cycles' becomes one event per core PMU, the extra dummy tracking events then make the sample types differ and perf goes for IDENTIFIER, while the expectations were written on machines with a single core PMU, where perf asks for ID: expected sample_type=3D263, got 65799 # 263 | (1 << 16) expected sample_type=3D343, got 65815 # (343 & ~(1 << 6)) | (1 << 16),= group-sampling Both bits mean the same thing here, how the samples get associated with the event that produced them, so when the expectation asks for one of them, ask for "an id of some sort" on both sides, and when the expectation doesn't ask for any, take the bits out of what got recorded: whether they are there and which one it is are consequences of what was asked for and of how the request got expanded, none of that is what these expectations are about. Since Test.compare() looks at both directions, expectations matching the recorded events and recorded events matching the expectations, keep track of which side is the one perf recorded to take the bits out of the right side. Assisted-by: LLM Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/tests/shell/lib/attr.py | 81 ++++++++++++++++++++++++++++-- 1 file changed, 76 insertions(+), 5 deletions(-) diff --git a/tools/perf/tests/shell/lib/attr.py b/tools/perf/tests/shell/li= b/attr.py index 151b884670952e9f..e911684428b1b74b 100644 --- a/tools/perf/tests/shell/lib/attr.py +++ b/tools/perf/tests/shell/lib/attr.py @@ -59,6 +59,8 @@ def core_pmu_available(): =20 PERF_TYPE_HARDWARE =3D 0 PERF_TYPE_HW_CACHE =3D 3 +PERF_SAMPLE_ID =3D 1 << 6 +PERF_SAMPLE_IDENTIFIER =3D 1 << 16 =20 # The legacy event types, where perf may qualify 'config' with the core PMU # type in its top 32 bits when there is more than one core PMU. @@ -90,6 +92,49 @@ def hide_core_pmu_type(value): """ return mask_bits(value, 0xffffffff00000000) =20 +# The two sample id bits mean the same thing here: how the samples of the +# events in the evlist get associated with the event that produced them. +SAMPLE_ID_BITS =3D PERF_SAMPLE_ID | PERF_SAMPLE_IDENTIFIER + +# No real sample_type bit is this high, so it can stand for "either of the +# sample id bits" when comparing the two sides. +SAMPLE_ID_EITHER =3D 1 << 40 + +def hide_sample_id(expected, recorded): + """ + perf asks for a way to tell the samples apart, PERF_SAMPLE_IDENTIFIER = where + available, PERF_SAMPLE_ID otherwise, see evlist__config(): whenever the + evlist has more than one event, and when asked to outright, with + --sample-identifier, by an auxtrace session, or by record__config() fo= r a + pipe run, none of which depends on the sample types, as those only cho= ose + between the two bits: + with more than one core PMU the dummy tracking events make the sample = types + differ, so IDENTIFIER is asked for even for events whose expectations = ask + for ID, written on a machine with a single core PMU. + + So treat the two as the same thing: when the expectation asks for eith= er + of them, ask for "an id of some sort" on both sides, and when the + expectation doesn't ask for any, take the bits out of what got recorde= d. + """ + try: + asked =3D int(expected, 0) & SAMPLE_ID_BITS + except ValueError: + # The expectation is a wildcard or a set of alternatives. + return expected, recorded + + try: + recorded_id_bits =3D int(recorded, 0) & SAMPLE_ID_BITS + except ValueError: + # The recorded side is a wildcard or a set of alternatives. + return expected, mask_bits(recorded, SAMPLE_ID_BITS) + + if not asked: + return expected, mask_bits(recorded, SAMPLE_ID_BITS) + + return (str(int(expected, 0) & ~SAMPLE_ID_BITS | SAMPLE_ID_EITHER), + str(int(recorded, 0) & ~SAMPLE_ID_BITS | + (SAMPLE_ID_EITHER if recorded_id_bits else 0))) + class Fail(Exception): def __init__(self, test, msg): self.msg =3D msg @@ -182,13 +227,33 @@ class Event(dict): =20 return value =20 + def hide_event_count_dependent_terms(self, term, expected, recorded): + if term =3D=3D 'sample_type': + return hide_sample_id(expected, recorded) + + return expected, recorded + + def recorded_side(self, other): + """ + Which one is what perf recorded? Both directions get compared, see + Test.compare(), so this can't be taken from the arguments' order. + """ + if getattr(other, 'recorded', False): + return other + + return self if getattr(self, 'recorded', False) else None + def equal(self, other): for t in Event.terms: log.debug(" [%s] %s %s", t, self[t], other[t]) if t not in self or t not in other: return False - exp =3D self.hide_core_pmu_type(t, self[t], other) - got =3D self.hide_core_pmu_type(t, other[t], other) + recorded =3D self.recorded_side(other) + expected =3D other if recorded is self else self + exp =3D self.hide_core_pmu_type(t, expected[t], recorded or ex= pected) + got =3D self.hide_core_pmu_type(t, (recorded or self)[t], expe= cted) + if recorded is not None: + exp, got =3D self.hide_event_count_dependent_terms(t, exp,= got) if not data_equal(exp, got): return False return True @@ -202,10 +267,14 @@ class Event(dict): for t in Event.terms: if t not in self or t not in other: continue - exp =3D self.hide_core_pmu_type(t, self[t], other) - got =3D self.hide_core_pmu_type(t, other[t], other) + recorded =3D self.recorded_side(other) + expected =3D other if recorded is self else self + exp =3D self.hide_core_pmu_type(t, expected[t], recorded or ex= pected) + got =3D self.hide_core_pmu_type(t, (recorded or self)[t], expe= cted) + if recorded is not None: + exp, got =3D self.hide_event_count_dependent_terms(t, exp,= got) if not data_equal(exp, got): - log.warning("expected %s=3D%s, got %s", t, self[t], other[= t]) + log.warning("expected %s=3D%s, got %s", t, exp, got) =20 def parse_version(version): if not version: @@ -487,6 +556,8 @@ class Test(object): log.debug(" loading result events") for f in glob.glob(tempdir + '/event*'): self.load_events(f, self.result) + for event in self.result.values(): + event.recorded =3D True =20 # resolve group_fd to event names self.resolve_groups(self.expect) --=20 2.55.0 From nobody Sat Oct 24 13:19:52 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6C78154CF68; Tue, 13 Oct 2026 20:14:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922500; cv=none; b=fJJRSftInjdIJGGAULO/GUDrWNnG5wGUKokVtTu14waJFsrkuLiMW0JUdXU5W/T76BkSORpSowJJeVuCF6whvBd91xY1YDAtWezNuNUK42SM0s0OcVB+rntbi6FR4DQRzimNm9HsqrBEPLU9nX9yVQyMJgXm48oaOiuugr8RISA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922500; c=relaxed/simple; bh=FuNzl/Ax4aG0F9wbAmJxt+kk8IzBqbXyqPXwHo38Lec=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JnPMT/xzXbDNnsMoCWRR+9Ng02gA4drrXFwvghdtsO7vJWafsTKKgKdXGYwj7SBzXuGLGcSnKbYQIUVGs23okGEK8m8WkXuuQ1MS/lFeP8q2N9f6C4I4KHMZXUAb15IOCucS1UbL/H/MoUdmtLdj96FBEZYUU7Edg6VHI9YoNr4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=AD9XNVW0; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="AD9XNVW0" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E8C981F000FF; Tue, 13 Oct 2026 20:14:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1791922498; bh=XEuA9LYQZKS/oSR/ys9cZ6R+I7hy6Yt5O2XsZifO0+0=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=AD9XNVW0pdZOxqjmDV2QbOHR1mVKDbJT+uiujeuUjG7UTGF7HZpmQhSQVa+MeXq6T Qw+b001aewGVRpyTf1TZXLEU52xDxCdcTh6cL7i3jDg5RN0nMGBm6KuJLvrZmsSDHL VUn8xnMXbv5nfEtunR0/FMUYqvAyfzanowDW+dtrWLsuTLdzECx2i/9Fed3xXPfInQ 9BQq5FDcTfzghNYozfT/XSRTVNd26PQPXZu9XWhYxqzOiPBYZurNgrDStULPJTLaa7 zQIXGpNiR5jkAajPBZ9DjgykceZ3fnd8iDG9NJOcPmOp/N7MvfpyyiSQswurj65kRG PPgQC1qYm0dEA== From: Arnaldo Carvalho de Melo To: Namhyung Kim Cc: Ingo Molnar , Thomas Gleixner , James Clark , Jiri Olsa , Ian Rogers , Adrian Hunter , Clark Williams , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v2 11/19] perf test attr: Ignore the dummy tracking event and the terms it carries Date: Tue, 13 Oct 2026 17:14:06 -0300 Message-ID: <20261013201415.36428-12-acme@kernel.org> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20261013201415.36428-1-acme@kernel.org> References: <20261013201415.36428-1-acme@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arnaldo Carvalho de Melo With more than one core PMU the requested events can't cover all the CPUs, each cluster has its own PMU, so perf opens the software dummy event to carry the tracking terms (mmap, comm, task, mmap_data), leaving the requested events without them: expected mmap=3D1, got 0 expected comm=3D1, got 0 expected task=3D1, got 0 That dummy event is not part of what the expectations are about, so leave it out of the comparison, unless the expectations ask for one, like system-wide-dummy and test-record-dummy-C0 do. And when perf used it to carry the tracking terms, those terms can't be matched on the requested events, leave them out of the match as well. Assisted-by: LLM Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/tests/shell/lib/attr.py | 56 ++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/tools/perf/tests/shell/lib/attr.py b/tools/perf/tests/shell/li= b/attr.py index e911684428b1b74b..222ce6f598831e3f 100644 --- a/tools/perf/tests/shell/lib/attr.py +++ b/tools/perf/tests/shell/lib/attr.py @@ -61,6 +61,21 @@ PERF_TYPE_HARDWARE =3D 0 PERF_TYPE_HW_CACHE =3D 3 PERF_SAMPLE_ID =3D 1 << 6 PERF_SAMPLE_IDENTIFIER =3D 1 << 16 +PERF_TYPE_SOFTWARE =3D 1 +PERF_COUNT_SW_DUMMY =3D 9 + +def is_dummy_tracking_event(event): + """ + Is this the dummy event perf opens to carry the tracking events (mmap, + comm, task) when the requested ones can't, like when there is more tha= n one + core PMU and each core PMU's events run on only part of the CPUs? + """ + return (event.get('type') =3D=3D str(PERF_TYPE_SOFTWARE) and + event.get('config') =3D=3D str(PERF_COUNT_SW_DUMMY)) + +# With more than one core PMU the tracking terms go to the dummy tracking = event, +# leaving the requested events without them, so they can't be matched ther= e. +TRACKING_TERMS =3D ['mmap', 'comm', 'task', 'mmap_data'] =20 # The legacy event types, where perf may qualify 'config' with the core PMU # type in its top 32 bits when there is more than one core PMU. @@ -243,11 +258,26 @@ class Event(dict): =20 return self if getattr(self, 'recorded', False) else None =20 + def hide_tracking_via_dummy(self, term, other): + """ + The tracking terms are set on the tracking event, which is the dum= my + event when there is more than one core PMU, leaving the requested + events without them, nothing to match on then. + """ + if term not in TRACKING_TERMS: + return False + + return (getattr(self, 'tracking_moved_to_dummy', False) or + getattr(other, 'tracking_moved_to_dummy', False)) + def equal(self, other): for t in Event.terms: log.debug(" [%s] %s %s", t, self[t], other[t]) if t not in self or t not in other: return False + if self.hide_tracking_via_dummy(t, other): + continue + recorded =3D self.recorded_side(other) expected =3D other if recorded is self else self exp =3D self.hide_core_pmu_type(t, expected[t], recorded or ex= pected) @@ -267,6 +297,9 @@ class Event(dict): for t in Event.terms: if t not in self or t not in other: continue + if self.hide_tracking_via_dummy(t, other): + continue + recorded =3D self.recorded_side(other) expected =3D other if recorded is self else self exp =3D self.hide_core_pmu_type(t, expected[t], recorded or ex= pected) @@ -478,6 +511,27 @@ class Test(object): else: raise Unsup(self) =20 + def drop_dummy_tracking_events(self): + """ + Leave out the dummy event perf itself opened, see + is_dummy_tracking_event(), unless the expectations ask for one. + """ + if any(is_dummy_tracking_event(e) for e in self.expect.values()): + return + + if not any(is_dummy_tracking_event(e) for e in self.result.values(= )): + return + + for name, event in list(self.result.items()): + if is_dummy_tracking_event(event): + log.debug(" dropping dummy tracking event [%s]", name) + del self.result[name] + + # The tracking terms got carried by the dropped dummies, flag the + # remaining events so that the match leaves those terms out. + for event in self.result.values(): + event.tracking_moved_to_dummy =3D True + def compare(self, expect, result, strict_groups=3DTrue): match =3D {} =20 @@ -559,6 +613,8 @@ class Test(object): for event in self.result.values(): event.recorded =3D True =20 + self.drop_dummy_tracking_events() + # resolve group_fd to event names self.resolve_groups(self.expect) self.resolve_groups(self.result) --=20 2.55.0 From nobody Sat Oct 24 13:19:52 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7152A54DAEF; Tue, 13 Oct 2026 20:15:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922505; cv=none; b=NSjad+alPenVUew9/rR0AX8+seH+Y9VUFpkWe7AvzIFkKFOzfuUklhq2ea/rnQTxPOnRrQmi1dC2k+phlVBCP+iPWFBlYR+BpqXoRnjzUKZ6TNO1U2fsdOLpoY63uOYYd8o8j2RZKf6y2AFkZQEEt1X83x9K7/APM+PrXcWFdTI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922505; c=relaxed/simple; bh=qeBg26zOYqqdxzz+45miObF1TeX5Y9NjWl3YDA5Jq5A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=k3YE4mNJl+DkoejPm2zBWGyIzi68Oea4PJs5OQVwfLaqA6EHAqJE4SWGenwA6gGCUCD1vhgUKuHF3B1bJWslaXdMvckcIWcd09otEgxcfC7ACFNM6GzyH57t2xMfw7ggcZAc5hTUPaVs/82N/JpLUsNeZO2WDZ9AA/0Yk/0AXrs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=orRaOkjO; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="orRaOkjO" Received: by smtp.kernel.org (Postfix) with ESMTPSA id BD1541F00893; Tue, 13 Oct 2026 20:14:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1791922501; bh=ztKLYD6iVWRJBLvTv/2UKAv5bmFBL2HBxANZbtkkpTE=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=orRaOkjOQ1cB6JtRFF1kK4AI6bI/HQ/RE3tuop7wZwaMGHvDqSSrBGtv/1uzbBf/q A1WFqV3tIFY2GpTC+SlnjgRsMcXQTgb0bDuOo206Uh9ieGnD6Y1fDP8RWA66y/fils Cf3yPVU7SdCieUb5g0Ih32QVN2OejgTPFkOjGt72ua45l6FKwUpY+pfQ2vIhbLBW1P 8RabtSmu34HZZMbCK/aFHeBCWAZcmIDbojjj6lOD8tEMgBqTLQr9lV0Y5i6Plsy0sV CQR/auM+1uoD3L09+oeYdjlyWrfT339Fe3fcjpZGJt8GQcS6hh57GmiQaUiyfC3R2W jtbrwsRn8Fn4w== From: Arnaldo Carvalho de Melo To: Namhyung Kim Cc: Ingo Molnar , Thomas Gleixner , James Clark , Jiri Olsa , Ian Rogers , Adrian Hunter , Clark Williams , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v2 12/19] perf test attr: Leave out the events of the other core PMUs Date: Tue, 13 Oct 2026 17:14:07 -0300 Message-ID: <20261013201415.36428-13-acme@kernel.org> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20261013201415.36428-1-acme@kernel.org> References: <20261013201415.36428-1-acme@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arnaldo Carvalho de Melo On a hybrid machine the default stat metrics are opened on each core PMU, and the events of the other one have their own encodings: on an i7-14700K cpu_atom (type 10) opens UOPS_RETIRED.ALL, config 194, which the expectations, written for cpu_core (type 4), don't name: expected type=3D4, got 10 expected config=3D209|391, got 194 The test already masks the core PMU type out of 'config' for the legacy events, but raw events keep their type and encoding, so leave out the events of the core PMUs no expectation names, like the dummy tracking event. Core PMUs are found as perf finds them: 'cpu' or 'cpum_cf', or a PMU with a 'cpus' file in sysfs. Nothing is left out unless an expectation names a core PMU, so single core PMU machines and the tests with only legacy expectations are not affected. Assisted-by: LLM Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/tests/shell/lib/attr.py | 39 ++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/tools/perf/tests/shell/lib/attr.py b/tools/perf/tests/shell/li= b/attr.py index 222ce6f598831e3f..65b1e655a2bcb505 100644 --- a/tools/perf/tests/shell/lib/attr.py +++ b/tools/perf/tests/shell/lib/attr.py @@ -532,6 +532,44 @@ class Test(object): for event in self.result.values(): event.tracking_moved_to_dummy =3D True =20 + def drop_other_core_pmu_events(self, devices=3D'/sys/bus/event_source/= devices'): + """ + Leave out the events of the other core PMUs, which have their own + encodings, when the expectations name one of the core PMUs. + """ + asked =3D set() + for event in self.expect.values(): + types =3D event.get('type', '').split('|') + if '*' in types: + return + asked.update(types) + + try: + names =3D os.listdir(devices) + except OSError: + return + + core =3D set() + for name in names: + path =3D os.path.join(devices, name) + has_cpus =3D os.path.exists(os.path.join(path, 'cpus')) + if name not in ('cpu', 'cpum_cf') and not has_cpus: + continue + try: + with open(os.path.join(path, 'type'), encoding=3D'utf-8') = as f: + core.add(f.read().strip()) + except OSError: + pass + + if not core & asked: + return + + others =3D core - asked + for name, event in list(self.result.items()): + if event.get('type') in others: + log.debug(" dropping other core PMU event [%s]", name) + del self.result[name] + def compare(self, expect, result, strict_groups=3DTrue): match =3D {} =20 @@ -614,6 +652,7 @@ class Test(object): event.recorded =3D True =20 self.drop_dummy_tracking_events() + self.drop_other_core_pmu_events() =20 # resolve group_fd to event names self.resolve_groups(self.expect) --=20 2.55.0 From nobody Sat Oct 24 13:19:52 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1C350548571; Tue, 13 Oct 2026 20:15:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922505; cv=none; b=rk02qXhY3/h5Lm8wnoz192vyEU4JuqGX8NJ3oNpqbLQGCp1qSWikmSc1FZV81PKdHwgn03K8DM7KK4kVfp/hIRtPXpBDSqdSTGiDC5nT8KNpQTfHYfvRy+iXboEAOI29mg3rG/rtY5xrEPdbPrTq0Z8+VtcHYhL8DgElw1JAgB8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922505; c=relaxed/simple; bh=WovNExGZiFzdFWR7F1M30yfO6VJBw8v7D7zHTHoSSk8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DbpN2RCdtn4VtvG0UFdKIIgyaR4btgAtaGeDWoaelaUSG4RmGWhq/R9jyKbSQqTWZUdYp7cVKVGIAI0e3daddAV8OWIFjd0CjmiSp6Gy7oKEh8F09b2M9Yl1sCz3Y8dOL0MdjParUg8stHUzNEfRx8reWkhpeBgjJU9Fj9TCROQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=RTooHdI/; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="RTooHdI/" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 937D21F000FF; Tue, 13 Oct 2026 20:15:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1791922504; bh=Zgi7YhpIR7wMSAazs7tO3pTqYAeCHrzL1I8KPI2OwcU=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=RTooHdI/Jw6GPAzDVn34C2uV/8URh++lV/pA1dB/plZtzfUtpoc8DLu43/OFTaZIO llndZ7Q5YyhoeTAgDJ+636N+WQvrPQ/yuHRQ96tJ9DtcuQ5NuYR1StU3AgqVd6LAJ+ UsgeuJyanxKUudYgvzySCos6t12tB651y8pmt9dkLTtsQCOB9qPfYj5zVIGQwUeTd+ 25Gvmhv4lM3v4AOOfOT1Cm+/vpoWCBiS50DU/v+P7QCJTlir/cywSL5qKLD4LYatzv qksQ9Mf3kW7hT4c8iTgBNEPkRDfE5JmNsLZdwZlTACT/qnZYFr/AYdfqZhSw9vcq8A /pIvl0oNDP5jg== From: Arnaldo Carvalho de Melo To: Namhyung Kim Cc: Ingo Molnar , Thomas Gleixner , James Clark , Jiri Olsa , Ian Rogers , Adrian Hunter , Clark Williams , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v2 13/19] perf test attr: Ignore the group read_format bit the PMU count can remove Date: Tue, 13 Oct 2026 17:14:08 -0300 Message-ID: <20261013201415.36428-14-acme@kernel.org> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20261013201415.36428-1-acme@kernel.org> References: <20261013201415.36428-1-acme@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arnaldo Carvalho de Melo read_format's PERF_FORMAT_GROUP bit asks for the group members to be read along with the leader, which aside from this bit is verified with the fd/group_fd based group checking in Test.compare(), and with more than one core PMU a group whose members are pinned to one of them, say 'default_core', leaves the clones for the other core PMUs without any members: $ perf stat -e '{cycles,default_core/legacy-hardware-config=3D3/}:S' ... the A53 leader keeps its cohort, both A73 cycles clones are alone, read_format 20 instead of 28 so that bit isn't there: whether it is there is a consequence of how the evlist got expanded to more than one core PMU, not of the groupness the expectations say about, which is verified structurally, so take it out on both sides. That leaves the A73 leader clones, now with: expected read_format=3D28|31, got 20 matching the base event expectations again. With a single core PMU there is nothing to expand, so there is nothing to explain away: count the core PMUs when the script starts, from what perf makes of 'cycles', see parse_events_multi_pmu_add(), and take the bit out only when there is more than one, leaving the machines with a single core PMU verifying what the expectations say about it. That count is 2 on the Amlogic A311D, where its A53 and A73 PMUs both answer for 'cycles', and 1 on a machine with a single core PMU. Where there is no binding to ask, as when attr.py runs without setup_python.sh, the count isn't available and the bit is taken out as well. Assisted-by: LLM Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/tests/shell/lib/attr.py | 46 ++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/tools/perf/tests/shell/lib/attr.py b/tools/perf/tests/shell/li= b/attr.py index 65b1e655a2bcb505..3bf07d4df95987d8 100644 --- a/tools/perf/tests/shell/lib/attr.py +++ b/tools/perf/tests/shell/lib/attr.py @@ -115,6 +115,50 @@ SAMPLE_ID_BITS =3D PERF_SAMPLE_ID | PERF_SAMPLE_IDENTI= FIER # sample id bits" when comparing the two sides. SAMPLE_ID_EITHER =3D 1 << 40 =20 +PERF_FORMAT_GROUP =3D 1 << 3 + +def core_pmu_count(): + """ + How many core PMUs does perf see? An event with no PMU named in it + becomes one event per core PMU, see parse_events_multi_pmu_add(), and + that is the expansion that leaves the clones for the other core PMUs + without any group members and that makes the kernel qualify 'config' + with the type of the PMU it is for, so this is the number of events pe= rf + makes of 'cycles'. None when there is no binding to ask, as in + core_pmu_available(). + """ + try: + import perf + parse_events =3D perf.parse_events + except (ImportError, AttributeError): + return None + + try: + return len(parse_events('cycles')) + except OSError: + # No PMU that can count it, see core_pmu_available(). + return None + +SINGLE_CORE_PMU =3D core_pmu_count() =3D=3D 1 + +def hide_group_format(expected, recorded): + """ + read_format's PERF_FORMAT_GROUP bit asks for the group members to be r= ead + along with the leader, which aside from this bit is verified with the + fd/group_fd based group checking, and with more than one core PMU a gr= oup + whose members are pinned to one of them, say 'default_core', leaves the + clones for the other core PMUs without any members, so that bit isn't + there: whether it is there is a consequence of how the evlist got + expanded to more than one core PMU, not of what the expectations are + about, so take it out on both sides. On a machine with a single core = PMU + there is nothing to expand, so the expectations keep verifying it. + """ + if SINGLE_CORE_PMU: + return expected, recorded + + return (mask_bits(expected, PERF_FORMAT_GROUP), + mask_bits(recorded, PERF_FORMAT_GROUP)) + def hide_sample_id(expected, recorded): """ perf asks for a way to tell the samples apart, PERF_SAMPLE_IDENTIFIER = where @@ -245,6 +289,8 @@ class Event(dict): def hide_event_count_dependent_terms(self, term, expected, recorded): if term =3D=3D 'sample_type': return hide_sample_id(expected, recorded) + if term =3D=3D 'read_format': + return hide_group_format(expected, recorded) =20 return expected, recorded =20 --=20 2.55.0 From nobody Sat Oct 24 13:19:52 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E891054DAC6; Tue, 13 Oct 2026 20:15:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922508; cv=none; b=ELSvQTuVJSn3f5aCt778LjUYB0vcqln5LZiFtSBXuyn0GhD3joTrxhNtBDTDXjHQPrPzD/Wo/7sOmX7FEYMJTiod5ev6s7VS14OSGmp+OzyMMcNVMqy97jS0UurxtXdH2QpEjHPEM1igvRmiS9NKPaFvl/oK10pUAkaq/HcIyjg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922508; c=relaxed/simple; bh=Yz2dmoOCyMhhyb1jkTvK1YDB4vwtjGpP40luxUcEbkc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cAwq9ZPtBJ5Jx3htAME5ZTwi1Onfe4RLOg1v/digg0GrfZmNASF/WzUwOOyoRjr9f+aMuQfdt2Sz201rAzigzEUN8Hfoig0ALpTQ7UeJwvP3gAPvS+zPojfr0oyXewZMnha25IpCTzhdJiZ0kCjPseE29ZiNXt2Sv8w9d6cQPh8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Hazwejyu; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Hazwejyu" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6C7F81F00898; Tue, 13 Oct 2026 20:15:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1791922506; bh=zwVkzWIz7ImtwZ79BPj6vRspH/7+ok6opbJ9nHtR8+s=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=Hazwejyugri7i2S7eFoqWstTESWyU57TyKxsPZVQUiJbYuIYoOXZQu3I7hHkAjUJ/ yLHx/nwFzKdLJCqpc/HitUIzu1DkF7IyGY35I3APoCSHg3z5IO2Pfg5/ECVPj5N8pl T4bl+aiYJksZEIaH+mLCVLWYk78ck47Ahqsyg/35JPGt5tP2tz3MkXA96oaBNAay9I f1NCX4JyvD0QY+LHblotdA30CL2iIwge8fPyJvg8zfGIXSsvlUgZteZs+Q1L7Muoxn s26M6263Jx9geRnn8ny3ceZH1vVeT+0hmO8Rv1tX+GjpAPRq0mYxh8WJMzBDyOXGWV Mj9ncbIGDzRRw== From: Arnaldo Carvalho de Melo To: Namhyung Kim Cc: Ingo Molnar , Thomas Gleixner , James Clark , Jiri Olsa , Ian Rogers , Adrian Hunter , Clark Williams , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v2 14/19] perf test attr: State, spelled out in a line, why a test is skipped Date: Tue, 13 Oct 2026 17:14:09 -0300 Message-ID: <20261013201415.36428-15-acme@kernel.org> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20261013201415.36428-1-acme@kernel.org> References: <20261013201415.36428-1-acme@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arnaldo Carvalho de Melo Per skip the default output shows a self contained one liner: unsupp 'test-record-branch-filter-any' exit 255, expected 1, likely a mi= ssing capability skipped [kernel newer than 6.12] 'test-record-group-sampling' skipped [arch =3D !aarch64, machine =3D aarch64] 'test-record-graph-defau= lt' The extra notes explaining the reason, with a copy pasteable command to observe the failure, come in the very same stream when the verbosity is bumped, at -vvv, nothing is written to a separate place for later consultation, it is just the logging ladder: detail: '/root/bin/perf record --no-bpf-event -j any kill' exited with 255, the expectations want the workload's 1 exit, so there are no attrs recorded to verify; this is normally a capability problem, run '/root/bin/perf record --no-bpf-event -j any kill' to see why Note that 'perf test -v/-vv/-vvv attribute' appends a single -v to the shell test entry (shell_test__run()), so to see the notes one runs the python module directly, f.i.: python3 tests/shell/lib/attr.py -vvv -d tests/shell/attr -p ./perf The skip functions now return the reason fragment when they want to skip and None when the test can go on. Assisted-by: LLM Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/tests/shell/lib/attr.py | 96 ++++++++++++++++++++---------- 1 file changed, 63 insertions(+), 33 deletions(-) diff --git a/tools/perf/tests/shell/lib/attr.py b/tools/perf/tests/shell/li= b/attr.py index 3bf07d4df95987d8..ee78c912d94693dd 100644 --- a/tools/perf/tests/shell/lib/attr.py +++ b/tools/perf/tests/shell/lib/attr.py @@ -209,10 +209,13 @@ class Notest(Exception): return '[%s] \'%s\'' % (self.arch, self.test.path) =20 class Unsup(Exception): - def __init__(self, test): + def __init__(self, test, ret, expected): self.test =3D test + self.ret =3D ret + self.expected =3D expected def getMsg(self): - return '\'%s\'' % self.test.path + return '\'%s\' exit %d, expected %s, likely a missing capability' = % ( + self.test.path, self.ret, self.expected) =20 class Event(dict): terms =3D [ @@ -425,13 +428,17 @@ class Test(object): =20 def skip_test_kernel_since(self): if not self.kernel_since: - return False - return not self.kernel_since <=3D parse_version(platform.release()) + return None + if self.kernel_since <=3D parse_version(platform.release()): + return None + return "kernel older than %d.%d" % tuple(self.kernel_since) =20 def skip_test_kernel_until(self): if not self.kernel_until: - return False - return not parse_version(platform.release()) < self.kernel_until + return None + if parse_version(platform.release()) < self.kernel_until: + return None + return "kernel newer than %d.%d" % tuple(self.kernel_until) =20 def skip_test_auxv(self): def new_auxv(a, pattern): @@ -447,18 +454,20 @@ class Test(object): return (items[0], value) =20 if not self.auxv: - return False + return None auxv =3D subprocess.check_output("LD_SHOW_AUXV=3D1 sleep 0", shell= =3DTrue) \ .decode(sys.stdout.encoding) pattern =3D re.compile(r"[: ]+") auxv =3D dict([new_auxv(a, pattern) for a in auxv.splitlines()]) - return not eval(self.auxv) + if eval(self.auxv): + return None + + return "the auxv condition doesn't hold here" =20 def skip_test_arch(self, myarch): # If architecture not set always run test if self.arch =3D=3D '': - # log.warning("test for arch %s is ok" % myarch) - return False + return None =20 # Allow multiple values in assignment separated by ',' arch_list =3D self.arch.split(',') @@ -468,24 +477,23 @@ class Test(object): arch_list[0] =3D arch_list[0][1:] log.warning("excluded architecture list %s", arch_list) for arch_item in arch_list: - # log.warning("test for %s arch is %s" % (arch_item, myarc= h)) if arch_item =3D=3D myarch: - return True - return False + return "arch =3D %s, machine =3D %s" % (self.arch, mya= rch) + return None =20 for arch_item in arch_list: - # log.warning("test for architecture '%s' current '%s'" % (arc= h_item, myarch)) if arch_item =3D=3D myarch: - return False - return True + return None + + return "arch =3D %s, machine =3D %s" % (self.arch, myarch) =20 def skip_test_requires(self): for requirement in filter(None, map(str.strip, self.requires.split= (','))): if requirement =3D=3D 'core-pmu' and not core_pmu_available(): log.warning("test limitation 'requires %s'", requirement) - return True + return "needs a core PMU, none here" =20 - return False + return None =20 def restore_sample_rate(self, value=3D10000): try: @@ -529,20 +537,36 @@ class Test(object): def run_cmd(self, tempdir): _junk1, _junk2, _junk3, _junk4, myarch =3D (os.uname()) =20 - if self.skip_test_arch(myarch): - raise Notest(self, myarch) - - if self.skip_test_auxv(): - raise Notest(self, "auxv skip") - - if self.skip_test_kernel_since(): - raise Notest(self, "old kernel skip") - - if self.skip_test_kernel_until(): - raise Notest(self, "new kernel skip") - - if self.skip_test_requires(): - raise Notest(self, "requirements skip") + arch =3D self.skip_test_arch(myarch) + if arch: + log.debug(" detail: the test file has arch =3D %s, the machin= e reports %s", + self.arch, myarch) + raise Notest(self, arch) + + auxv =3D self.skip_test_auxv() + if auxv: + log.debug(" detail: the auxv condition %s doesn't hold, the b= its come " + "from the LD_SHOW_AUXV=3D1 output", self.auxv) + raise Notest(self, auxv) + + kernel =3D self.skip_test_kernel_since() + if kernel: + log.debug(" detail: the test file's kernel_since =3D %d.%d, t= his kernel is %s", + self.kernel_since[0], self.kernel_since[1], platform.= release()) + raise Notest(self, kernel) + + kernel =3D self.skip_test_kernel_until() + if kernel: + log.debug(" detail: the test file's kernel_until =3D %d.%d, t= his kernel is %s", + self.kernel_until[0], self.kernel_until[1], platform.= release()) + raise Notest(self, kernel) + + requirement =3D self.skip_test_requires() + if requirement: + log.debug(" detail: requires core-pmu, nothing countable here= , check " + "kernel.perf_event_paranoid and the PMU nodes under " + "/sys/bus/event_source/") + raise Notest(self, requirement) =20 self.restore_sample_rate() cmd =3D "PERF_TEST_ATTR=3D%s %s %s -o %s/perf.data %s" % (tempdir, @@ -552,10 +576,16 @@ class Test(object): log.info(" '%s' ret '%s', expected '%s'", cmd, str(ret), str(self= .ret)) =20 if not data_equal(str(ret), str(self.ret)): + plain_cmd =3D "%s %s %s" % (self.perf, self.command, + self.args.split('>/dev/null')[0].rst= rip()) if self.test_ret: raise Fail(self, "Perf exit code failure") else: - raise Unsup(self) + log.debug(" detail: '%s' exited with %d, the expectations= want the " + "workload's %s exit, so there are no attrs record= ed to " + "verify; this is normally a capability problem, r= un '%s' " + "to see why", plain_cmd, ret, self.ret, plain_cmd) + raise Unsup(self, ret, str(self.ret)) =20 def drop_dummy_tracking_events(self): """ --=20 2.55.0 From nobody Sat Oct 24 13:19:52 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 27F9E54CF68; Tue, 13 Oct 2026 20:15:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922513; cv=none; b=lACf+SnQptRtLPX1+O6dyKS8ZTiPTE+DYv9GW2P4OtTvXeKuZbRul+yEimxFHfmCHdnUpXMDzr1IAwAIWv3jpeNBHXk670s7QvIm2AVGbtCIBx+Nyu00lAsa2U9Z43j4hoHaHqDcW/8ba671N9xOEHjMFrTZym4A70bpqZQ1Syg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922513; c=relaxed/simple; bh=hB2DB9kzoRBu9oabdQ9udatPxaLJPNfl4WMCwmPilQA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Hk7IA9XTG8+Emk4qrAIW5SyMh7HlkLlhZloQiLoWZzIHvqRb3xZH2oVKWCJvwK2xPusxy6+8AbtRhCzhVOzMk7Ic+Qfz3AGPMTEj6hP9Z+aAXTcnSm0wZPNBjTBoDj3kBT3UW5NODULtCwGPCjgifqU5xAAJuoIbGpCWR9ARKdw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=lUVpjsbB; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="lUVpjsbB" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 433501F000FF; Tue, 13 Oct 2026 20:15:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1791922509; bh=SUOrTUSolageUUp0dKPh8t9keZKbictt5j8UHY6pocI=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=lUVpjsbBSYh0N+xU6klsGxWN/vH1057aFgopJJQ9cNEggKEBCKqTwBx8jHksqlrMz wWRvnR2s0onSUjAJ8OYHLfixNEPdFK8TOT0mT+0HX2rnuWp+eDRDFCQQ5aP61rbHGn NcZEY4aBlLcRRxZV3bwW4ffEnil3lfpp+3c+GknblnisZ8K2juHbx4UjlHW85Eq+gy +cTj3jVWlo2wrTIWSm3FCjUQ5lt3PH6Lw5c7zix6cb3Y8z5OhiXxhojk2O0CC3EWlh y5efzrE+gzv7c+JThT6xOhJlnjYdTBIHSIBAPmAV+7Kr62MBzItHnVUpVX5gsGOVlG NNHfgso4P6c2Q== From: Arnaldo Carvalho de Melo To: Namhyung Kim Cc: Ingo Molnar , Thomas Gleixner , James Clark , Jiri Olsa , Ian Rogers , Adrian Hunter , Clark Williams , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v2 15/19] perf tests: Introduce a 'needs_mlock' suite flag Date: Tue, 13 Oct 2026 17:14:10 -0300 Message-ID: <20261013201415.36428-16-acme@kernel.org> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20261013201415.36428-1-acme@kernel.org> References: <20261013201415.36428-1-acme@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arnaldo Carvalho de Melo Each perf instance maps one ring buffer per CPU, all charged to the same per user budget set in kernel.perf_event_mlock_kb, so suites that map them need to be told apart from the ones that don't, to later have them take turns using that budget while the other tests keep running in parallel. Add the flag to 'struct test_suite' and a DEFINE_SUITE_NEEDS_MLOCK() variant for the suites using the DEFINE_SUITE() form. Shell tests run perf, that maps ring buffers, so they are taken to need room in that budget by default; the ones that don't map them waive it in the requisites, a comma separated list in the parens ending their description line, e.g.: # perf stat tests (no_mlock) "exclusive" is the catch-all that keeps a test from running alongside any other, so it runs alone, in sequence, and implies every other requisite, "no_mlock" waives the default, and more keywords are to come, each stating what a test needs, till the catch-all isn't needed anymore. 'perf test requisites' lists what each test needs, reusing the listing routine and taking the same test name fragments and numbers as 'list'. Assisted-by: LLM Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/Documentation/perf-test.txt | 28 +++++++++++++-- tools/perf/tests/builtin-test.c | 44 +++++++++++++++++++++--- tools/perf/tests/tests-scripts.c | 47 ++++++++++++++++++++++---- tools/perf/tests/tests.h | 17 ++++++++++ 4 files changed, 122 insertions(+), 14 deletions(-) diff --git a/tools/perf/Documentation/perf-test.txt b/tools/perf/Documentat= ion/perf-test.txt index 859df74e62efc4b1..d3a7f7efaec705ed 100644 --- a/tools/perf/Documentation/perf-test.txt +++ b/tools/perf/Documentation/perf-test.txt @@ -8,7 +8,7 @@ perf-test - Runs sanity tests. SYNOPSIS -------- [verse] -'perf test [] [{list |[|= ]}]' +'perf test [] [{list|requisites} []|[|]]' =20 DESCRIPTION ----------- @@ -18,9 +18,31 @@ also will look for a directory with more tests in the fo= rm of scripts. To get a list of available tests use 'perf test list', specifying a test n= ame fragment will show all tests that have it. =20 +To get a list of what the tests need, i.e. of their requisites (see below)= , use +'perf test requisites', that takes the same test name fragments and number= s as +'list'. + To run just specific tests, inform test name fragments or the numbers obta= ined from 'perf test list'. =20 +REQUISITES +---------- +Shell tests run perf, that maps ring buffers, so they are taken to need ro= om +in the per user budget set in kernel.perf_event_mlock_kb, shared by the te= sts +running at the same time, that take turns using it. Tests state what they +need, or waive, in a comma separated list in the parens ending their +description line, e.g.: + + # perf stat tests (no_mlock) + +"exclusive" is a catch-all: the test can't run alongside any other one, so +it runs alone, in sequence, and implies every other requisite. "no_mlock" +waives the default, for tests that don't map ring buffers. More keywords +are to come, each stating what a test needs, till the catch-all isn't need= ed +anymore. + +Use 'perf test requisites' to list what each test needs. + OPTIONS ------- -s:: @@ -36,8 +58,8 @@ OPTIONS =20 -S:: --sequential:: - Run all tests one after the other. By default "exclusive" - tests are run sequentially, but other tests are run in + Run all tests one after the other. By default the tests asking to be + "exclusive" (see REQUISITES) run sequentially, but other tests run in parallel to speed execution. =20 -r:: diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-tes= t.c index 98134b1c74cf80f4..acffa0d0d33d6d30 100644 --- a/tools/perf/tests/builtin-test.c +++ b/tools/perf/tests/builtin-test.c @@ -56,6 +56,8 @@ static struct strbuf junit_xml_buf =3D STRBUF_INIT; static bool dont_fork; /* Fork the tests in parallel and wait for their completion. */ static bool sequential; +/* List what each test needs, set by the "requisites" subcommand. */ +static bool list_requisites; /* Number of times each test is run. */ static unsigned int runs_per_test =3D 1; /* Number of lines to include in failure snippet. */ @@ -283,6 +285,30 @@ static const char *test_description(const struct test_= suite *t, int test_case) return t->desc; } =20 +static void requisites__fprintf(FILE *fp, const struct test_suite *t, int = test_case) +{ + bool needs_mlock =3D t->needs_mlock, exclusive; + + if (test_case < 0) + test_case =3D test_suite__num_test_cases(t) =3D=3D 1 ? 0 : -1; + + if (test_case >=3D 0) { + exclusive =3D t->test_cases[test_case].exclusive; + /* The catch-all implies every other requisite. */ + needs_mlock =3D needs_mlock || exclusive; + } else { + exclusive =3D false; + } + + if (!exclusive && !needs_mlock) + return; + + fprintf(fp, " ("); + if (exclusive) + fprintf(fp, "exclusive, "); + fprintf(fp, "mlock)"); +} + static test_fnptr test_function(const struct test_suite *t, int test_case) { if (test_case <=3D 0) @@ -1450,14 +1476,20 @@ static int perf_test__list(FILE *fp, struct test_su= ite **suites, int argc, const if (!perf_test__matches(test_description(*t, -1), curr_suite, argc, argv= )) continue; =20 - fprintf(fp, "%3d: %s\n", curr_suite + 1, test_description(*t, -1)); + fprintf(fp, "%3d: %s", curr_suite + 1, test_description(*t, -1)); + if (list_requisites) + requisites__fprintf(fp, *t, /*test_case=3D*/-1); + fprintf(fp, "\n"); =20 if (test_suite__num_test_cases(*t) <=3D 1) continue; =20 test_suite__for_each_test_case(*t, curr_test_case) { - fprintf(fp, "%3d.%1d: %s\n", curr_suite + 1, curr_test_case + 1, + fprintf(fp, "%3d.%1d: %s", curr_suite + 1, curr_test_case + 1, test_description(*t, curr_test_case)); + if (list_requisites) + requisites__fprintf(fp, *t, curr_test_case); + fprintf(fp, "\n"); } } return 0; @@ -1747,7 +1779,8 @@ static struct test_suite **build_suites(void) int cmd_test(int argc, const char **argv) { const char *test_usage[] =3D { - "perf test [] [{list |[= |]}]", + "perf test [] [{list|requisites} []|" + "[|]]", NULL, }; const char *skip =3D NULL; @@ -1776,7 +1809,7 @@ int cmd_test(int argc, const char **argv) "Generate junit XML output, default test.xml", "test.xml"), OPT_END() }; - const char * const test_subcommands[] =3D { "list", NULL }; + const char * const test_subcommands[] =3D { "list", "requisites", NULL }; struct intlist *skiplist =3D NULL; struct test_suite **suites; int ret; @@ -1808,10 +1841,11 @@ int cmd_test(int argc, const char **argv) setvbuf(stdout, NULL, _IONBF, 0); =20 argc =3D parse_options_subcommand(argc, argv, test_options, test_subcomma= nds, test_usage, 0); - if (argc >=3D 1 && !strcmp(argv[0], "list")) { + if (argc >=3D 1 && (!strcmp(argv[0], "list") || !strcmp(argv[0], "requisi= tes"))) { suites =3D build_suites(); if (!suites) return errno ? -errno : -ENOMEM; + list_requisites =3D !strcmp(argv[0], "requisites"); ret =3D perf_test__list(stdout, suites, argc - 1, argv + 1); free(suites); return ret; diff --git a/tools/perf/tests/tests-scripts.c b/tools/perf/tests/tests-scri= pts.c index 0370bc7013737e31..03430cdb9a5cc14c 100644 --- a/tools/perf/tests/tests-scripts.c +++ b/tools/perf/tests/tests-scripts.c @@ -179,6 +179,42 @@ static int shell_test__run(struct test_suite *test, in= t subtest __maybe_unused) return WEXITSTATUS(err) =3D=3D 2 ? TEST_SKIP : TEST_FAIL; } =20 +/* + * The requisites are a comma separated list in the parens ending the + * description line, e.g. "perf stat tests (no_mlock)": "exclusive" is the + * catch-all, implying every other requisite, "no_mlock" waives the defaul= t of + * needing room in the per user budget set in kernel.perf_event_mlock_kb. + */ +static void shell_test__requisites(char *desc, bool *exclusive, bool *need= s_mlock) +{ + char *lparen, *rparen, *requisites; + + /* Only a list closing the description line is taken for requisites. */ + rparen =3D strrchr(desc, ')'); + if (rparen =3D=3D NULL || rparen[1] !=3D '\0') + return; + + lparen =3D strrchr(desc, '('); + if (lparen =3D=3D NULL || lparen > rparen) + return; + + requisites =3D lparen + 1; + *exclusive =3D strstr(requisites, "exclusive") !=3D NULL; + if (*exclusive) { + /* The catch-all implies every other requisite. */ + *needs_mlock =3D true; + } else if (strstr(requisites, "no_mlock")) { + *needs_mlock =3D false; + } else if (!strstr(requisites, "mlock")) { + /* Unknown requisite: leave the parens in the description. */ + return; + } + + *lparen =3D '\0'; + if (lparen > desc && isspace(lparen[-1])) + lparen[-1] =3D '\0'; +} + static void append_script(int dir_fd, const char *name, char *desc, struct test_suite ***result, size_t *result_sz) @@ -187,7 +223,8 @@ static void append_script(int dir_fd, const char *name,= char *desc, struct test_suite *test_suite, **result_tmp; struct test_case *tests; ssize_t len; - char *exclusive; + /* Shell tests run perf, that maps ring buffers, so they need the budget.= */ + bool exclusive =3D false, needs_mlock =3D true; =20 snprintf(link, sizeof(link), "/proc/%d/fd/%d", getpid(), dir_fd); len =3D readlink(link, filename, sizeof(filename) - 1); @@ -204,11 +241,8 @@ static void append_script(int dir_fd, const char *name= , char *desc, return; } tests[0].name =3D strdup_check(name); - exclusive =3D strstr(desc, " (exclusive)"); - if (exclusive !=3D NULL) { - tests[0].exclusive =3D true; - exclusive[0] =3D '\0'; - } + shell_test__requisites(desc, &exclusive, &needs_mlock); + tests[0].exclusive =3D exclusive; tests[0].desc =3D strdup_check(desc); tests[0].run_case =3D shell_test__run; test_suite =3D zalloc(sizeof(*test_suite)); @@ -220,6 +254,7 @@ static void append_script(int dir_fd, const char *name,= char *desc, test_suite->desc =3D desc; test_suite->test_cases =3D tests; test_suite->priv =3D strdup_check(filename); + test_suite->needs_mlock =3D needs_mlock; /* Realloc is good enough, though we could realloc by chunks, not that * anyone will ever measure performance here */ result_tmp =3D realloc(*result, (*result_sz + 1) * sizeof(*result_tmp)); diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h index f379620069d34f3a..5982c4e62cd37206 100644 --- a/tools/perf/tests/tests.h +++ b/tools/perf/tests/tests.h @@ -46,6 +46,12 @@ struct test_suite { struct test_case *test_cases; void *priv; int (*setup)(struct test_suite *suite); + /* + * Set for the suites mapping perf ring buffers, that need room in the + * per user budget set in kernel.perf_event_mlock_kb, see + * shell_test__requisites() for the shell suites. + */ + bool needs_mlock; }; =20 #define DECLARE_SUITE(name) \ @@ -103,6 +109,17 @@ struct test_suite { .test_cases =3D tests__##_name, \ } =20 +#define DEFINE_SUITE_NEEDS_MLOCK(description, _name) \ + struct test_case tests__##_name[] =3D { \ + TEST_CASE(description, _name), \ + { .name =3D NULL, } \ + }; \ + struct test_suite suite__##_name =3D { \ + .desc =3D description, \ + .test_cases =3D tests__##_name, \ + .needs_mlock =3D true, \ + } + /* Tests */ DECLARE_SUITE(vmlinux_matches_kallsyms); DECLARE_SUITE(openat_syscall_event); --=20 2.55.0 From nobody Sat Oct 24 13:19:52 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1FED75437F1; Tue, 13 Oct 2026 20:15:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922514; cv=none; b=qX3IyKdFBCkjFjjunkWXubk2TzUuVK3jiXGhSf01C5JgXLHk+QSyWgJClofIFb1LzsHAJ/CtalUxKQ0m0qh+W5Yk+sDUiYWLvV6wMgkTHcRex4xZaQ+Fi2OQ9qDiMdqRfjL1GmfGUvYLjzjmugeY0oYKW83wfyarcypc60uboTU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922514; c=relaxed/simple; bh=v4ExAQ1ys6sFCnFEXdwWFegUC+svoGuSzL/Juygp1O0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=W1pR+RG06RLDVEUql9FCCHBtDG9KfmO4hFhEbSKnQ9z0irESCXZPrxBwACv9B7DhePCoUYTpDLolRdXDs5V+c2glChhpYyMB6s/HtvDvpnX99mArJbZloaTY6NjHgrgOScM1fg/hEL8T6iZoV+6IcExI8NzVtIc6yaxnw/g4IHc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=GptN9f0R; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="GptN9f0R" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 18A7D1F00893; Tue, 13 Oct 2026 20:15:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1791922512; bh=je6B2bmfWa+j+yEFsXQ/4UZ8t6eGtjdyakVUMjvqZJs=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=GptN9f0R37BxJw5GlW9XAjIfuPTr7hV9Zrct9wyxNBQWTnO99O+QEW17AQ4a1Uvce Rc2xEBCrOrmI7UycDKt2SovD/xcV50ORAQB9ZcV+n1ZHo7tJGJlsUm3IHGhHOmXM23 tBveTVkrG2z2fge8zorBAxE5enn4fy9xam34axqu7EcpGcgJn8t8HNLIe5YCfm/AjT RO2O46pd+RZuNneqiX2+iPR3n4diXhgIuEnOO5prGyOBYJHe5BW8YvZ2iPt9nSIx7C UE8G+ed1PpQDCMEJHdAVgAEEnXUjvLFPNJaekivaJpVV98YuQWrpKEARr4OCrexM2y mhpcwYDxwbf6Q== From: Arnaldo Carvalho de Melo To: Namhyung Kim Cc: Ingo Molnar , Thomas Gleixner , James Clark , Jiri Olsa , Ian Rogers , Adrian Hunter , Clark Williams , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v2 16/19] perf mutex: Add a robust, process-shared mutex initializer Date: Tue, 13 Oct 2026 17:14:11 -0300 Message-ID: <20261013201415.36428-17-acme@kernel.org> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20261013201415.36428-1-acme@kernel.org> References: <20261013201415.36428-1-acme@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arnaldo Carvalho de Melo A mutex held by a process that can die before unlocking it, like the tests forked by 'perf test' that will take turns using the per user budget set in kernel.perf_event_mlock_kb, has to be taken over by the next locker instead of staying locked forever. Robust mutexes, on top of the kernel's robust futexes, do that: when an owner dies while holding it the kernel marks the futex word owner-died and the next pthread_mutex_lock() returns EOWNERDEAD, then mutex_lock() makes it consistent and takes it over. Add mutex_init_pshared_robust(), returning false when robust mutexes aren't available: from libcs without the API, gated by a feature check, to musl and glibc refusing them at runtime, when get_robust_list(2) or set_robust_list(2) aren't usable. glibc only sets a flag in pthread_mutexattr_setrobust(), refusing the mutex itself in pthread_mutex_init() with ENOTSUP instead. Neither is an error, so nothing is printed about them. Assisted-by: LLM Signed-off-by: Arnaldo Carvalho de Melo --- tools/build/Makefile.feature | 1 + tools/build/feature/Makefile | 4 + tools/build/feature/test-all.c | 5 ++ .../build/feature/test-pthread-mutex-robust.c | 19 ++++ tools/perf/Makefile.config | 4 + tools/perf/util/mutex.c | 86 ++++++++++++++++--- tools/perf/util/mutex.h | 5 ++ 7 files changed, 112 insertions(+), 12 deletions(-) create mode 100644 tools/build/feature/test-pthread-mutex-robust.c diff --git a/tools/build/Makefile.feature b/tools/build/Makefile.feature index dbef5b6c4e43c857..4d37d11f674c5bd5 100644 --- a/tools/build/Makefile.feature +++ b/tools/build/Makefile.feature @@ -85,6 +85,7 @@ FEATURE_TESTS_BASIC :=3D \ libcpupower \ pthread-attr-setaffinity-np \ pthread-barrier \ + pthread-mutex-robust \ reallocarray \ stackprotector-all \ timerfd \ diff --git a/tools/build/feature/Makefile b/tools/build/feature/Makefile index 62f9cbf3dee97936..10340a5372242e05 100644 --- a/tools/build/feature/Makefile +++ b/tools/build/feature/Makefile @@ -41,6 +41,7 @@ FILES=3D \ $(foreach arch,$(LIBUNWIND_ARCHS),test-libunwind-$(arch).bin test= -libunwind-debug-frame-$(arch).bin) \ test-pthread-attr-setaffinity-np.bin \ test-pthread-barrier.bin \ + test-pthread-mutex-robust.bin \ test-stackprotector-all.bin \ test-timerfd.bin \ test-babeltrace2-ctf-writer.bin \ @@ -128,6 +129,9 @@ $(OUTPUT)test-pthread-attr-setaffinity-np.bin: $(OUTPUT)test-pthread-barrier.bin: $(BUILD) -lpthread =20 +$(OUTPUT)test-pthread-mutex-robust.bin: + $(BUILD) -lpthread + $(OUTPUT)test-stackprotector-all.bin: $(BUILD) -fstack-protector-all =20 diff --git a/tools/build/feature/test-all.c b/tools/build/feature/test-all.c index 0ee16eccd9e05788..4a6890290f7462a7 100644 --- a/tools/build/feature/test-all.c +++ b/tools/build/feature/test-all.c @@ -90,6 +90,10 @@ # include "test-pthread-barrier.c" #undef main =20 +#define main main_test_pthread_mutex_robust +# include "test-pthread-mutex-robust.c" +#undef main + #define main main_test_scandirat # include "test-scandirat.c" #undef main @@ -167,6 +171,7 @@ int main(int argc, char *argv[]) main_test_zlib(); main_test_pthread_attr_setaffinity_np(); main_test_pthread_barrier(); + main_test_pthread_mutex_robust(); main_test_lzma(); main_test_bpf(); main_test_scandirat(); diff --git a/tools/build/feature/test-pthread-mutex-robust.c b/tools/build/= feature/test-pthread-mutex-robust.c new file mode 100644 index 0000000000000000..33241fbde3eab87f --- /dev/null +++ b/tools/build/feature/test-pthread-mutex-robust.c @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include + +int main(void) +{ + pthread_mutexattr_t attr; + pthread_mutex_t mtx; + + pthread_mutexattr_init(&attr); + pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); + pthread_mutexattr_setrobust(&attr, PTHREAD_MUTEX_ROBUST); + pthread_mutex_init(&mtx, &attr); + pthread_mutex_consistent(&mtx); + pthread_mutex_destroy(&mtx); + pthread_mutexattr_destroy(&attr); + + return 0; +} diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config index cafc7be79643b26c..b4764f69f47f4d8c 100644 --- a/tools/perf/Makefile.config +++ b/tools/perf/Makefile.config @@ -417,6 +417,10 @@ ifeq ($(feature-pthread-barrier), 1) CFLAGS +=3D -DHAVE_PTHREAD_BARRIER endif =20 +ifeq ($(feature-pthread-mutex-robust), 1) + CFLAGS +=3D -DHAVE_PTHREAD_MUTEX_ROBUST +endif + ifndef NO_BIONIC $(call feature_check,bionic) ifeq ($(feature-bionic), 1) diff --git a/tools/perf/util/mutex.c b/tools/perf/util/mutex.c index 7aa1f3f55a7d4089..712fbf839d59085f 100644 --- a/tools/perf/util/mutex.c +++ b/tools/perf/util/mutex.c @@ -17,37 +17,84 @@ static void check_err(const char *fn, int err) =20 #define CHECK_ERR(err) check_err(__func__, err) =20 -static void __mutex_init(struct mutex *mtx, bool pshared, bool recursive) +static bool __mutex_init(struct mutex *mtx, bool pshared, bool recursive, = bool robust) { pthread_mutexattr_t attr; + bool ok =3D false; + int err; =20 - CHECK_ERR(pthread_mutexattr_init(&attr)); + err =3D pthread_mutexattr_init(&attr); + if (err) + goto out; =20 #ifndef NDEBUG /* In normal builds enable error checking, such as recursive usage. */ - CHECK_ERR(pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK)); + err =3D pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK); + if (err) + goto out_destroy; #endif - if (recursive) - CHECK_ERR(pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE)); - if (pshared) - CHECK_ERR(pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED)); - CHECK_ERR(pthread_mutex_init(&mtx->lock, &attr)); - CHECK_ERR(pthread_mutexattr_destroy(&attr)); + if (recursive) { + err =3D pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + if (err) + goto out_destroy; + } + if (pshared) { + err =3D pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); + if (err) + goto out_destroy; + } + if (robust) { +#ifdef HAVE_PTHREAD_MUTEX_ROBUST + err =3D pthread_mutexattr_setrobust(&attr, PTHREAD_MUTEX_ROBUST); + if (err) + goto out_unavailable; +#else + goto out_unavailable; +#endif + } + + err =3D pthread_mutex_init(&mtx->lock, &attr); + if (!err) + ok =3D true; + else if (robust && pshared) + /* + * glibc refuses a robust process shared mutex with ENOTSUP when + * set_robust_list(2) isn't usable, i.e. when the machine provides + * no robust mutexes for the process shared case: an unavailable + * API, not a bad request. + */ + err =3D 0; +out_destroy: + pthread_mutexattr_destroy(&attr); +out: + if (err) + CHECK_ERR(err); + + return ok; + +out_unavailable: + pthread_mutexattr_destroy(&attr); + return false; } =20 void mutex_init(struct mutex *mtx) { - __mutex_init(mtx, /*pshared=3D*/false, /*recursive=3D*/false); + __mutex_init(mtx, /*pshared=3D*/false, /*recursive=3D*/false, /*robust=3D= */false); } =20 void mutex_init_pshared(struct mutex *mtx) { - __mutex_init(mtx, /*pshared=3D*/true, /*recursive=3D*/false); + __mutex_init(mtx, /*pshared=3D*/true, /*recursive=3D*/false, /*robust=3D*= /false); } =20 void mutex_init_recursive(struct mutex *mtx) { - __mutex_init(mtx, /*pshared=3D*/false, /*recursive=3D*/true); + __mutex_init(mtx, /*pshared=3D*/false, /*recursive=3D*/true, /*robust=3D*= /false); +} + +bool mutex_init_pshared_robust(struct mutex *mtx) +{ + return __mutex_init(mtx, /*pshared=3D*/true, /*recursive=3D*/false, /*rob= ust=3D*/true); } =20 void mutex_destroy(struct mutex *mtx) @@ -58,7 +105,22 @@ void mutex_destroy(struct mutex *mtx) void mutex_lock(struct mutex *mtx) NO_THREAD_SAFETY_ANALYSIS { +#ifdef HAVE_PTHREAD_MUTEX_ROBUST + int err =3D pthread_mutex_lock(&mtx->lock); + + /* + * A robust mutex whose owner died while holding it comes back as + * EOWNERDEAD, marked by the kernel: take it over. + */ + if (err =3D=3D EOWNERDEAD) { + pr_debug("mutex: taking over one left by a dead owner\n"); + CHECK_ERR(pthread_mutex_consistent(&mtx->lock)); + } else { + CHECK_ERR(err); + } +#else CHECK_ERR(pthread_mutex_lock(&mtx->lock)); +#endif } =20 void mutex_unlock(struct mutex *mtx) diff --git a/tools/perf/util/mutex.h b/tools/perf/util/mutex.h index 5554937675886ef3..fcac92d307fb7dad 100644 --- a/tools/perf/util/mutex.h +++ b/tools/perf/util/mutex.h @@ -142,6 +142,11 @@ void mutex_init(struct mutex *mtx); void mutex_init_pshared(struct mutex *mtx); /* Initializes a mutex that may be recursively held on the same thread. */ void mutex_init_recursive(struct mutex *mtx); +/* + * As mutex_init_pshared(), plus the robust attribute: a process dying whi= le + * holding it doesn't leave it locked. Returns false when not available. + */ +bool mutex_init_pshared_robust(struct mutex *mtx); void mutex_destroy(struct mutex *mtx); =20 void mutex_lock(struct mutex *mtx) EXCLUSIVE_LOCK_FUNCTION(*mtx); --=20 2.55.0 From nobody Sat Oct 24 13:19:52 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A7DA1550DA3; Tue, 13 Oct 2026 20:15:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922518; cv=none; b=gDlwcR0cNMDCLZEVC69/luA0MiEsuMOG49OniG00s8cnBEWo4a3lehx5O1CaOI2taeUBQbCZOR61yCcusKsSzC2RkiuDal5lgprZeL39RjruiAMYwoI6XcAby6MBf9eeewaoqwyANpE6Ns8+/j7POb5RkE35gCyQj4IuH8lOiAM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922518; c=relaxed/simple; bh=LvIIektRJ6zWQgpnDbNNAGO7y+H0AlXggVtf1PrEIr8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sCJSOecg6+3Ue8dg+XSrR4EmAkkyYuQeMPh2OI4EdS+SeEfM83Yw4LQ5HWD++vtLPCTpgLeQGPypT+DMKJL7pb86GsRFDEJwk4/fk/FdynUtfXPC2XOZVInu7GpgZ6tcT6m1Gq4g3yhdwmQwoCRcq9RUi2ee7G+ICzxu62ghkNU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=mkQ8rIt6; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="mkQ8rIt6" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E35DD1F00898; Tue, 13 Oct 2026 20:15:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1791922515; bh=4AkBF9FQzFUndSNeNoNZVnCsbgmV4lpHBU2ylSj82H0=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=mkQ8rIt6u6IPoAOpLtPDE8r6GQBSTXqJfD+U2TRpSzDc8M+4Yz8nKKpPGf370yo0z pvJ7WKlkLK9QliOZRSOZhY1LF9RnW7hF5owGWvLZ5hpANDGNcpSAy+8pwHAzriBmu+ LUWjQbW9ntz3Xd1ldQ9Vg4tgKnF2gimadGOB4Lbh2mTESGJxcHtdCnRgQtKoWo/KTM PJVCXZvW9I5ZOxDsZ8Z/2EYOG1O3zDylwTNIyL5DzwDMVflw5hvGH4Wash/MgE4eIk UfqVv47h1D5o9zOU6d8elcFqK77T9hfWHB/4R7C6kfK0d/qxH2N4IecJ45ea98j5kO 6/yG9Kr/8YVAw== From: Arnaldo Carvalho de Melo To: Namhyung Kim Cc: Ingo Molnar , Thomas Gleixner , James Clark , Jiri Olsa , Ian Rogers , Adrian Hunter , Clark Williams , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v2 17/19] perf test: Take turns using the perf mlock budget in the mmaping tests Date: Tue, 13 Oct 2026 17:14:12 -0300 Message-ID: <20261013201415.36428-18-acme@kernel.org> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20261013201415.36428-1-acme@kernel.org> References: <20261013201415.36428-1-acme@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arnaldo Carvalho de Melo The mmap size used when none is asked for is derived from kernel.perf_event_mlock_kb itself (see perf_event_mlock_kb_in_pages()), that after rounding down to a power of two number of pages ends up being about all of a single CPU's share of that per user budget, so with 'perf test' starting all the selected tests at once, any further mapping done while another test still has its ring buffers mapped fails with: Permission error mapping pages. Consider increasing /proc/sys/kernel/perf_event_mlock_kb, or try again with a smaller value of -m/--mmap_pages. that then shows up as a failure or, worse, as an "unsupp" skip in tests like the attr ones, i.e. as a false pass. Instead of making those tests exclusive, which would serialize them against every other test, keep them running in parallel with the tests that don't map ring buffers and have them take turns using the budget, via a robust, process-shared mutex (see mutex_init_pshared_robust()) in a MAP_SHARED|MAP_ANONYMOUS area that is inherited by the forked test processes: a test killed by a signal doesn't leave the budget locked, the kernel marks the mutex owner-died and the next locker takes it over. Perf's struct mutex is used, so the lock discipline is checked in clang builds via -Wthread-safety; as the thread safety analysis can't verify conditionally held locks, the tests that map ring buffers run through a helper taking the mutex unconditionally around the test function call. Robust mutexes aren't always available, at build time or, as glibc and musl can do when get_robust_list(2)/set_robust_list(2) aren't usable, at run time: in that case the budget is not shared and the tests run as before, failing or skipping on starvation instead of hanging on a lock left behind by a test killed by a signal. The area is shared by the tests of one 'perf test' invocation only: a second invocation running at the same time maps its own, so the two don't take turns with each other. The sysctl is left alone. Growing it, to leave room for whatever else the user has running, would need the original value shared between the invocations, so that the last one out puts it back, and it only helps a user who can write the sysctl but lacks CAP_IPC_LOCK, the one capability that lifts the limit. None of this is done when just one of the selected tests maps ring buffers, as there is nothing to share the budget with in that case. Assisted-by: LLM Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/tests/builtin-test.c | 94 ++++++++++++++++++++++++++++++++- 1 file changed, 93 insertions(+), 1 deletion(-) diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-tes= t.c index acffa0d0d33d6d30..8d6e652d3af25afe 100644 --- a/tools/perf/tests/builtin-test.c +++ b/tools/perf/tests/builtin-test.c @@ -32,6 +32,9 @@ #include #include =20 +#include +#include + #include "builtin.h" #include "color.h" #include "config.h" @@ -42,6 +45,7 @@ #include "symbol.h" #include "tests-scripts.h" #include "tests.h" +#include "util/mutex.h" #include "util/rlimit.h" #include "util/strbuf.h" #include "util/term.h" @@ -62,6 +66,17 @@ static bool list_requisites; static unsigned int runs_per_test =3D 1; /* Number of lines to include in failure snippet. */ static unsigned int failure_snippet_lines =3D 10; +/* + * The tests mapping ring buffers take turns using their share of + * kernel.perf_event_mlock_kb via this mutex, shared with the forked test + * processes and robust so that a test killed while holding it doesn't lea= ve + * the budget locked, see mutex_init_pshared_robust(). + */ +struct mlock_budget { + struct mutex lock; +}; + +static struct mlock_budget *mlock_budget; const char *dso_to_test; const char *test_objdump_path =3D "objdump"; static const char *workload_control; @@ -378,12 +393,30 @@ static void child_test_sig_handler(int sig) siglongjmp(run_test_jmp_buf, sig); } =20 +static int run_test_case(struct child_test *child) +{ + return test_function(child->test, child->test_case_num)(child->test, chil= d->test_case_num); +} + +/* The thread safety analysis can't express a lock held conditionally. */ +static int run_test_case_mlocked(struct child_test *child) +{ + int err; + + mutex_lock(&mlock_budget->lock); + err =3D run_test_case(child); + mutex_unlock(&mlock_budget->lock); + + return err; +} + static int run_test_child(struct child_process *process) { const int signals[] =3D { SIGABRT, SIGBUS, SIGFPE, SIGILL, SIGINT, SIGPIPE, SIGQUIT, SIGSEGV, SIGT= ERM, }; struct child_test *child =3D container_of(process, struct child_test, pro= cess); + bool needs_mlock =3D mlock_budget && child->test->needs_mlock; int err; =20 close_parent_fds(); @@ -400,7 +433,12 @@ static int run_test_child(struct child_process *proces= s) =20 pr_debug("---- start ----\n"); pr_debug("test child forked, pid %d\n", getpid()); - err =3D test_function(child->test, child->test_case_num)(child->test, chi= ld->test_case_num); + + if (needs_mlock) + err =3D run_test_case_mlocked(child); + else + err =3D run_test_case(child); + pr_debug("---- end(%d) ----\n", err); =20 check_leaks(); @@ -1776,6 +1814,59 @@ static struct test_suite **build_suites(void) #undef for_each_suite } =20 +static bool perf_test__shares_mlock_budget(struct test_suite **suites, int= argc, + const char *argv[], struct intlist *skiplist) +{ + int sharing =3D 0; + + /* Nothing to share the budget with if just one test maps ring buffers. */ + for (int curr_suite =3D 0; suites[curr_suite]; curr_suite++) { + struct test_suite *t =3D suites[curr_suite]; + int curr_test_case; + bool suite_matched; + + if (!t->needs_mlock || intlist__find(skiplist, curr_suite + 1)) + continue; + + suite_matched =3D perf_test__matches(test_description(t, /*test_case=3D*= /-1), + curr_suite, argc, argv); + test_suite__for_each_test_case(t, curr_test_case) { + if (test_exclusive(t, curr_test_case)) + continue; + + if (suite_matched || + perf_test__matches(test_description(t, curr_test_case), + curr_suite, argc, argv)) + sharing +=3D runs_per_test; + } + if (sharing > 1) + return true; + } + return false; +} + +static void perf_test__setup_mlock_budget(struct test_suite **suites, int = argc, + const char *argv[], struct intlist *skiplist) +{ + /* Nothing runs at the same time, nothing to share the budget with. */ + if (sequential || !perf_test__shares_mlock_budget(suites, argc, argv, ski= plist)) + return; + + mlock_budget =3D mmap(NULL, sizeof(*mlock_budget), PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANONYMOUS, /*fd=3D*/-1, /*offset=3D*/0); + if (mlock_budget =3D=3D MAP_FAILED) { + mlock_budget =3D NULL; + pr_err("Failed to map the shared area used to take turns using the perf = mlock budget\n"); + return; + } + + if (!mutex_init_pshared_robust(&mlock_budget->lock)) { + munmap(mlock_budget, sizeof(*mlock_budget)); + mlock_budget =3D NULL; + pr_debug("Robust mutexes aren't available, not taking turns using the pe= rf mlock budget\n"); + } +} + int cmd_test(int argc, const char **argv) { const char *test_usage[] =3D { @@ -1884,6 +1975,7 @@ int cmd_test(int argc, const char **argv) intlist__delete(skiplist); return err ? -err : -ENOMEM; } + perf_test__setup_mlock_budget(suites, argc, argv, skiplist); ret =3D __cmd_test(suites, argc, argv, skiplist); free(suites); intlist__delete(skiplist); --=20 2.55.0 From nobody Sat Oct 24 13:19:52 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C5D2C5158B6; Tue, 13 Oct 2026 20:15:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922524; cv=none; b=ADgIkc5zxOZk/Zzz+QsBkYmAoEoBKkltJhag4DoQTd0vJ6s3nqHvYBiVSRlG9HAsFVvnUfEP3IWgTqyIy4vfk6Te3r6eE5Esrcl6LBez3xM5vEsR20wCTGMCdqZvgZrWb664kamdCDdRoBXWVjQHgwintGGGF900k0YSo3ltfek= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922524; c=relaxed/simple; bh=iRJ9HE8noqrW28PYTDJ2HxMYxU56nR8+RiAyQWdSljg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=r1dGE0Adnm8W+VLFQuYYgXM3JmZNZxD94J9qBT+BWEf86mQ1c9CU9FcQnAd48nWl+ql+QmerlyTCmxCAxONerss9oJC5KTsIJyzAn5FT16ma5DLClwfqhHc4cqEyHdlW7Cluq3yb8ZkuUCgGoZHI0NkGrW+FrZ0LjxANjwv+3HY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=mJCv1x9q; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="mJCv1x9q" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B9A3B1F00899; Tue, 13 Oct 2026 20:15:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1791922518; bh=a0kj66xrl2sfWln++ekh845XZE9AxjG2ybNI2NnsNpo=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=mJCv1x9qDc6xdP2CLL3cpveT6oOnZjDFlLPG9ZBGjIZI1uFwVHl5oBHodolZrWDod RqwA4oiUi1xeozDxMNWvFjZpxXAW1VwrqZj4l830YD6u1XLN7ECbKospWVWeiwsR6g mgU9HFyVYI8pYaKEMabv+PyH8tFwH9PIfw3nEmRsxeL7EIxvXVTxlMd1wAybw3Uz4/ eDL5gQW2ohVXuZ4Pnns8EP3IBNL9mVEfuAuazuyqNXrbEdMyj6S8j4Az45N2TjTpmD WrUaYymUlVedXb6pUFgYMnNAAbkhwIkOJxAMSy0WCZUbDGHDaHfENLCSsQNPQkieWx RKbyaQ8nbUaqA== From: Arnaldo Carvalho de Melo To: Namhyung Kim Cc: Ingo Molnar , Thomas Gleixner , James Clark , Jiri Olsa , Ian Rogers , Adrian Hunter , Clark Williams , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v2 18/19] perf tests: Mark the C tests mapping perf ring buffers Date: Tue, 13 Oct 2026 17:14:13 -0300 Message-ID: <20261013201415.36428-19-acme@kernel.org> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20261013201415.36428-1-acme@kernel.org> References: <20261013201415.36428-1-acme@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arnaldo Carvalho de Melo The C tests that run 'perf record' in the test process itself map ring buffers and so need room in the per user budget set in kernel.perf_event_mlock_kb: mark them with the new 'needs_mlock' suite flag, see the previous changes, so that they take turns using that budget while the tests that don't map them keep running in parallel. Assisted-by: LLM Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/tests/backward-ring-buffer.c | 2 +- tools/perf/tests/code-reading.c | 2 +- tools/perf/tests/keep-tracking.c | 2 +- tools/perf/tests/mmap-basic.c | 1 + tools/perf/tests/openat-syscall-tp-fields.c | 1 + tools/perf/tests/perf-record.c | 1 + tools/perf/tests/perf-time-to-tsc.c | 1 + tools/perf/tests/sw-clock.c | 2 +- tools/perf/tests/task-exit.c | 1 + 9 files changed, 9 insertions(+), 4 deletions(-) diff --git a/tools/perf/tests/backward-ring-buffer.c b/tools/perf/tests/bac= kward-ring-buffer.c index 2735cc26d7eec3fb..9314696858ff7c84 100644 --- a/tools/perf/tests/backward-ring-buffer.c +++ b/tools/perf/tests/backward-ring-buffer.c @@ -167,4 +167,4 @@ static int test__backward_ring_buffer(struct test_suite= *test __maybe_unused, in return ret; } =20 -DEFINE_SUITE("Read backward ring buffer", backward_ring_buffer); +DEFINE_SUITE_NEEDS_MLOCK("Read backward ring buffer", backward_ring_buffer= ); diff --git a/tools/perf/tests/code-reading.c b/tools/perf/tests/code-readin= g.c index c50b526f44fb523f..130cd6021f930597 100644 --- a/tools/perf/tests/code-reading.c +++ b/tools/perf/tests/code-reading.c @@ -885,4 +885,4 @@ static int test__code_reading(struct test_suite *test _= _maybe_unused, int subtes }; } =20 -DEFINE_SUITE("Object code reading", code_reading); +DEFINE_SUITE_NEEDS_MLOCK("Object code reading", code_reading); diff --git a/tools/perf/tests/keep-tracking.c b/tools/perf/tests/keep-track= ing.c index b760041bed307859..6d8d8cd57200645d 100644 --- a/tools/perf/tests/keep-tracking.c +++ b/tools/perf/tests/keep-tracking.c @@ -161,4 +161,4 @@ static int test__keep_tracking(struct test_suite *test = __maybe_unused, int subte return err; } =20 -DEFINE_SUITE("Use a dummy software event to keep tracking", keep_tracking); +DEFINE_SUITE_NEEDS_MLOCK("Use a dummy software event to keep tracking", ke= ep_tracking); diff --git a/tools/perf/tests/mmap-basic.c b/tools/perf/tests/mmap-basic.c index 5cec7644952c7dba..02cfe8533ac05036 100644 --- a/tools/perf/tests/mmap-basic.c +++ b/tools/perf/tests/mmap-basic.c @@ -448,4 +448,5 @@ static struct test_case tests__basic_mmap[] =3D { struct test_suite suite__basic_mmap =3D { .desc =3D "mmap interface tests", .test_cases =3D tests__basic_mmap, + .needs_mlock =3D true, }; diff --git a/tools/perf/tests/openat-syscall-tp-fields.c b/tools/perf/tests= /openat-syscall-tp-fields.c index 5365889d326f8bc7..1ea336fbc7e7c030 100644 --- a/tools/perf/tests/openat-syscall-tp-fields.c +++ b/tools/perf/tests/openat-syscall-tp-fields.c @@ -160,4 +160,5 @@ static struct test_case tests__syscall_openat_tp_fields= [] =3D { struct test_suite suite__syscall_openat_tp_fields =3D { .desc =3D "syscalls:sys_enter_openat event fields", .test_cases =3D tests__syscall_openat_tp_fields, + .needs_mlock =3D true, }; diff --git a/tools/perf/tests/perf-record.c b/tools/perf/tests/perf-record.c index 0cac6ae1a1fc05ed..370dbde08eac71c3 100644 --- a/tools/perf/tests/perf-record.c +++ b/tools/perf/tests/perf-record.c @@ -372,4 +372,5 @@ static struct test_case tests__PERF_RECORD[] =3D { struct test_suite suite__PERF_RECORD =3D { .desc =3D "PERF_RECORD_* events & perf_sample fields", .test_cases =3D tests__PERF_RECORD, + .needs_mlock =3D true, }; diff --git a/tools/perf/tests/perf-time-to-tsc.c b/tools/perf/tests/perf-ti= me-to-tsc.c index f8f71fdd32b1bfed..0cefa2df2db728f8 100644 --- a/tools/perf/tests/perf-time-to-tsc.c +++ b/tools/perf/tests/perf-time-to-tsc.c @@ -218,4 +218,5 @@ static struct test_case time_to_tsc_tests[] =3D { struct test_suite suite__perf_time_to_tsc =3D { .desc =3D "Convert perf time to TSC", .test_cases =3D time_to_tsc_tests, + .needs_mlock =3D true, }; diff --git a/tools/perf/tests/sw-clock.c b/tools/perf/tests/sw-clock.c index d181858816352c67..1b62dae55f076d30 100644 --- a/tools/perf/tests/sw-clock.c +++ b/tools/perf/tests/sw-clock.c @@ -149,4 +149,4 @@ static int test__sw_clock_freq(struct test_suite *test = __maybe_unused, int subte return ret; } =20 -DEFINE_SUITE("Software clock events period values", sw_clock_freq); +DEFINE_SUITE_NEEDS_MLOCK("Software clock events period values", sw_clock_f= req); diff --git a/tools/perf/tests/task-exit.c b/tools/perf/tests/task-exit.c index 95393edbfe363e5e..9fac426ac2f9eab3 100644 --- a/tools/perf/tests/task-exit.c +++ b/tools/perf/tests/task-exit.c @@ -158,4 +158,5 @@ struct test_case tests__task_exit[] =3D { struct test_suite suite__task_exit =3D { .desc =3D "Number of exit events of a simple workload", .test_cases =3D tests__task_exit, + .needs_mlock =3D true, }; --=20 2.55.0 From nobody Sat Oct 24 13:19:52 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 60F95552921; Tue, 13 Oct 2026 20:15:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922524; cv=none; b=Ff33kwX2d7DkJ0qIgk0o76emwgaXjh6r7fMbJSR7UT5Ih2m9590Qew2zZb/498nRHwDywhms2f7vWnp/TSxPGLzEUVGQZxOuJcse67FwiG3CkqdN2OariAWZ13GAv04B0rLvPrDVYlYYIDNugJ6TrXS0qZNxThDMnlDmziwpkCg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791922524; c=relaxed/simple; bh=XZlzYPgGniMKp24Kvd+5JAayJ8szb88F4vc+5S8MV3M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gWWHW/0aUPP/8eLTBrD0CJoZRSdl0mZFPA1sjpKgLuGnFCuaDaTqKhwx0rX898WLg3WYIoFXr7T9aDL4tmBiE3xa9jIMyfo1ziYTfqI89udzKNmEqnaVPJnID8026OZ950nGVcwIAOEtmMHHP1iIgsXXDhKqI7eb6VqGISl1xIA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=CvG0/8NO; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="CvG0/8NO" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8F6161F000FF; Tue, 13 Oct 2026 20:15:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1791922520; bh=7zfpv4Z2ec7zgASrGoOkbeLPo9a4/lwkfJNsmd5oUgQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=CvG0/8NOfZfmoPk2PrmsrFaHCbDTo/T9ciwJBDUeHNIhGH0ut513Wzf0XUJ98ELBv lwdjAFthY9UhGTE21/IjutBSYDnjgq6iV2pIVHKMuMQh/2Mn7RghYVrTFjnE63/998 xz9qL2Yx0iaT6Rsw7OvO4B7V2k8FCxMLUWgMqgJcIKMPGOjPWGvwwino4duRamHLJi VyDiGk+0cDWpV025aExYlAKEFolZPrDPhXa41IiT9bFCYPrvhrwa7EWSLwR89yV87v WA9FP/0HYCjk2RZroHx1QWySWxaNY+HOTH8kqE3wzWgUdB56c+W0C90nMZDgm9Cg1w OVXss2KMzFdXg== From: Arnaldo Carvalho de Melo To: Namhyung Kim Cc: Ingo Molnar , Thomas Gleixner , James Clark , Jiri Olsa , Ian Rogers , Adrian Hunter , Clark Williams , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v2 19/19] perf tests: Mark the shell tests not mapping perf ring buffers Date: Tue, 13 Oct 2026 17:14:14 -0300 Message-ID: <20261013201415.36428-20-acme@kernel.org> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20261013201415.36428-1-acme@kernel.org> References: <20261013201415.36428-1-acme@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arnaldo Carvalho de Melo Shell tests run perf, that maps ring buffers, so they take a turn using the per user budget in kernel.perf_event_mlock_kb by default, see the previous changes; the ones that don't map them, like the ones running just 'perf stat', say " (no_mlock)" in their description line and thus keep running in parallel with the ones taking turns. The 'perf sched stats' tests are among them, they synthesize the samples from /proc/schedstat without mapping a ring buffer, and the tests already marked " (exclusive)" don't need it, exclusive implies every other requisite and keeps them running alone. Assisted-by: LLM Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/tests/shell/drm_pmu.sh | 2 +- tools/perf/tests/shell/ftrace.sh | 2 +- tools/perf/tests/shell/kallsyms.sh | 2 +- tools/perf/tests/shell/list.sh | 2 +- tools/perf/tests/shell/perf_sched_stats.sh | 2 +- tools/perf/tests/shell/probe_vfs_getname.sh | 2 +- tools/perf/tests/shell/python-use.sh | 2 +- tools/perf/tests/shell/schedstat_snapshots.sh | 2 +- tools/perf/tests/shell/stat+csv_output.sh | 2 +- tools/perf/tests/shell/stat+csv_summary.sh | 2 +- tools/perf/tests/shell/stat+event_uniquifying.sh | 2 +- tools/perf/tests/shell/stat+json_output.sh | 2 +- tools/perf/tests/shell/stat+shadow_stat.sh | 2 +- tools/perf/tests/shell/stat+std_output.sh | 2 +- tools/perf/tests/shell/stat.sh | 2 +- tools/perf/tests/shell/stat_all_metricgroups.sh | 2 +- tools/perf/tests/shell/stat_all_metrics.sh | 2 +- tools/perf/tests/shell/stat_all_pfm.sh | 2 +- tools/perf/tests/shell/stat_bpf_counters_cgrp.sh | 2 +- tools/perf/tests/shell/stat_metrics_cgrp.sh | 2 +- tools/perf/tests/shell/stat_metrics_values.sh | 2 +- tools/perf/tests/shell/test_ilist_python.sh | 2 +- tools/perf/tests/shell/test_stat_cpi_python.sh | 2 +- tools/perf/tests/shell/test_test_junit_output.sh | 2 +- tools/perf/tests/shell/test_uprobe_from_different_cu.sh | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/tools/perf/tests/shell/drm_pmu.sh b/tools/perf/tests/shell/drm= _pmu.sh index e629fe0e8463d6cc..c827e613fc66ee0f 100755 --- a/tools/perf/tests/shell/drm_pmu.sh +++ b/tools/perf/tests/shell/drm_pmu.sh @@ -1,5 +1,5 @@ #!/bin/bash -# DRM PMU +# DRM PMU (no_mlock) # SPDX-License-Identifier: GPL-2.0 =20 set -e diff --git a/tools/perf/tests/shell/ftrace.sh b/tools/perf/tests/shell/ftra= ce.sh index 9f6e590f6437b2d9..84d6126bf94d1e61 100755 --- a/tools/perf/tests/shell/ftrace.sh +++ b/tools/perf/tests/shell/ftrace.sh @@ -1,5 +1,5 @@ #!/bin/bash -# perf ftrace tests +# perf ftrace tests (no_mlock) # SPDX-License-Identifier: GPL-2.0 =20 set -e diff --git a/tools/perf/tests/shell/kallsyms.sh b/tools/perf/tests/shell/ka= llsyms.sh index d0eb99753f477f57..e3674cc52b30983f 100755 --- a/tools/perf/tests/shell/kallsyms.sh +++ b/tools/perf/tests/shell/kallsyms.sh @@ -1,5 +1,5 @@ #!/bin/bash -# perf kallsyms tests +# perf kallsyms tests (no_mlock) # SPDX-License-Identifier: GPL-2.0 =20 err=3D0 diff --git a/tools/perf/tests/shell/list.sh b/tools/perf/tests/shell/list.sh index 14a03e0290ed1b4d..d4a0b04154d636f0 100755 --- a/tools/perf/tests/shell/list.sh +++ b/tools/perf/tests/shell/list.sh @@ -1,5 +1,5 @@ #!/bin/bash -# perf list tests +# perf list tests (no_mlock) # SPDX-License-Identifier: GPL-2.0 =20 set -e diff --git a/tools/perf/tests/shell/perf_sched_stats.sh b/tools/perf/tests/= shell/perf_sched_stats.sh index f13eb0a75b76ef5a..4ede9d701630c719 100755 --- a/tools/perf/tests/shell/perf_sched_stats.sh +++ b/tools/perf/tests/shell/perf_sched_stats.sh @@ -1,5 +1,5 @@ #!/bin/sh -# perf sched stats tests +# perf sched stats tests (no_mlock) # SPDX-License-Identifier: GPL-2.0 =20 set -e diff --git a/tools/perf/tests/shell/probe_vfs_getname.sh b/tools/perf/tests= /shell/probe_vfs_getname.sh index c40e5f3f0825b051..43bdd693076b408c 100755 --- a/tools/perf/tests/shell/probe_vfs_getname.sh +++ b/tools/perf/tests/shell/probe_vfs_getname.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Add vfs_getname probe to get syscall args filenames +# Add vfs_getname probe to get syscall args filenames (no_mlock) # SPDX-License-Identifier: GPL-2.0 # Arnaldo Carvalho de Melo , 2017 =20 diff --git a/tools/perf/tests/shell/python-use.sh b/tools/perf/tests/shell/= python-use.sh index 2d6017d5dd9d9eab..ece4d306869ae48e 100755 --- a/tools/perf/tests/shell/python-use.sh +++ b/tools/perf/tests/shell/python-use.sh @@ -1,5 +1,5 @@ #!/bin/bash -# 'import perf' in python +# 'import perf' in python (no_mlock) # SPDX-License-Identifier: GPL-2.0 # Just test if we can load the python binding. set -e diff --git a/tools/perf/tests/shell/schedstat_snapshots.sh b/tools/perf/tes= ts/shell/schedstat_snapshots.sh index a4bdf2673d43ccc0..2050478e3f1a682f 100755 --- a/tools/perf/tests/shell/schedstat_snapshots.sh +++ b/tools/perf/tests/shell/schedstat_snapshots.sh @@ -1,5 +1,5 @@ #!/bin/sh -# Validate CPU and domain pairing in perf sched stats snapshots +# Validate CPU and domain pairing in perf sched stats snapshots (no_mlock) # SPDX-License-Identifier: GPL-2.0 =20 set -e diff --git a/tools/perf/tests/shell/stat+csv_output.sh b/tools/perf/tests/s= hell/stat+csv_output.sh index a5b34c42e8d72aff..8beb6c674d055a52 100755 --- a/tools/perf/tests/shell/stat+csv_output.sh +++ b/tools/perf/tests/shell/stat+csv_output.sh @@ -1,5 +1,5 @@ #!/bin/bash -# perf stat CSV output linter +# perf stat CSV output linter (no_mlock) # SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) # Tests various perf stat CSV output commands for the # correct number of fields and the CSV separator set to ','. diff --git a/tools/perf/tests/shell/stat+csv_summary.sh b/tools/perf/tests/= shell/stat+csv_summary.sh index 9a4353db3825ede9..6d8beb88fb6f300a 100755 --- a/tools/perf/tests/shell/stat+csv_summary.sh +++ b/tools/perf/tests/shell/stat+csv_summary.sh @@ -1,5 +1,5 @@ #!/bin/bash -# perf stat csv summary test +# perf stat csv summary test (no_mlock) # SPDX-License-Identifier: GPL-2.0 =20 set -e diff --git a/tools/perf/tests/shell/stat+event_uniquifying.sh b/tools/perf/= tests/shell/stat+event_uniquifying.sh index b5dec6b6da369382..f5c6fa30d8db38d1 100755 --- a/tools/perf/tests/shell/stat+event_uniquifying.sh +++ b/tools/perf/tests/shell/stat+event_uniquifying.sh @@ -1,5 +1,5 @@ #!/bin/bash -# perf stat events uniquifying +# perf stat events uniquifying (no_mlock) # SPDX-License-Identifier: GPL-2.0 =20 set -e diff --git a/tools/perf/tests/shell/stat+json_output.sh b/tools/perf/tests/= shell/stat+json_output.sh index 4969ad70b67b6196..cbf7a4ffd7e8ab4f 100755 --- a/tools/perf/tests/shell/stat+json_output.sh +++ b/tools/perf/tests/shell/stat+json_output.sh @@ -1,5 +1,5 @@ #!/bin/bash -# perf stat JSON output linter +# perf stat JSON output linter (no_mlock) # SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) # Checks various perf stat JSON output commands for the # correct number of fields. diff --git a/tools/perf/tests/shell/stat+shadow_stat.sh b/tools/perf/tests/= shell/stat+shadow_stat.sh index cabbbf17c662df23..7a58e1507ce27957 100755 --- a/tools/perf/tests/shell/stat+shadow_stat.sh +++ b/tools/perf/tests/shell/stat+shadow_stat.sh @@ -1,5 +1,5 @@ #!/bin/bash -# perf stat metrics (shadow stat) test +# perf stat metrics (shadow stat) test (no_mlock) # SPDX-License-Identifier: GPL-2.0 =20 set -e diff --git a/tools/perf/tests/shell/stat+std_output.sh b/tools/perf/tests/s= hell/stat+std_output.sh index 64c2b81f02deb18b..b915656a20f69d68 100755 --- a/tools/perf/tests/shell/stat+std_output.sh +++ b/tools/perf/tests/shell/stat+std_output.sh @@ -1,5 +1,5 @@ #!/bin/bash -# perf stat STD output linter +# perf stat STD output linter (no_mlock) # SPDX-License-Identifier: GPL-2.0 # Tests various perf stat STD output commands for # default event and metricgroup diff --git a/tools/perf/tests/shell/stat.sh b/tools/perf/tests/shell/stat.sh index 1f5d4cc05807a247..ac9e031831daca9c 100755 --- a/tools/perf/tests/shell/stat.sh +++ b/tools/perf/tests/shell/stat.sh @@ -1,5 +1,5 @@ #!/bin/bash -# perf stat tests +# perf stat tests (no_mlock) # SPDX-License-Identifier: GPL-2.0 =20 set -e diff --git a/tools/perf/tests/shell/stat_all_metricgroups.sh b/tools/perf/t= ests/shell/stat_all_metricgroups.sh index 81bc7070b5ab0d5c..074a437da0ae3dce 100755 --- a/tools/perf/tests/shell/stat_all_metricgroups.sh +++ b/tools/perf/tests/shell/stat_all_metricgroups.sh @@ -1,5 +1,5 @@ #!/bin/bash -# perf all metricgroups test +# perf all metricgroups test (no_mlock) # SPDX-License-Identifier: GPL-2.0 =20 ParanoidAndNotRoot() diff --git a/tools/perf/tests/shell/stat_all_metrics.sh b/tools/perf/tests/= shell/stat_all_metrics.sh index df5fa27b21ae28d8..9d0d4b8a217e6730 100755 --- a/tools/perf/tests/shell/stat_all_metrics.sh +++ b/tools/perf/tests/shell/stat_all_metrics.sh @@ -1,5 +1,5 @@ #!/bin/bash -# perf all metrics test +# perf all metrics test (no_mlock) # SPDX-License-Identifier: GPL-2.0 =20 ParanoidAndNotRoot() diff --git a/tools/perf/tests/shell/stat_all_pfm.sh b/tools/perf/tests/shel= l/stat_all_pfm.sh index c08c186af2c42e84..78d8006fb729c8f4 100755 --- a/tools/perf/tests/shell/stat_all_pfm.sh +++ b/tools/perf/tests/shell/stat_all_pfm.sh @@ -1,5 +1,5 @@ #!/bin/bash -# perf all libpfm4 events test +# perf all libpfm4 events test (no_mlock) # SPDX-License-Identifier: GPL-2.0 =20 if perf version --build-options | grep HAVE_LIBPFM | grep -q OFF diff --git a/tools/perf/tests/shell/stat_bpf_counters_cgrp.sh b/tools/perf/= tests/shell/stat_bpf_counters_cgrp.sh index febe3af0644157f3..d1b4632c17a3e8e1 100755 --- a/tools/perf/tests/shell/stat_bpf_counters_cgrp.sh +++ b/tools/perf/tests/shell/stat_bpf_counters_cgrp.sh @@ -1,5 +1,5 @@ #!/bin/bash -# perf stat --bpf-counters --for-each-cgroup test +# perf stat --bpf-counters --for-each-cgroup test (no_mlock) # SPDX-License-Identifier: GPL-2.0 =20 set -e diff --git a/tools/perf/tests/shell/stat_metrics_cgrp.sh b/tools/perf/tests= /shell/stat_metrics_cgrp.sh index 0728f48f21fa971d..75b8e01d11cc7ff3 100755 --- a/tools/perf/tests/shell/stat_metrics_cgrp.sh +++ b/tools/perf/tests/shell/stat_metrics_cgrp.sh @@ -1,5 +1,5 @@ #!/bin/bash -# perf stat metrics --for-each-cgroup test +# perf stat metrics --for-each-cgroup test (no_mlock) # SPDX-License-Identifier: GPL-2.0 =20 set -e diff --git a/tools/perf/tests/shell/stat_metrics_values.sh b/tools/perf/tes= ts/shell/stat_metrics_values.sh index 0982f6b9737a780f..3e073a0e5b9f9b99 100755 --- a/tools/perf/tests/shell/stat_metrics_values.sh +++ b/tools/perf/tests/shell/stat_metrics_values.sh @@ -1,5 +1,5 @@ #!/bin/bash -# perf metrics value validation +# perf metrics value validation (no_mlock) # SPDX-License-Identifier: GPL-2.0 =20 shelldir=3D$(dirname "$0") diff --git a/tools/perf/tests/shell/test_ilist_python.sh b/tools/perf/tests= /shell/test_ilist_python.sh index 83048474710d2857..a235539c01767ee5 100755 --- a/tools/perf/tests/shell/test_ilist_python.sh +++ b/tools/perf/tests/shell/test_ilist_python.sh @@ -1,5 +1,5 @@ #!/bin/bash -# perf script ilist and perf list --tui test +# perf script ilist and perf list --tui test (no_mlock) # SPDX-License-Identifier: GPL-2.0 =20 set -e diff --git a/tools/perf/tests/shell/test_stat_cpi_python.sh b/tools/perf/te= sts/shell/test_stat_cpi_python.sh index 6cb376c92e2f13a7..d1571a20f4683d73 100755 --- a/tools/perf/tests/shell/test_stat_cpi_python.sh +++ b/tools/perf/tests/shell/test_stat_cpi_python.sh @@ -1,6 +1,6 @@ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 -# stat-cpi python test +# stat-cpi python test (no_mlock) =20 set -e =20 diff --git a/tools/perf/tests/shell/test_test_junit_output.sh b/tools/perf/= tests/shell/test_test_junit_output.sh index 38a29e646906e3aa..2a3e8a00c48b7d39 100755 --- a/tools/perf/tests/shell/test_test_junit_output.sh +++ b/tools/perf/tests/shell/test_test_junit_output.sh @@ -1,6 +1,6 @@ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 -# perf test junit XML output validation +# perf test junit XML output validation (no_mlock) =20 set -e =20 diff --git a/tools/perf/tests/shell/test_uprobe_from_different_cu.sh b/tool= s/perf/tests/shell/test_uprobe_from_different_cu.sh index 33bf36c4037e45ae..0a02ff9b86d6f326 100755 --- a/tools/perf/tests/shell/test_uprobe_from_different_cu.sh +++ b/tools/perf/tests/shell/test_uprobe_from_different_cu.sh @@ -1,5 +1,5 @@ #!/bin/bash -# test perf probe of function from different CU +# test perf probe of function from different CU (no_mlock) # SPDX-License-Identifier: GPL-2.0 =20 set -e --=20 2.55.0