From nobody Sat Feb 7 12:19:40 2026 Received: from mail-dy1-f202.google.com (mail-dy1-f202.google.com [74.125.82.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8002E36EA8A for ; Sat, 31 Jan 2026 20:02:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769889751; cv=none; b=XYLhSmTTnd24mLZniPtIsbCHzCH7vFDkF6DV8Mw4u1VarODC9rjZOnrbmEX/oVYMFh28Fa+kQhpzSX/L3JYc2+F2WzrIGaSORS54RwWMamVOMhrnc/YnZvFBuEBGA7m7N9LF2HiPIvaa+30H7PlJ2qEHCnR/g5+pu3Cm+DYCUvk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769889751; c=relaxed/simple; bh=K/CPeSJdNznlVRFAe+IRwrvzwNL/FwQ7692V228ImDM=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=MIBCWdJxS6T1BHKZ2JGJ0EI2C3Kv7+kiNUkdP9wskKXK4vIhvjh9V4pTb4x8KWMhGimOeuR/GpDchkLotnExg+1cW+Vk2HFxUGa2A4mDlODWtLw83dsS82SXsJT/cUKudmH98QDq9LdQ4rdC8YorXpRjcNCFKUP1EEPfn4AyQJo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=3pDRCsXB; arc=none smtp.client-ip=74.125.82.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="3pDRCsXB" Received: by mail-dy1-f202.google.com with SMTP id 5a478bee46e88-2b795cff830so849986eec.1 for ; Sat, 31 Jan 2026 12:02:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1769889750; x=1770494550; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=QUC+WDnW7L44j8AWJ3iUoM1jUSgb/IrmAbWsvMnp/cQ=; b=3pDRCsXBHAOuSjCMeU7K6hiY1LaqGX5CYy2SH2q+fpVl9wU02tMa3L2rG1sYiDKprr gPFuBvSF4B784L4+V+mXiw7FKdinuVQe9fiyttRL+U61uww+K7WegsZucprF8rrSEf8I 9xJqExILH+It1v+J3pXIaUu5YcTkPnDG9EAKKd3urb4vaqyzXZ3L9RXZQJ8S7w2JvlMz XyKQTOxF9qf9Czg58VdiRUrnv8x8YuKKVVYjSvVzz6KPV5JfAIFUaqXLymtxjIuNoRck YvaLRKu9Kyyhnyvl2DY7+BwRmsAyAEFpg6LGWijdvHhkqtvsfAXfqXRaaqQ6KJAgnWIF Cv2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769889750; x=1770494550; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=QUC+WDnW7L44j8AWJ3iUoM1jUSgb/IrmAbWsvMnp/cQ=; b=Bx8zDyBQi5NEGgRP7Q8vywGfBbqCtgry8ZDIaorTSMBc6JM265W/vqvhMViYOIVXLe szu5Figb0A0EMXiI0pP3R4CFyNbgcFgNVGWhJPrIW35Sggh+ZdyNcjap7cGp/+NtzuiB 89Hvyjj9813mmE/yxqoK/Kbb0wXzxmnJgGeKyT3XA7Pk77ayENp76Uj8XzMbnD+3Dhd+ xnRtLcxKFrEmBWwR387COvoH8kCNqAxJ/siYH0hdIAbiNFVrqxWJeC99Zvd5+T9HkCzW 5kRjmU/YYR+6E8NBNvc4XWoJIS5QwN5JAJuptHqrRfzST7Vyexz9NfJ78csCUPor6Qxh AkJw== X-Forwarded-Encrypted: i=1; AJvYcCW3olPz8N0fO+CyFVBqRJ6KWTXdHoz4T6z5n76nR4uuV/ADOhRzn0OMhCEd1hlVE4d999HxX5r2bgG9tNY=@vger.kernel.org X-Gm-Message-State: AOJu0YxCWwDLc/19yHajBCUecjMGth1MfyILNXmV7achDqhemBWSYA+T KxhZwnP/e6C7be5T/TsUTtE3McHnPkcO2XwpvGl8ulMjb5AvCRMDMxj1XFUOUrubksnlR1yF+wV k9TofybCs7g== X-Received: from dybpg11.prod.google.com ([2002:a05:7301:414b:b0:2b7:499d:745f]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7301:6095:b0:2b7:2d5e:3f49 with SMTP id 5a478bee46e88-2b7c865542bmr2862726eec.10.1769889749601; Sat, 31 Jan 2026 12:02:29 -0800 (PST) Date: Sat, 31 Jan 2026 12:02:19 -0800 In-Reply-To: <20260131200224.1296136-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260131200224.1296136-1-irogers@google.com> X-Mailer: git-send-email 2.53.0.rc1.225.gd81095ad13-goog Message-ID: <20260131200224.1296136-2-irogers@google.com> Subject: [PATCH v2 1/6] perf test kvm: Add stat live testing From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , John Garry , Will Deacon , Mike Leach , Leo Yan , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti , Shimin Guo , Yunseong Kim , Athira Rajeev , Quan Zhou , Andrew Jones , Anup Patel , Dapeng Mi , Thomas Falcon , Blake Jones , Swapnil Sapkal , Kan Liang , Howard Chu , Anubhav Shelat , Aditya Bodkhe , Chun-Tse Shao , Andi Kleen , Dmitry Vyukov , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-riscv@lists.infradead.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Ensure the `perf kvm stat live -p ..` has some basic functionality. Signed-off-by: Ian Rogers --- tools/perf/tests/shell/kvm.sh | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/tools/perf/tests/shell/kvm.sh b/tools/perf/tests/shell/kvm.sh index 2a399b83fe80..f88e859025c4 100755 --- a/tools/perf/tests/shell/kvm.sh +++ b/tools/perf/tests/shell/kvm.sh @@ -7,9 +7,10 @@ set -e err=3D0 perfdata=3D$(mktemp /tmp/__perf_kvm_test.perf.data.XXXXX) qemu_pid_file=3D$(mktemp /tmp/__perf_kvm_test.qemu.pid.XXXXX) +log_file=3D$(mktemp /tmp/__perf_kvm_test.live_log.XXXXX) =20 cleanup() { - rm -f "${perfdata}" + rm -f "${perfdata}" "${log_file}" if [ -f "${qemu_pid_file}" ]; then if [ -s "${qemu_pid_file}" ]; then qemu_pid=3D$(cat "${qemu_pid_file}") @@ -96,6 +97,32 @@ test_kvm_buildid_list() { echo "perf kvm buildid-list test [Success]" } =20 +test_kvm_stat_live() { + echo "Testing perf kvm stat live" + + # Run perf kvm live for 5 seconds, monitoring that PID + # Use sleep to keep stdin open but silent, preventing EOF loop or interac= tive spam + if ! sleep 10 | timeout 5s perf kvm stat live -p "${qemu_pid}" > "${log_f= ile}" 2>&1; then + retval=3D$? + if [ $retval -ne 124 ] && [ $retval -ne 0 ]; then + echo "perf kvm stat live [Failed: perf kvm stat live failed to start or= run (ret=3D$retval)]" + head -n 50 "${log_file}" + err=3D1 + return + fi + fi + + # Check for some sample data (percentage) + if ! grep -E -q "[0-9]+\.[0-9]+%" "${log_file}"; then + echo "perf kvm stat live [Failed: no sample percentage found]" + head -n 50 "${log_file}" + err=3D1 + return + fi + + echo "perf kvm stat live test [Success]" +} + setup_qemu() { # Find qemu if [ "$(uname -m)" =3D "x86_64" ]; then @@ -148,6 +175,7 @@ if [ $err -eq 0 ]; then test_kvm_stat test_kvm_record_report test_kvm_buildid_list + test_kvm_stat_live fi =20 cleanup --=20 2.53.0.rc1.225.gd81095ad13-goog From nobody Sat Feb 7 12:19:40 2026 Received: from mail-dl1-f74.google.com (mail-dl1-f74.google.com [74.125.82.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F0DAA36F41E for ; Sat, 31 Jan 2026 20:02:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769889757; cv=none; b=bdgrt+3JloV4Rmn/l2R7FyqVskBtQj1VrT8gPNyqZfiYe3qhzV9lRNMCtykv7dtO5QBezKvrKcx9qjhFFLAu+Ni4MelOrZh7VgkJUjPVmj2JyvBvk6gycqOx025ljm1TMN84w2bEAWf4hn23kOmcwmjxtJAQdgQp2wO7CK1dDxQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769889757; c=relaxed/simple; bh=xIzhDh3XBbVYwb46Oz5dBlOzrx8qRC7W41vh0zyPJuA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=okO+J78M39YpLM5fOUgzWfhoqAxGwK4hTnrdbJ9U6j1+M1sNAFU1gfTW2Y3WqdoZYDoNe9fm7wn9V3n5j6kfb6flRXL7Poz3PesLSZvDcPeg6wNo0jfrrqfqy8e8Be1bu6A40kSKe+g3k2XCG2cvLKwdswnYn2IVNvmS0OBK1e8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=DubOenkk; arc=none smtp.client-ip=74.125.82.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="DubOenkk" Received: by mail-dl1-f74.google.com with SMTP id a92af1059eb24-1233b91de6bso5433177c88.1 for ; Sat, 31 Jan 2026 12:02:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1769889753; x=1770494553; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=uRp6DiiGPZIhM1422UhY3Jce2c8k98dzhhyTw8u0Amc=; b=DubOenkkin7uaifKz3zWgufItLWhBnb+8jlcsNzE2XJLIxxvk1e4T0HgO2EIboBkxw JPwVQrqsmqz9TczYMIrDRkj+aIu6+5VPTSQa4lMDuB4XCJTas0XzsERpUZrR+gQDmy98 BAEOp+IK3FCzwISVPKrdRLNvdHhfyUc47Ba/BpWr72TrNas4KUlBQiWaUv68ZJavcd4i DjDOdCbtVurlo5Ms8NvaPaBfFGqOJ3ETNAjJr8uI72q1hGcxxBELlQ7+v+Vyq7I69vTa Zdl8wz2kqb2YaFySW2DfjVk2LqosDkHfze6H7xpWLOVZxpjKojxr/wYJuLSNnssQ64w2 cmOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769889753; x=1770494553; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=uRp6DiiGPZIhM1422UhY3Jce2c8k98dzhhyTw8u0Amc=; b=CvryveeDLQkPQv+Sp+9IzD4wwxqbpn7AOuVU3wfcuGOaGaYeodN6JXcP9gsoOjCrDc 0diiHhlq6gJrDL2enLGTyLlGiruOmUm5kMsqxzqhYPxXsy0KhtEExXlwRR5PIh4+lbam AwfaT5sciWAFG68H0ov7wvDde3+iLeK/N9zt3gjsXmBJB1h0CC/QE/t+KnReOF549OMR RtFCHoldoq32LnVDqKW6bBy1i7CQtw0Zyi0dRnFdNYA+iHX9OSunuP8u2iBKb+8W+9IX kOrHIXvboq3cC5XvHHC/8RzU6V5Ffr6UWGSQ+voY50E7NM0GaN5k/fHoM7qiq9POzr1e YhNw== X-Forwarded-Encrypted: i=1; AJvYcCVFdOuupqKclVUPkbU7y1sT2lNhVPjNUAkJ0n2ow39w6TyRDrvTzQ6Ug4wDEjSjDsg6zPhTcrk3dTH4s6g=@vger.kernel.org X-Gm-Message-State: AOJu0YzbqHiexFR4xCNWDtfINwbD/yNe2HX0683JNqOr3qzoFmMwDQtu cC6sa+Bpt1MzGuwZdnmlDCtaglixjNHB3WcWSELj6Ni/tDES/RjaXQ7FwkUrZ76K+gNal4lSxTj hiyykWUOLJQ== X-Received: from dlii34.prod.google.com ([2002:a05:7022:41a2:b0:11b:65e:f6a]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7022:6b94:b0:11a:e610:ee32 with SMTP id a92af1059eb24-125c0fe0435mr2893700c88.25.1769889752882; Sat, 31 Jan 2026 12:02:32 -0800 (PST) Date: Sat, 31 Jan 2026 12:02:20 -0800 In-Reply-To: <20260131200224.1296136-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260131200224.1296136-1-irogers@google.com> X-Mailer: git-send-email 2.53.0.rc1.225.gd81095ad13-goog Message-ID: <20260131200224.1296136-3-irogers@google.com> Subject: [PATCH v2 2/6] perf kvm stat: Remove use of the arch directory From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , John Garry , Will Deacon , Mike Leach , Leo Yan , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti , Shimin Guo , Yunseong Kim , Athira Rajeev , Quan Zhou , Andrew Jones , Anup Patel , Dapeng Mi , Thomas Falcon , Blake Jones , Swapnil Sapkal , Kan Liang , Howard Chu , Anubhav Shelat , Aditya Bodkhe , Chun-Tse Shao , Andi Kleen , Dmitry Vyukov , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-riscv@lists.infradead.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" `perf kvm stat` supports record and report options. By using the arch directory a report for a different machine type cannot be supported. Move the kvm-stat code out of the arch directory and into util/kvm-stat-arch following the pattern of perf-regs and dwarf-regs. Avoid duplicate symbols by renaming functions to have the architecture name within them. For global variables, wrap them in an architecture specific function. Selecting the architecture to use with `perf kvm stat` is selected by EM_HOST, ie no different than before the change. Later the ELF machine can be determined from the session or a header feature (ie EM_HOST at the time of the record). The build and #define HAVE_KVM_STAT_SUPPORT is now redundant so remove across Makefiles and in the build. Opportunistically constify architectural structs and arrays. Signed-off-by: Ian Rogers --- tools/perf/Makefile.config | 4 - tools/perf/arch/arm64/Makefile | 1 - tools/perf/arch/arm64/util/Build | 1 - tools/perf/arch/loongarch/Makefile | 1 - tools/perf/arch/loongarch/util/Build | 1 - tools/perf/arch/powerpc/Makefile | 1 - tools/perf/arch/powerpc/util/Build | 1 - tools/perf/arch/riscv/Makefile | 1 - tools/perf/arch/riscv/util/Build | 2 - tools/perf/arch/s390/Makefile | 1 - tools/perf/arch/s390/util/Build | 1 - tools/perf/arch/x86/Makefile | 1 - tools/perf/arch/x86/util/Build | 1 - tools/perf/builtin-kvm.c | 37 ++-- tools/perf/util/Build | 3 +- tools/perf/util/kvm-stat-arch/Build | 6 + .../kvm-stat-arch}/arm64_exception_types.h | 0 .../kvm-stat-arch}/book3s_hcalls.h | 0 .../kvm-stat-arch}/book3s_hv_exits.h | 0 .../kvm-stat-arch/kvm-stat-arm64.c} | 43 ++-- .../kvm-stat-arch/kvm-stat-loongarch.c} | 48 ++-- .../kvm-stat-arch/kvm-stat-powerpc.c} | 61 ++--- .../kvm-stat-arch/kvm-stat-riscv.c} | 42 ++-- .../kvm-stat-arch/kvm-stat-s390.c} | 38 ++-- .../kvm-stat-arch/kvm-stat-x86.c} | 44 ++-- .../kvm-stat-arch}/riscv_trap_types.h | 2 +- tools/perf/util/kvm-stat.c | 209 +++++++++++++++++- tools/perf/util/kvm-stat.h | 68 ++++-- 28 files changed, 440 insertions(+), 178 deletions(-) create mode 100644 tools/perf/util/kvm-stat-arch/Build rename tools/perf/{arch/arm64/util =3D> util/kvm-stat-arch}/arm64_exceptio= n_types.h (100%) rename tools/perf/{arch/powerpc/util =3D> util/kvm-stat-arch}/book3s_hcall= s.h (100%) rename tools/perf/{arch/powerpc/util =3D> util/kvm-stat-arch}/book3s_hv_ex= its.h (100%) rename tools/perf/{arch/arm64/util/kvm-stat.c =3D> util/kvm-stat-arch/kvm-= stat-arm64.c} (63%) rename tools/perf/{arch/loongarch/util/kvm-stat.c =3D> util/kvm-stat-arch/= kvm-stat-loongarch.c} (78%) rename tools/perf/{arch/powerpc/util/kvm-stat.c =3D> util/kvm-stat-arch/kv= m-stat-powerpc.c} (78%) rename tools/perf/{arch/riscv/util/kvm-stat.c =3D> util/kvm-stat-arch/kvm-= stat-riscv.c} (58%) rename tools/perf/{arch/s390/util/kvm-stat.c =3D> util/kvm-stat-arch/kvm-s= tat-s390.c} (77%) rename tools/perf/{arch/x86/util/kvm-stat.c =3D> util/kvm-stat-arch/kvm-st= at-x86.c} (88%) rename tools/perf/{arch/riscv/util =3D> util/kvm-stat-arch}/riscv_trap_typ= es.h (96%) diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config index 63ca9b2be663..c7e493245f34 100644 --- a/tools/perf/Makefile.config +++ b/tools/perf/Makefile.config @@ -1033,10 +1033,6 @@ ifndef NO_LIBNUMA endif endif =20 -ifdef HAVE_KVM_STAT_SUPPORT - CFLAGS +=3D -DHAVE_KVM_STAT_SUPPORT -endif - ifeq (${IS_64_BIT}, 1) ifndef NO_PERF_READ_VDSO32 $(call feature_check,compile-32) diff --git a/tools/perf/arch/arm64/Makefile b/tools/perf/arch/arm64/Makefile index 087e099fb453..44cc3f023318 100644 --- a/tools/perf/arch/arm64/Makefile +++ b/tools/perf/arch/arm64/Makefile @@ -1,3 +1,2 @@ # SPDX-License-Identifier: GPL-2.0 PERF_HAVE_JITDUMP :=3D 1 -HAVE_KVM_STAT_SUPPORT :=3D 1 diff --git a/tools/perf/arch/arm64/util/Build b/tools/perf/arch/arm64/util/= Build index 0177af19cc00..d25edd9e1883 100644 --- a/tools/perf/arch/arm64/util/Build +++ b/tools/perf/arch/arm64/util/Build @@ -1,4 +1,3 @@ -perf-util-$(CONFIG_LIBTRACEEVENT) +=3D kvm-stat.o perf-util-$(CONFIG_LOCAL_LIBUNWIND) +=3D unwind-libunwind.o perf-util-y +=3D ../../arm/util/auxtrace.o perf-util-y +=3D ../../arm/util/cs-etm.o diff --git a/tools/perf/arch/loongarch/Makefile b/tools/perf/arch/loongarch= /Makefile index 087e099fb453..44cc3f023318 100644 --- a/tools/perf/arch/loongarch/Makefile +++ b/tools/perf/arch/loongarch/Makefile @@ -1,3 +1,2 @@ # SPDX-License-Identifier: GPL-2.0 PERF_HAVE_JITDUMP :=3D 1 -HAVE_KVM_STAT_SUPPORT :=3D 1 diff --git a/tools/perf/arch/loongarch/util/Build b/tools/perf/arch/loongar= ch/util/Build index 0aa31986ecb5..1cb06a5f8935 100644 --- a/tools/perf/arch/loongarch/util/Build +++ b/tools/perf/arch/loongarch/util/Build @@ -3,4 +3,3 @@ perf-util-y +=3D perf_regs.o =20 perf-util-$(CONFIG_LOCAL_LIBUNWIND) +=3D unwind-libunwind.o perf-util-$(CONFIG_LIBDW_DWARF_UNWIND) +=3D unwind-libdw.o -perf-util-$(CONFIG_LIBTRACEEVENT) +=3D kvm-stat.o diff --git a/tools/perf/arch/powerpc/Makefile b/tools/perf/arch/powerpc/Mak= efile index a295a80ea078..44cc3f023318 100644 --- a/tools/perf/arch/powerpc/Makefile +++ b/tools/perf/arch/powerpc/Makefile @@ -1,3 +1,2 @@ # SPDX-License-Identifier: GPL-2.0 -HAVE_KVM_STAT_SUPPORT :=3D 1 PERF_HAVE_JITDUMP :=3D 1 diff --git a/tools/perf/arch/powerpc/util/Build b/tools/perf/arch/powerpc/u= til/Build index 5fd28ec713a4..e091b6785674 100644 --- a/tools/perf/arch/powerpc/util/Build +++ b/tools/perf/arch/powerpc/util/Build @@ -1,5 +1,4 @@ perf-util-y +=3D header.o -perf-util-$(CONFIG_LIBTRACEEVENT) +=3D kvm-stat.o perf-util-y +=3D perf_regs.o perf-util-y +=3D mem-events.o perf-util-y +=3D pmu.o diff --git a/tools/perf/arch/riscv/Makefile b/tools/perf/arch/riscv/Makefile index 087e099fb453..44cc3f023318 100644 --- a/tools/perf/arch/riscv/Makefile +++ b/tools/perf/arch/riscv/Makefile @@ -1,3 +1,2 @@ # SPDX-License-Identifier: GPL-2.0 PERF_HAVE_JITDUMP :=3D 1 -HAVE_KVM_STAT_SUPPORT :=3D 1 diff --git a/tools/perf/arch/riscv/util/Build b/tools/perf/arch/riscv/util/= Build index 628b9ebd418b..c01231bcf9c3 100644 --- a/tools/perf/arch/riscv/util/Build +++ b/tools/perf/arch/riscv/util/Build @@ -1,4 +1,2 @@ perf-util-y +=3D perf_regs.o perf-util-y +=3D header.o - -perf-util-$(CONFIG_LIBTRACEEVENT) +=3D kvm-stat.o diff --git a/tools/perf/arch/s390/Makefile b/tools/perf/arch/s390/Makefile index 0033698a65ce..8b59ce8efb89 100644 --- a/tools/perf/arch/s390/Makefile +++ b/tools/perf/arch/s390/Makefile @@ -1,3 +1,2 @@ # SPDX-License-Identifier: GPL-2.0-only -HAVE_KVM_STAT_SUPPORT :=3D 1 PERF_HAVE_JITDUMP :=3D 1 diff --git a/tools/perf/arch/s390/util/Build b/tools/perf/arch/s390/util/Bu= ild index 5391d26fedd4..87229f2c4397 100644 --- a/tools/perf/arch/s390/util/Build +++ b/tools/perf/arch/s390/util/Build @@ -1,5 +1,4 @@ perf-util-y +=3D header.o -perf-util-$(CONFIG_LIBTRACEEVENT) +=3D kvm-stat.o perf-util-y +=3D perf_regs.o =20 perf-util-y +=3D machine.o diff --git a/tools/perf/arch/x86/Makefile b/tools/perf/arch/x86/Makefile index a295a80ea078..44cc3f023318 100644 --- a/tools/perf/arch/x86/Makefile +++ b/tools/perf/arch/x86/Makefile @@ -1,3 +1,2 @@ # SPDX-License-Identifier: GPL-2.0 -HAVE_KVM_STAT_SUPPORT :=3D 1 PERF_HAVE_JITDUMP :=3D 1 diff --git a/tools/perf/arch/x86/util/Build b/tools/perf/arch/x86/util/Build index 76127eefde8b..0c4cf1dd07bf 100644 --- a/tools/perf/arch/x86/util/Build +++ b/tools/perf/arch/x86/util/Build @@ -1,7 +1,6 @@ perf-util-y +=3D header.o perf-util-y +=3D tsc.o perf-util-y +=3D pmu.o -perf-util-$(CONFIG_LIBTRACEEVENT) +=3D kvm-stat.o perf-util-y +=3D perf_regs.o perf-util-y +=3D topdown.o perf-util-y +=3D machine.o diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index c61369d54dd9..bd9bda32157f 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -52,7 +52,7 @@ #include #include =20 -#if defined(HAVE_KVM_STAT_SUPPORT) && defined(HAVE_LIBTRACEEVENT) +#if defined(HAVE_LIBTRACEEVENT) #define GET_EVENT_KEY(func, field) \ static u64 get_event_ ##func(struct kvm_event *event, int vcpu) \ { \ @@ -597,7 +597,7 @@ static void kvm_display(struct perf_kvm_stat *kvm) =20 #endif /* HAVE_SLANG_SUPPORT */ =20 -#endif // defined(HAVE_KVM_STAT_SUPPORT) && defined(HAVE_LIBTRACEEVENT) +#endif // defined(HAVE_LIBTRACEEVENT) =20 static const char *get_filename_for_perf_kvm(void) { @@ -613,13 +613,13 @@ static const char *get_filename_for_perf_kvm(void) return filename; } =20 -#if defined(HAVE_KVM_STAT_SUPPORT) && defined(HAVE_LIBTRACEEVENT) +#if defined(HAVE_LIBTRACEEVENT) =20 static bool register_kvm_events_ops(struct perf_kvm_stat *kvm) { - struct kvm_reg_events_ops *events_ops =3D kvm_reg_events_ops; + const struct kvm_reg_events_ops *events_ops; =20 - for (events_ops =3D kvm_reg_events_ops; events_ops->name; events_ops++) { + for (events_ops =3D kvm_reg_events_ops(); events_ops->name; events_ops++)= { if (!strcmp(events_ops->name, kvm->report_event)) { kvm->events_ops =3D events_ops->ops; return true; @@ -809,7 +809,7 @@ static bool is_child_event(struct perf_kvm_stat *kvm, struct perf_sample *sample, struct event_key *key) { - struct child_event_ops *child_ops; + const struct child_event_ops *child_ops; =20 child_ops =3D kvm->events_ops->child_ops; =20 @@ -845,7 +845,7 @@ static bool skip_event(const char *event) { const char * const *skip_events; =20 - for (skip_events =3D kvm_skip_events; *skip_events; skip_events++) + for (skip_events =3D kvm_skip_events(); *skip_events; skip_events++) if (!strcmp(event, *skip_events)) return true; =20 @@ -928,7 +928,7 @@ struct vcpu_event_record *per_vcpu_record(struct thread= *thread, return NULL; } =20 - vcpu_record->vcpu_id =3D evsel__intval(evsel, sample, vcpu_id_str); + vcpu_record->vcpu_id =3D evsel__intval(evsel, sample, vcpu_id_str()); thread__set_priv(thread, vcpu_record); } =20 @@ -1636,11 +1636,6 @@ static int kvm_events_report_vcpu(struct perf_kvm_st= at *kvm) return ret; } =20 -int __weak setup_kvm_events_tp(struct perf_kvm_stat *kvm __maybe_unused) -{ - return 0; -} - static int kvm_events_record(struct perf_kvm_stat *kvm, int argc, const char **argv) { @@ -1666,7 +1661,7 @@ kvm_events_record(struct perf_kvm_stat *kvm, int argc= , const char **argv) return ret; } =20 - for (events_tp =3D kvm_events_tp; *events_tp; events_tp++) + for (events_tp =3D kvm_events_tp(); *events_tp; events_tp++) events_tp_size++; =20 rec_argc =3D ARRAY_SIZE(record_args) + argc + 2 + @@ -1681,7 +1676,7 @@ kvm_events_record(struct perf_kvm_stat *kvm, int argc= , const char **argv) =20 for (j =3D 0; j < events_tp_size; j++) { rec_argv[i++] =3D STRDUP_FAIL_EXIT("-e"); - rec_argv[i++] =3D STRDUP_FAIL_EXIT(kvm_events_tp[j]); + rec_argv[i++] =3D STRDUP_FAIL_EXIT(kvm_events_tp()[j]); } =20 rec_argv[i++] =3D STRDUP_FAIL_EXIT("-o"); @@ -1775,7 +1770,7 @@ static struct evlist *kvm_live_event_list(void) if (evlist =3D=3D NULL) return NULL; =20 - for (events_tp =3D kvm_events_tp; *events_tp; events_tp++) { + for (events_tp =3D kvm_events_tp(); *events_tp; events_tp++) { =20 tp =3D strdup(*events_tp); if (tp =3D=3D NULL) @@ -1985,13 +1980,7 @@ static int kvm_cmd_stat(const char *file_name, int a= rgc, const char **argv) perf_stat: return cmd_stat(argc, argv); } -#endif /* HAVE_KVM_STAT_SUPPORT */ - -int __weak kvm_add_default_arch_event(int *argc __maybe_unused, - const char **argv __maybe_unused) -{ - return 0; -} +#endif /* HAVE_LIBTRACEEVENT */ =20 static int __cmd_record(const char *file_name, int argc, const char **argv) { @@ -2179,7 +2168,7 @@ int cmd_kvm(int argc, const char **argv) return __cmd_top(argc, argv); else if (strlen(argv[0]) > 2 && strstarts("buildid-list", argv[0])) return __cmd_buildid_list(file_name, argc, argv); -#if defined(HAVE_KVM_STAT_SUPPORT) && defined(HAVE_LIBTRACEEVENT) +#if defined(HAVE_LIBTRACEEVENT) else if (strlen(argv[0]) > 2 && strstarts("stat", argv[0])) return kvm_cmd_stat(file_name, argc, argv); #endif diff --git a/tools/perf/util/Build b/tools/perf/util/Build index b9925c6902ca..2852ba0f3d4d 100644 --- a/tools/perf/util/Build +++ b/tools/perf/util/Build @@ -128,7 +128,8 @@ perf-util-y +=3D spark.o perf-util-y +=3D topdown.o perf-util-y +=3D iostat.o perf-util-y +=3D stream.o -perf-util-y +=3D kvm-stat.o +perf-util-$(CONFIG_LIBTRACEEVENT) +=3D kvm-stat.o +perf-util-y +=3D kvm-stat-arch/ perf-util-y +=3D lock-contention.o perf-util-y +=3D auxtrace.o perf-util-y +=3D intel-pt-decoder/ diff --git a/tools/perf/util/kvm-stat-arch/Build b/tools/perf/util/kvm-stat= -arch/Build new file mode 100644 index 000000000000..d84e55656e7a --- /dev/null +++ b/tools/perf/util/kvm-stat-arch/Build @@ -0,0 +1,6 @@ +perf-util-$(CONFIG_LIBTRACEEVENT) +=3D kvm-stat-arm64.o +perf-util-$(CONFIG_LIBTRACEEVENT) +=3D kvm-stat-loongarch.o +perf-util-$(CONFIG_LIBTRACEEVENT) +=3D kvm-stat-powerpc.o +perf-util-$(CONFIG_LIBTRACEEVENT) +=3D kvm-stat-riscv.o +perf-util-$(CONFIG_LIBTRACEEVENT) +=3D kvm-stat-s390.o +perf-util-$(CONFIG_LIBTRACEEVENT) +=3D kvm-stat-x86.o diff --git a/tools/perf/arch/arm64/util/arm64_exception_types.h b/tools/per= f/util/kvm-stat-arch/arm64_exception_types.h similarity index 100% rename from tools/perf/arch/arm64/util/arm64_exception_types.h rename to tools/perf/util/kvm-stat-arch/arm64_exception_types.h diff --git a/tools/perf/arch/powerpc/util/book3s_hcalls.h b/tools/perf/util= /kvm-stat-arch/book3s_hcalls.h similarity index 100% rename from tools/perf/arch/powerpc/util/book3s_hcalls.h rename to tools/perf/util/kvm-stat-arch/book3s_hcalls.h diff --git a/tools/perf/arch/powerpc/util/book3s_hv_exits.h b/tools/perf/ut= il/kvm-stat-arch/book3s_hv_exits.h similarity index 100% rename from tools/perf/arch/powerpc/util/book3s_hv_exits.h rename to tools/perf/util/kvm-stat-arch/book3s_hv_exits.h diff --git a/tools/perf/arch/arm64/util/kvm-stat.c b/tools/perf/util/kvm-st= at-arch/kvm-stat-arm64.c similarity index 63% rename from tools/perf/arch/arm64/util/kvm-stat.c rename to tools/perf/util/kvm-stat-arch/kvm-stat-arm64.c index 6611aa21cba9..8003ff415b1a 100644 --- a/tools/perf/arch/arm64/util/kvm-stat.c +++ b/tools/perf/util/kvm-stat-arch/kvm-stat-arm64.c @@ -1,21 +1,17 @@ // SPDX-License-Identifier: GPL-2.0 #include #include -#include "../../../util/evsel.h" -#include "../../../util/kvm-stat.h" +#include "../debug.h" +#include "../evsel.h" +#include "../kvm-stat.h" #include "arm64_exception_types.h" -#include "debug.h" =20 define_exit_reasons_table(arm64_exit_reasons, kvm_arm_exception_type); define_exit_reasons_table(arm64_trap_exit_reasons, kvm_arm_exception_class= ); =20 -const char *kvm_trap_exit_reason =3D "esr_ec"; -const char *vcpu_id_str =3D "id"; -const char *kvm_exit_reason =3D "ret"; -const char *kvm_entry_trace =3D "kvm:kvm_entry"; -const char *kvm_exit_trace =3D "kvm:kvm_exit"; +static const char *kvm_trap_exit_reason =3D "esr_ec"; =20 -const char *kvm_events_tp[] =3D { +static const char * const __kvm_events_tp[] =3D { "kvm:kvm_entry", "kvm:kvm_exit", NULL, @@ -26,7 +22,7 @@ static void event_get_key(struct evsel *evsel, struct event_key *key) { key->info =3D 0; - key->key =3D evsel__intval(evsel, sample, kvm_exit_reason); + key->key =3D evsel__intval(evsel, sample, kvm_exit_reason()); key->exit_reasons =3D arm64_exit_reasons; =20 /* @@ -44,28 +40,28 @@ static bool event_begin(struct evsel *evsel, struct perf_sample *sample __maybe_unused, struct event_key *key __maybe_unused) { - return evsel__name_is(evsel, kvm_entry_trace); + return evsel__name_is(evsel, kvm_entry_trace()); } =20 static bool event_end(struct evsel *evsel, struct perf_sample *sample, struct event_key *key) { - if (evsel__name_is(evsel, kvm_exit_trace)) { + if (evsel__name_is(evsel, kvm_exit_trace())) { event_get_key(evsel, sample, key); return true; } return false; } =20 -static struct kvm_events_ops exit_events =3D { +static const struct kvm_events_ops exit_events =3D { .is_begin_event =3D event_begin, .is_end_event =3D event_end, .decode_key =3D exit_event_decode_key, .name =3D "VM-EXIT" }; =20 -struct kvm_reg_events_ops kvm_reg_events_ops[] =3D { +static const struct kvm_reg_events_ops __kvm_reg_events_ops[] =3D { { .name =3D "vmexit", .ops =3D &exit_events, @@ -73,12 +69,27 @@ struct kvm_reg_events_ops kvm_reg_events_ops[] =3D { { NULL, NULL }, }; =20 -const char * const kvm_skip_events[] =3D { +static const char * const __kvm_skip_events[] =3D { NULL, }; =20 -int cpu_isa_init(struct perf_kvm_stat *kvm, const char *cpuid __maybe_unus= ed) +int __cpu_isa_init_arm64(struct perf_kvm_stat *kvm) { kvm->exit_reasons_isa =3D "arm64"; return 0; } + +const char * const *__kvm_events_tp_arm64(void) +{ + return __kvm_events_tp; +} + +const struct kvm_reg_events_ops *__kvm_reg_events_ops_arm64(void) +{ + return __kvm_reg_events_ops; +} + +const char * const *__kvm_skip_events_arm64(void) +{ + return __kvm_skip_events; +} diff --git a/tools/perf/arch/loongarch/util/kvm-stat.c b/tools/perf/util/kv= m-stat-arch/kvm-stat-loongarch.c similarity index 78% rename from tools/perf/arch/loongarch/util/kvm-stat.c rename to tools/perf/util/kvm-stat-arch/kvm-stat-loongarch.c index a7859a3a9a51..a15ce072ac34 100644 --- a/tools/perf/arch/loongarch/util/kvm-stat.c +++ b/tools/perf/util/kvm-stat-arch/kvm-stat-loongarch.c @@ -1,12 +1,12 @@ // SPDX-License-Identifier: GPL-2.0 #include #include -#include "util/kvm-stat.h" -#include "util/parse-events.h" -#include "util/debug.h" -#include "util/evsel.h" -#include "util/evlist.h" -#include "util/pmus.h" +#include "../kvm-stat.h" +#include "../parse-events.h" +#include "../debug.h" +#include "../evsel.h" +#include "../evlist.h" +#include "../pmus.h" =20 #define LOONGARCH_EXCEPTION_INT 0 #define LOONGARCH_EXCEPTION_PIL 1 @@ -43,12 +43,8 @@ =20 define_exit_reasons_table(loongarch_exit_reasons, loongarch_exception_type= ); =20 -const char *vcpu_id_str =3D "vcpu_id"; -const char *kvm_exit_reason =3D "reason"; -const char *kvm_entry_trace =3D "kvm:kvm_enter"; -const char *kvm_reenter_trace =3D "kvm:kvm_reenter"; -const char *kvm_exit_trace =3D "kvm:kvm_exit"; -const char *kvm_events_tp[] =3D { +static const char *kvm_reenter_trace =3D "kvm:kvm_reenter"; +static const char * const __kvm_events_tp[] =3D { "kvm:kvm_enter", "kvm:kvm_reenter", "kvm:kvm_exit", @@ -74,7 +70,8 @@ static bool event_end(struct evsel *evsel, * kvm:kvm_enter means returning to vmm and then to guest * kvm:kvm_reenter means returning to guest immediately */ - return evsel__name_is(evsel, kvm_entry_trace) || evsel__name_is(evsel, kv= m_reenter_trace); + return evsel__name_is(evsel, kvm_entry_trace()) || + evsel__name_is(evsel, kvm_reenter_trace); } =20 static void event_gspr_get_key(struct evsel *evsel, @@ -109,12 +106,12 @@ static void event_gspr_get_key(struct evsel *evsel, } } =20 -static struct child_event_ops child_events[] =3D { +static const struct child_event_ops child_events[] =3D { { .name =3D "kvm:kvm_exit_gspr", .get_key =3D event_gspr_get_key }, { NULL, NULL }, }; =20 -static struct kvm_events_ops exit_events =3D { +static const struct kvm_events_ops exit_events =3D { .is_begin_event =3D event_begin, .is_end_event =3D event_end, .child_ops =3D child_events, @@ -122,18 +119,33 @@ static struct kvm_events_ops exit_events =3D { .name =3D "VM-EXIT" }; =20 -struct kvm_reg_events_ops kvm_reg_events_ops[] =3D { +static const struct kvm_reg_events_ops __kvm_reg_events_ops[] =3D { { .name =3D "vmexit", .ops =3D &exit_events, }, { NULL, NULL }, }; =20 -const char * const kvm_skip_events[] =3D { +static const char * const __kvm_skip_events[] =3D { NULL, }; =20 -int cpu_isa_init(struct perf_kvm_stat *kvm, const char *cpuid __maybe_unus= ed) +int __cpu_isa_init_loongarch(struct perf_kvm_stat *kvm) { kvm->exit_reasons_isa =3D "loongarch64"; kvm->exit_reasons =3D loongarch_exit_reasons; return 0; } + +const char * const *__kvm_events_tp_loongarch(void) +{ + return __kvm_events_tp; +} + +const struct kvm_reg_events_ops *__kvm_reg_events_ops_loongarch(void) +{ + return __kvm_reg_events_ops; +} + +const char * const *__kvm_skip_events_loongarch(void) +{ + return __kvm_skip_events; +} diff --git a/tools/perf/arch/powerpc/util/kvm-stat.c b/tools/perf/util/kvm-= stat-arch/kvm-stat-powerpc.c similarity index 78% rename from tools/perf/arch/powerpc/util/kvm-stat.c rename to tools/perf/util/kvm-stat-arch/kvm-stat-powerpc.c index c8357b571ccf..42182d70beb6 100644 --- a/tools/perf/arch/powerpc/util/kvm-stat.c +++ b/tools/perf/util/kvm-stat-arch/kvm-stat-powerpc.c @@ -1,11 +1,11 @@ // SPDX-License-Identifier: GPL-2.0 #include -#include "util/kvm-stat.h" -#include "util/parse-events.h" -#include "util/debug.h" -#include "util/evsel.h" -#include "util/evlist.h" -#include "util/pmus.h" +#include "../kvm-stat.h" +#include "../parse-events.h" +#include "../debug.h" +#include "../evsel.h" +#include "../evlist.h" +#include "../pmus.h" =20 #include "book3s_hv_exits.h" #include "book3s_hcalls.h" @@ -13,15 +13,11 @@ =20 #define NR_TPS 4 =20 -const char *vcpu_id_str =3D "vcpu_id"; -const char *kvm_entry_trace =3D "kvm_hv:kvm_guest_enter"; -const char *kvm_exit_trace =3D "kvm_hv:kvm_guest_exit"; - define_exit_reasons_table(hv_exit_reasons, kvm_trace_symbol_exit); define_exit_reasons_table(hcall_reasons, kvm_trace_symbol_hcall); =20 /* Tracepoints specific to ppc_book3s_hv */ -const char *ppc_book3s_hv_kvm_tp[] =3D { +static const char * const ppc_book3s_hv_kvm_tp[] =3D { "kvm_hv:kvm_guest_enter", "kvm_hv:kvm_guest_exit", "kvm_hv:kvm_hcall_enter", @@ -30,8 +26,7 @@ const char *ppc_book3s_hv_kvm_tp[] =3D { }; =20 /* 1 extra placeholder for NULL */ -const char *kvm_events_tp[NR_TPS + 1]; -const char *kvm_exit_reason; +static const char *__kvm_events_tp[NR_TPS + 1]; =20 static void hcall_event_get_key(struct evsel *evsel, struct perf_sample *sample, @@ -60,13 +55,13 @@ static bool hcall_event_end(struct evsel *evsel, struct perf_sample *sample __maybe_unused, struct event_key *key __maybe_unused) { - return (evsel__name_is(evsel, kvm_events_tp[3])); + return evsel__name_is(evsel, __kvm_events_tp[3]); } =20 static bool hcall_event_begin(struct evsel *evsel, struct perf_sample *sample, struct event_key *key) { - if (evsel__name_is(evsel, kvm_events_tp[2])) { + if (evsel__name_is(evsel, __kvm_events_tp[2])) { hcall_event_get_key(evsel, sample, key); return true; } @@ -82,27 +77,27 @@ static void hcall_event_decode_key(struct perf_kvm_stat= *kvm __maybe_unused, scnprintf(decode, KVM_EVENT_NAME_LEN, "%s", hcall_reason); } =20 -static struct kvm_events_ops hcall_events =3D { +static const struct kvm_events_ops hcall_events =3D { .is_begin_event =3D hcall_event_begin, .is_end_event =3D hcall_event_end, .decode_key =3D hcall_event_decode_key, .name =3D "HCALL-EVENT", }; =20 -static struct kvm_events_ops exit_events =3D { +static const struct kvm_events_ops exit_events =3D { .is_begin_event =3D exit_event_begin, .is_end_event =3D exit_event_end, .decode_key =3D exit_event_decode_key, .name =3D "VM-EXIT" }; =20 -struct kvm_reg_events_ops kvm_reg_events_ops[] =3D { +static const struct kvm_reg_events_ops __kvm_reg_events_ops[] =3D { { .name =3D "vmexit", .ops =3D &exit_events }, { .name =3D "hcall", .ops =3D &hcall_events }, { NULL, NULL }, }; =20 -const char * const kvm_skip_events[] =3D { +static const char * const __kvm_skip_events[] =3D { NULL, }; =20 @@ -123,7 +118,7 @@ static int is_tracepoint_available(const char *str, str= uct evlist *evlist) static int ppc__setup_book3s_hv(struct perf_kvm_stat *kvm, struct evlist *evlist) { - const char **events_ptr; + const char * const *events_ptr; int i, nr_tp =3D 0, err =3D -1; =20 /* Check for book3s_hv tracepoints */ @@ -135,10 +130,9 @@ static int ppc__setup_book3s_hv(struct perf_kvm_stat *= kvm, } =20 for (i =3D 0; i < nr_tp; i++) - kvm_events_tp[i] =3D ppc_book3s_hv_kvm_tp[i]; + __kvm_events_tp[i] =3D ppc_book3s_hv_kvm_tp[i]; =20 - kvm_events_tp[i] =3D NULL; - kvm_exit_reason =3D "trap"; + __kvm_events_tp[i] =3D NULL; kvm->exit_reasons =3D hv_exit_reasons; kvm->exit_reasons_isa =3D "HV"; =20 @@ -157,12 +151,12 @@ static int ppc__setup_kvm_tp(struct perf_kvm_stat *kv= m) return ppc__setup_book3s_hv(kvm, evlist); } =20 -int setup_kvm_events_tp(struct perf_kvm_stat *kvm) +int __setup_kvm_events_tp_powerpc(struct perf_kvm_stat *kvm) { return ppc__setup_kvm_tp(kvm); } =20 -int cpu_isa_init(struct perf_kvm_stat *kvm, const char *cpuid __maybe_unus= ed) +int __cpu_isa_init_powerpc(struct perf_kvm_stat *kvm) { int ret; =20 @@ -184,7 +178,7 @@ int cpu_isa_init(struct perf_kvm_stat *kvm, const char = *cpuid __maybe_unused) * * Function to parse the arguments and return appropriate values. */ -int kvm_add_default_arch_event(int *argc, const char **argv) +int __kvm_add_default_arch_event_powerpc(int *argc, const char **argv) { const char **tmp; bool event =3D false; @@ -217,3 +211,18 @@ int kvm_add_default_arch_event(int *argc, const char *= *argv) free(tmp); return 0; } + +const char * const *__kvm_events_tp_powerpc(void) +{ + return __kvm_events_tp; +} + +const struct kvm_reg_events_ops *__kvm_reg_events_ops_powerpc(void) +{ + return __kvm_reg_events_ops; +} + +const char * const *__kvm_skip_events_powerpc(void) +{ + return __kvm_skip_events; +} diff --git a/tools/perf/arch/riscv/util/kvm-stat.c b/tools/perf/util/kvm-st= at-arch/kvm-stat-riscv.c similarity index 58% rename from tools/perf/arch/riscv/util/kvm-stat.c rename to tools/perf/util/kvm-stat-arch/kvm-stat-riscv.c index 3ea7acb5e159..b2c5d3220795 100644 --- a/tools/perf/arch/riscv/util/kvm-stat.c +++ b/tools/perf/util/kvm-stat-arch/kvm-stat-riscv.c @@ -7,19 +7,14 @@ */ #include #include -#include "../../../util/evsel.h" -#include "../../../util/kvm-stat.h" +#include "../evsel.h" +#include "../kvm-stat.h" #include "riscv_trap_types.h" #include "debug.h" =20 define_exit_reasons_table(riscv_exit_reasons, kvm_riscv_trap_class); =20 -const char *vcpu_id_str =3D "id"; -const char *kvm_exit_reason =3D "scause"; -const char *kvm_entry_trace =3D "kvm:kvm_entry"; -const char *kvm_exit_trace =3D "kvm:kvm_exit"; - -const char *kvm_events_tp[] =3D { +static const char * const __kvm_events_tp[] =3D { "kvm:kvm_entry", "kvm:kvm_exit", NULL, @@ -29,8 +24,10 @@ static void event_get_key(struct evsel *evsel, struct perf_sample *sample, struct event_key *key) { + int xlen =3D 64; // TODO: 32-bit support. + key->info =3D 0; - key->key =3D evsel__intval(evsel, sample, kvm_exit_reason) & ~CAUSE_IRQ_F= LAG; + key->key =3D evsel__intval(evsel, sample, kvm_exit_reason()) & ~CAUSE_IRQ= _FLAG(xlen); key->exit_reasons =3D riscv_exit_reasons; } =20 @@ -38,28 +35,28 @@ static bool event_begin(struct evsel *evsel, struct perf_sample *sample __maybe_unused, struct event_key *key __maybe_unused) { - return evsel__name_is(evsel, kvm_entry_trace); + return evsel__name_is(evsel, kvm_entry_trace()); } =20 static bool event_end(struct evsel *evsel, struct perf_sample *sample, struct event_key *key) { - if (evsel__name_is(evsel, kvm_exit_trace)) { + if (evsel__name_is(evsel, kvm_exit_trace())) { event_get_key(evsel, sample, key); return true; } return false; } =20 -static struct kvm_events_ops exit_events =3D { +static const struct kvm_events_ops exit_events =3D { .is_begin_event =3D event_begin, .is_end_event =3D event_end, .decode_key =3D exit_event_decode_key, .name =3D "VM-EXIT" }; =20 -struct kvm_reg_events_ops kvm_reg_events_ops[] =3D { +static const struct kvm_reg_events_ops __kvm_reg_events_ops[] =3D { { .name =3D "vmexit", .ops =3D &exit_events, @@ -67,12 +64,27 @@ struct kvm_reg_events_ops kvm_reg_events_ops[] =3D { { NULL, NULL }, }; =20 -const char * const kvm_skip_events[] =3D { +static const char * const __kvm_skip_events[] =3D { NULL, }; =20 -int cpu_isa_init(struct perf_kvm_stat *kvm, const char *cpuid __maybe_unus= ed) +int __cpu_isa_init_riscv(struct perf_kvm_stat *kvm) { kvm->exit_reasons_isa =3D "riscv64"; return 0; } + +const char * const *__kvm_events_tp_riscv(void) +{ + return __kvm_events_tp; +} + +const struct kvm_reg_events_ops *__kvm_reg_events_ops_riscv(void) +{ + return __kvm_reg_events_ops; +} + +const char * const *__kvm_skip_events_riscv(void) +{ + return __kvm_skip_events; +} diff --git a/tools/perf/arch/s390/util/kvm-stat.c b/tools/perf/util/kvm-sta= t-arch/kvm-stat-s390.c similarity index 77% rename from tools/perf/arch/s390/util/kvm-stat.c rename to tools/perf/util/kvm-stat-arch/kvm-stat-s390.c index 0aed92df51ba..2073bfd82b67 100644 --- a/tools/perf/arch/s390/util/kvm-stat.c +++ b/tools/perf/util/kvm-stat-arch/kvm-stat-s390.c @@ -8,9 +8,9 @@ =20 #include #include -#include "../../util/kvm-stat.h" -#include "../../util/evsel.h" -#include +#include "../kvm-stat.h" +#include "../evsel.h" +#include "../../../arch/s390/include/uapi/asm/sie.h" =20 define_exit_reasons_table(sie_exit_reasons, sie_intercept_code); define_exit_reasons_table(sie_icpt_insn_codes, icpt_insn_codes); @@ -18,11 +18,6 @@ define_exit_reasons_table(sie_sigp_order_codes, sigp_ord= er_codes); define_exit_reasons_table(sie_diagnose_codes, diagnose_codes); define_exit_reasons_table(sie_icpt_prog_codes, icpt_prog_codes); =20 -const char *vcpu_id_str =3D "id"; -const char *kvm_exit_reason =3D "icptcode"; -const char *kvm_entry_trace =3D "kvm:kvm_s390_sie_enter"; -const char *kvm_exit_trace =3D "kvm:kvm_s390_sie_exit"; - static void event_icpt_insn_get_key(struct evsel *evsel, struct perf_sample *sample, struct event_key *key) @@ -58,7 +53,7 @@ static void event_icpt_prog_get_key(struct evsel *evsel, key->exit_reasons =3D sie_icpt_prog_codes; } =20 -static struct child_event_ops child_events[] =3D { +static const struct child_event_ops child_events[] =3D { { .name =3D "kvm:kvm_s390_intercept_instruction", .get_key =3D event_icpt_insn_get_key }, { .name =3D "kvm:kvm_s390_handle_sigp", @@ -70,7 +65,7 @@ static struct child_event_ops child_events[] =3D { { NULL, NULL }, }; =20 -static struct kvm_events_ops exit_events =3D { +static const struct kvm_events_ops exit_events =3D { .is_begin_event =3D exit_event_begin, .is_end_event =3D exit_event_end, .child_ops =3D child_events, @@ -78,7 +73,7 @@ static struct kvm_events_ops exit_events =3D { .name =3D "VM-EXIT" }; =20 -const char *kvm_events_tp[] =3D { +static const char * const __kvm_events_tp[] =3D { "kvm:kvm_s390_sie_enter", "kvm:kvm_s390_sie_exit", "kvm:kvm_s390_intercept_instruction", @@ -88,17 +83,17 @@ const char *kvm_events_tp[] =3D { NULL, }; =20 -struct kvm_reg_events_ops kvm_reg_events_ops[] =3D { +static const struct kvm_reg_events_ops __kvm_reg_events_ops[] =3D { { .name =3D "vmexit", .ops =3D &exit_events }, { NULL, NULL }, }; =20 -const char * const kvm_skip_events[] =3D { +static const char * const __kvm_skip_events[] =3D { "Wait state", NULL, }; =20 -int cpu_isa_init(struct perf_kvm_stat *kvm, const char *cpuid) +int __cpu_isa_init_s390(struct perf_kvm_stat *kvm, const char *cpuid) { if (strstr(cpuid, "IBM")) { kvm->exit_reasons =3D sie_exit_reasons; @@ -108,3 +103,18 @@ int cpu_isa_init(struct perf_kvm_stat *kvm, const char= *cpuid) =20 return 0; } + +const char * const *__kvm_events_tp_s390(void) +{ + return __kvm_events_tp; +} + +const struct kvm_reg_events_ops *__kvm_reg_events_ops_s390(void) +{ + return __kvm_reg_events_ops; +} + +const char * const *__kvm_skip_events_s390(void) +{ + return __kvm_skip_events; +} diff --git a/tools/perf/arch/x86/util/kvm-stat.c b/tools/perf/util/kvm-stat= -arch/kvm-stat-x86.c similarity index 88% rename from tools/perf/arch/x86/util/kvm-stat.c rename to tools/perf/util/kvm-stat-arch/kvm-stat-x86.c index bff36f9345ea..1cf541385a4b 100644 --- a/tools/perf/arch/x86/util/kvm-stat.c +++ b/tools/perf/util/kvm-stat-arch/kvm-stat-x86.c @@ -1,9 +1,9 @@ // SPDX-License-Identifier: GPL-2.0 #include #include -#include "../../../util/kvm-stat.h" -#include "../../../util/evsel.h" -#include "../../../util/env.h" +#include "../kvm-stat.h" +#include "../evsel.h" +#include "../env.h" #include #include #include @@ -12,18 +12,13 @@ define_exit_reasons_table(vmx_exit_reasons, VMX_EXIT_REASONS); define_exit_reasons_table(svm_exit_reasons, SVM_EXIT_REASONS); =20 -static struct kvm_events_ops exit_events =3D { +static const struct kvm_events_ops exit_events =3D { .is_begin_event =3D exit_event_begin, .is_end_event =3D exit_event_end, .decode_key =3D exit_event_decode_key, .name =3D "VM-EXIT" }; =20 -const char *vcpu_id_str =3D "vcpu_id"; -const char *kvm_exit_reason =3D "exit_reason"; -const char *kvm_entry_trace =3D "kvm:kvm_entry"; -const char *kvm_exit_trace =3D "kvm:kvm_exit"; - /* * For the mmio events, we treat: * the time of MMIO write: kvm_mmio(KVM_TRACE_MMIO_WRITE...) -> kvm_entry @@ -83,7 +78,7 @@ static void mmio_event_decode_key(struct perf_kvm_stat *k= vm __maybe_unused, key->info =3D=3D KVM_TRACE_MMIO_WRITE ? "W" : "R"); } =20 -static struct kvm_events_ops mmio_events =3D { +static const struct kvm_events_ops mmio_events =3D { .is_begin_event =3D mmio_event_begin, .is_end_event =3D mmio_event_end, .decode_key =3D mmio_event_decode_key, @@ -127,7 +122,7 @@ static void ioport_event_decode_key(struct perf_kvm_sta= t *kvm __maybe_unused, key->info ? "POUT" : "PIN"); } =20 -static struct kvm_events_ops ioport_events =3D { +static const struct kvm_events_ops ioport_events =3D { .is_begin_event =3D ioport_event_begin, .is_end_event =3D ioport_event_end, .decode_key =3D ioport_event_decode_key, @@ -171,14 +166,14 @@ static void msr_event_decode_key(struct perf_kvm_stat= *kvm __maybe_unused, key->info ? "W" : "R"); } =20 -static struct kvm_events_ops msr_events =3D { +static const struct kvm_events_ops msr_events =3D { .is_begin_event =3D msr_event_begin, .is_end_event =3D msr_event_end, .decode_key =3D msr_event_decode_key, .name =3D "MSR Access" }; =20 -const char *kvm_events_tp[] =3D { +static const char * const __kvm_events_tp[] =3D { "kvm:kvm_entry", "kvm:kvm_exit", "kvm:kvm_mmio", @@ -187,7 +182,7 @@ const char *kvm_events_tp[] =3D { NULL, }; =20 -struct kvm_reg_events_ops kvm_reg_events_ops[] =3D { +static const struct kvm_reg_events_ops __kvm_reg_events_ops[] =3D { { .name =3D "vmexit", .ops =3D &exit_events }, { .name =3D "mmio", .ops =3D &mmio_events }, { .name =3D "ioport", .ops =3D &ioport_events }, @@ -195,12 +190,12 @@ struct kvm_reg_events_ops kvm_reg_events_ops[] =3D { { NULL, NULL }, }; =20 -const char * const kvm_skip_events[] =3D { +static const char * const __kvm_skip_events[] =3D { "HLT", NULL, }; =20 -int cpu_isa_init(struct perf_kvm_stat *kvm, const char *cpuid) +int __cpu_isa_init_x86(struct perf_kvm_stat *kvm, const char *cpuid) { if (strstr(cpuid, "Intel")) { kvm->exit_reasons =3D vmx_exit_reasons; @@ -226,7 +221,7 @@ int cpu_isa_init(struct perf_kvm_stat *kvm, const char = *cpuid) * So, to avoid this issue explicitly use "cycles" instead of "cycles:P" e= vent * by default to sample guest on Intel platforms. */ -int kvm_add_default_arch_event(int *argc, const char **argv) +int __kvm_add_default_arch_event_x86(int *argc, const char **argv) { const char **tmp; bool event =3D false; @@ -262,3 +257,18 @@ int kvm_add_default_arch_event(int *argc, const char *= *argv) free(tmp); return ret; } + +const char * const *__kvm_events_tp_x86(void) +{ + return __kvm_events_tp; +} + +const struct kvm_reg_events_ops *__kvm_reg_events_ops_x86(void) +{ + return __kvm_reg_events_ops; +} + +const char * const *__kvm_skip_events_x86(void) +{ + return __kvm_skip_events; +} diff --git a/tools/perf/arch/riscv/util/riscv_trap_types.h b/tools/perf/uti= l/kvm-stat-arch/riscv_trap_types.h similarity index 96% rename from tools/perf/arch/riscv/util/riscv_trap_types.h rename to tools/perf/util/kvm-stat-arch/riscv_trap_types.h index 6cc71eb01fca..aa5d24fab4ee 100644 --- a/tools/perf/arch/riscv/util/riscv_trap_types.h +++ b/tools/perf/util/kvm-stat-arch/riscv_trap_types.h @@ -3,7 +3,7 @@ #define ARCH_PERF_RISCV_TRAP_TYPES_H =20 /* Exception cause high bit - is an interrupt if set */ -#define CAUSE_IRQ_FLAG (_AC(1, UL) << (__riscv_xlen - 1)) +#define CAUSE_IRQ_FLAG(xlen) (_AC(1, UL) << (xlen - 1)) =20 /* Interrupt causes (minus the high bit) */ #define IRQ_S_SOFT 1 diff --git a/tools/perf/util/kvm-stat.c b/tools/perf/util/kvm-stat.c index 38ace736db5c..b1affd97917b 100644 --- a/tools/perf/util/kvm-stat.c +++ b/tools/perf/util/kvm-stat.c @@ -2,12 +2,11 @@ #include "debug.h" #include "evsel.h" #include "kvm-stat.h" - -#if defined(HAVE_KVM_STAT_SUPPORT) && defined(HAVE_LIBTRACEEVENT) +#include =20 bool kvm_exit_event(struct evsel *evsel) { - return evsel__name_is(evsel, kvm_exit_trace); + return evsel__name_is(evsel, kvm_exit_trace()); } =20 void exit_event_get_key(struct evsel *evsel, @@ -15,7 +14,7 @@ void exit_event_get_key(struct evsel *evsel, struct event_key *key) { key->info =3D 0; - key->key =3D evsel__intval(evsel, sample, kvm_exit_reason); + key->key =3D evsel__intval(evsel, sample, kvm_exit_reason()); } =20 =20 @@ -32,7 +31,7 @@ bool exit_event_begin(struct evsel *evsel, =20 bool kvm_entry_event(struct evsel *evsel) { - return evsel__name_is(evsel, kvm_entry_trace); + return evsel__name_is(evsel, kvm_entry_trace()); } =20 bool exit_event_end(struct evsel *evsel, @@ -67,4 +66,202 @@ void exit_event_decode_key(struct perf_kvm_stat *kvm, scnprintf(decode, KVM_EVENT_NAME_LEN, "%s", exit_reason); } =20 -#endif +int setup_kvm_events_tp(struct perf_kvm_stat *kvm) +{ + switch (EM_HOST) { + case EM_PPC: + case EM_PPC64: + return __setup_kvm_events_tp_powerpc(kvm); + default: + return 0; + } +} + +int cpu_isa_init(struct perf_kvm_stat *kvm, const char *cpuid) +{ + switch (EM_HOST) { + case EM_AARCH64: + return __cpu_isa_init_arm64(kvm); + case EM_LOONGARCH: + return __cpu_isa_init_loongarch(kvm); + case EM_PPC: + case EM_PPC64: + return __cpu_isa_init_powerpc(kvm); + case EM_RISCV: + return __cpu_isa_init_riscv(kvm); + case EM_S390: + return __cpu_isa_init_s390(kvm, cpuid); + case EM_X86_64: + case EM_386: + return __cpu_isa_init_x86(kvm, cpuid); + default: + pr_err("Unsupported kvm-stat host %d\n", EM_HOST); + return -1; + } +} + +const char *vcpu_id_str(void) +{ + switch (EM_HOST) { + case EM_AARCH64: + case EM_RISCV: + case EM_S390: + return "id"; + case EM_LOONGARCH: + case EM_PPC: + case EM_PPC64: + case EM_X86_64: + case EM_386: + return "vcpu_id"; + default: + pr_err("Unsupported kvm-stat host %d\n", EM_HOST); + return NULL; + } +} + +const char *kvm_exit_reason(void) +{ + switch (EM_HOST) { + case EM_AARCH64: + return "ret"; + case EM_LOONGARCH: + return "reason"; + case EM_PPC: + case EM_PPC64: + return "trap"; + case EM_RISCV: + return "scause"; + case EM_S390: + return "icptcode"; + case EM_X86_64: + case EM_386: + return "exit_reason"; + default: + pr_err("Unsupported kvm-stat host %d\n", EM_HOST); + return NULL; + } +} + +const char *kvm_entry_trace(void) +{ + switch (EM_HOST) { + case EM_AARCH64: + case EM_RISCV: + case EM_X86_64: + case EM_386: + return "kvm:kvm_entry"; + case EM_LOONGARCH: + return "kvm:kvm_enter"; + case EM_PPC: + case EM_PPC64: + return "kvm_hv:kvm_guest_enter"; + case EM_S390: + return "kvm:kvm_s390_sie_enter"; + default: + pr_err("Unsupported kvm-stat host %d\n", EM_HOST); + return NULL; + } +} + +const char *kvm_exit_trace(void) +{ + switch (EM_HOST) { + case EM_AARCH64: + case EM_LOONGARCH: + case EM_RISCV: + case EM_X86_64: + case EM_386: + return "kvm:kvm_exit"; + case EM_PPC: + case EM_PPC64: + return "kvm_hv:kvm_guest_exit"; + case EM_S390: + return "kvm:kvm_s390_sie_exit"; + default: + pr_err("Unsupported kvm-stat host %d\n", EM_HOST); + return NULL; + } +} + +const char * const *kvm_events_tp(void) +{ + switch (EM_HOST) { + case EM_AARCH64: + return __kvm_events_tp_arm64(); + case EM_LOONGARCH: + return __kvm_events_tp_loongarch(); + case EM_PPC: + case EM_PPC64: + return __kvm_events_tp_powerpc(); + case EM_RISCV: + return __kvm_events_tp_riscv(); + case EM_S390: + return __kvm_events_tp_s390(); + case EM_X86_64: + case EM_386: + return __kvm_events_tp_x86(); + default: + pr_err("Unsupported kvm-stat host %d\n", EM_HOST); + return NULL; + } +} + +const struct kvm_reg_events_ops *kvm_reg_events_ops(void) +{ + switch (EM_HOST) { + case EM_AARCH64: + return __kvm_reg_events_ops_arm64(); + case EM_LOONGARCH: + return __kvm_reg_events_ops_loongarch(); + case EM_PPC: + case EM_PPC64: + return __kvm_reg_events_ops_powerpc(); + case EM_RISCV: + return __kvm_reg_events_ops_riscv(); + case EM_S390: + return __kvm_reg_events_ops_s390(); + case EM_X86_64: + case EM_386: + return __kvm_reg_events_ops_x86(); + default: + pr_err("Unsupported kvm-stat host %d\n", EM_HOST); + return NULL; + } +} + +const char * const *kvm_skip_events(void) +{ + switch (EM_HOST) { + case EM_AARCH64: + return __kvm_skip_events_arm64(); + case EM_LOONGARCH: + return __kvm_skip_events_loongarch(); + case EM_PPC: + case EM_PPC64: + return __kvm_skip_events_powerpc(); + case EM_RISCV: + return __kvm_skip_events_riscv(); + case EM_S390: + return __kvm_skip_events_s390(); + case EM_X86_64: + case EM_386: + return __kvm_skip_events_x86(); + default: + pr_err("Unsupported kvm-stat host %d\n", EM_HOST); + return NULL; + } +} + +int kvm_add_default_arch_event(int *argc, const char **argv) +{ + switch (EM_HOST) { + case EM_PPC: + case EM_PPC64: + return __kvm_add_default_arch_event_powerpc(argc, argv); + case EM_X86_64: + case EM_386: + return __kvm_add_default_arch_event_x86(argc, argv); + default: + return 0; + } +} diff --git a/tools/perf/util/kvm-stat.h b/tools/perf/util/kvm-stat.h index a356b839c2ee..a54cd4496df9 100644 --- a/tools/perf/util/kvm-stat.h +++ b/tools/perf/util/kvm-stat.h @@ -2,8 +2,6 @@ #ifndef __PERF_KVM_STAT_H #define __PERF_KVM_STAT_H =20 -#ifdef HAVE_KVM_STAT_SUPPORT - #include "tool.h" #include "sort.h" #include "stat.h" @@ -67,7 +65,7 @@ struct kvm_events_ops { struct event_key *key); bool (*is_end_event)(struct evsel *evsel, struct perf_sample *sample, struct event_key *key); - struct child_event_ops *child_ops; + const struct child_event_ops *child_ops; void (*decode_key)(struct perf_kvm_stat *kvm, struct event_key *key, char *decode); const char *name; @@ -95,7 +93,7 @@ struct perf_kvm_stat { struct exit_reasons_table *exit_reasons; const char *exit_reasons_isa; =20 - struct kvm_events_ops *events_ops; + const struct kvm_events_ops *events_ops; =20 u64 total_time; u64 total_count; @@ -113,11 +111,9 @@ struct perf_kvm_stat { =20 struct kvm_reg_events_ops { const char *name; - struct kvm_events_ops *ops; + const struct kvm_events_ops *ops; }; =20 -#if defined(HAVE_KVM_STAT_SUPPORT) && defined(HAVE_LIBTRACEEVENT) - void exit_event_get_key(struct evsel *evsel, struct perf_sample *sample, struct event_key *key); @@ -130,11 +126,9 @@ bool exit_event_end(struct evsel *evsel, void exit_event_decode_key(struct perf_kvm_stat *kvm, struct event_key *key, char *decode); -#endif =20 bool kvm_exit_event(struct evsel *evsel); bool kvm_entry_event(struct evsel *evsel); -int setup_kvm_events_tp(struct perf_kvm_stat *kvm); =20 #define define_exit_reasons_table(name, symbols) \ static struct exit_reasons_table name[] =3D { \ @@ -144,15 +138,49 @@ int setup_kvm_events_tp(struct perf_kvm_stat *kvm); /* * arch specific callbacks and data structures */ -int cpu_isa_init(struct perf_kvm_stat *kvm, const char *cpuid); +int setup_kvm_events_tp(struct perf_kvm_stat *kvm); +int __setup_kvm_events_tp_powerpc(struct perf_kvm_stat *kvm); =20 -extern const char *kvm_events_tp[]; -extern struct kvm_reg_events_ops kvm_reg_events_ops[]; -extern const char * const kvm_skip_events[]; -extern const char *vcpu_id_str; -extern const char *kvm_exit_reason; -extern const char *kvm_entry_trace; -extern const char *kvm_exit_trace; +int cpu_isa_init(struct perf_kvm_stat *kvm, const char *cpuid); +int __cpu_isa_init_arm64(struct perf_kvm_stat *kvm); +int __cpu_isa_init_loongarch(struct perf_kvm_stat *kvm); +int __cpu_isa_init_powerpc(struct perf_kvm_stat *kvm); +int __cpu_isa_init_riscv(struct perf_kvm_stat *kvm); +int __cpu_isa_init_s390(struct perf_kvm_stat *kvm, const char *cpuid); +int __cpu_isa_init_x86(struct perf_kvm_stat *kvm, const char *cpuid); + +const char *vcpu_id_str(void); +const char *kvm_exit_reason(void); +const char *kvm_entry_trace(void); +const char *kvm_exit_trace(void); + +const char * const *kvm_events_tp(void); +const char * const *__kvm_events_tp_arm64(void); +const char * const *__kvm_events_tp_loongarch(void); +const char * const *__kvm_events_tp_powerpc(void); +const char * const *__kvm_events_tp_riscv(void); +const char * const *__kvm_events_tp_s390(void); +const char * const *__kvm_events_tp_x86(void); + +const struct kvm_reg_events_ops *kvm_reg_events_ops(void); +const struct kvm_reg_events_ops *__kvm_reg_events_ops_arm64(void); +const struct kvm_reg_events_ops *__kvm_reg_events_ops_loongarch(void); +const struct kvm_reg_events_ops *__kvm_reg_events_ops_powerpc(void); +const struct kvm_reg_events_ops *__kvm_reg_events_ops_riscv(void); +const struct kvm_reg_events_ops *__kvm_reg_events_ops_s390(void); +const struct kvm_reg_events_ops *__kvm_reg_events_ops_x86(void); + +const char * const *kvm_skip_events(void); +const char * const *__kvm_skip_events_arm64(void); +const char * const *__kvm_skip_events_loongarch(void); +const char * const *__kvm_skip_events_powerpc(void); +const char * const *__kvm_skip_events_riscv(void); +const char * const *__kvm_skip_events_s390(void); +const char * const *__kvm_skip_events_x86(void); + +int kvm_add_default_arch_event(int *argc, const char **argv); +int __kvm_add_default_arch_event_powerpc(int *argc, const char **argv); +int __kvm_add_default_arch_event_x86(int *argc, const char **argv); =20 static inline struct kvm_info *kvm_info__get(struct kvm_info *ki) { @@ -186,11 +214,6 @@ static inline struct kvm_info *kvm_info__new(void) return ki; } =20 -#else /* HAVE_KVM_STAT_SUPPORT */ -// We use this unconditionally in hists__findnew_entry() and hist_entry__d= elete() -#define kvm_info__zput(ki) do { } while (0) -#endif /* HAVE_KVM_STAT_SUPPORT */ - #define STRDUP_FAIL_EXIT(s) \ ({ char *_p; \ _p =3D strdup(s); \ @@ -201,5 +224,4 @@ static inline struct kvm_info *kvm_info__new(void) _p; \ }) =20 -extern int kvm_add_default_arch_event(int *argc, const char **argv); #endif /* __PERF_KVM_STAT_H */ --=20 2.53.0.rc1.225.gd81095ad13-goog From nobody Sat Feb 7 12:19:40 2026 Received: from mail-dl1-f73.google.com (mail-dl1-f73.google.com [74.125.82.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C730B369961 for ; Sat, 31 Jan 2026 20:02:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769889757; cv=none; b=e+dUWL5QEvM01DCyR4nyJOiDxG9gYCTzQd3tt3trVF7d5M1W2qcptaDsVndNDGHxc9keDUwxWEe6jU5/OBWzesvRs2FAzWWQCfykVaauQ6Bz8YXmuk2moCSuM1Go1x3nSvnW2VKaPsKiSghWRn3+6QY2hpCXB/Mc+83XNZkguaw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769889757; c=relaxed/simple; bh=wt7noDSb+uHRaOknxa+W7HwIGiFI2DDYoNV6kgGlQZY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=Wo8Q+kib+gSU3uj7tkXwRPjNQY7eeRY/1FyX5W0EJonWs6Su3sE5mfwVuJ5Q5mt8iLvhHxnqqUYL2Idk8Kb4KjjCKND86ROdCCRCn0Yg5y9ZpKCG7/ZM1hBKc7abfdZScJqHEiYpf+sXQn3mEPAszaaqdkvD/eyQEF/1U9308Ow= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=ybuJQYZB; arc=none smtp.client-ip=74.125.82.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="ybuJQYZB" Received: by mail-dl1-f73.google.com with SMTP id a92af1059eb24-124a5098029so976685c88.0 for ; Sat, 31 Jan 2026 12:02:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1769889755; x=1770494555; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=EJGw1P1OvUFdmQODbC64bcyHD5Xw5EoFZDxVopOgqFI=; b=ybuJQYZB7aXOYkyAeg8TBFvoieQKTjRbbuUv5+qtxfWhkmoDrnGtJ4pwFdscisPlWm AJS4vsbsSYQVr1sCqSO0UuS4UXqi1NKA1V5PM4mGma67mV4KdIPpaitoIe8AtgVIOeE0 9jNuRqbMKa25mqHgyw632UH6p41t1funBJ6TIfDJMtvDpUhSwxsFHm1o4gpqdNsyE/Q5 qGIse0cmuY6/aglIf4LV41QoxCX6ylc7h+WztKaud9e+F1iBs+/i+e0xjnseyDBiR6VP E5mWwlurioSOCtjLBkaFsPG06Zyx8NM5Dvd+vq5n4Kl0G1zZLHCYQ9TnX0D2sEfQyrDh vmIw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769889755; x=1770494555; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=EJGw1P1OvUFdmQODbC64bcyHD5Xw5EoFZDxVopOgqFI=; b=sl4ss45Q5J02JeeNRCbmsJR0Z4AFqVPivWsd8by+vJfgWYJcE38dC88VogFBPU2u91 2Qe0DrHgK8uVKV6xvDLPv6Wjn1rpfZjvIm7w4Ii4NClOtt9tSptbkBOpe0glmJL/6zXi e8CVBRDck4eyS7Qbb6wonS3YaaBmiI2T9yvZcsVCA7D0rk2yetJzAV31b+GUKRkXSHnm MPQxOGHEYJ28ATVx8soL+fNlkncFHChuGueAdp0OHtEzA2PVthYDo//MHGJ09PAd6jbM f0mCv/vlnfeXoJQ2X8RpoYkcz/kTEKvhZAfpop8rrZd0Lrhdx9Vl2YQKt55Tiu1RDqzn edqA== X-Forwarded-Encrypted: i=1; AJvYcCVR8MB2L7sqBTtL2oBFkW4R4deG0zr6GEjlcTBLizyVdt9VUlOekwMsUbtLLBze0g0AOyaFiM0GU8LSQcU=@vger.kernel.org X-Gm-Message-State: AOJu0Yw0IusgJ5tQucniN73qBUorWdPsVCmHQB+hoPgcR0cUrIrbaOmI eBy/JcBxgzZcgCVYzK/FhJObDEJF4jBKmRvL1HT/McjU76rO2HnYpUc7sU68We2BXGJiCV+bAdQ wO707gWzO9w== X-Received: from dlbqc9.prod.google.com ([2002:a05:7023:a89:b0:120:56a0:1dd9]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7022:438a:b0:119:e569:f274 with SMTP id a92af1059eb24-125c1021a87mr2986854c88.29.1769889754794; Sat, 31 Jan 2026 12:02:34 -0800 (PST) Date: Sat, 31 Jan 2026 12:02:21 -0800 In-Reply-To: <20260131200224.1296136-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260131200224.1296136-1-irogers@google.com> X-Mailer: git-send-email 2.53.0.rc1.225.gd81095ad13-goog Message-ID: <20260131200224.1296136-4-irogers@google.com> Subject: [PATCH v2 3/6] perf kvm: Wire up e_machine From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , John Garry , Will Deacon , Mike Leach , Leo Yan , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti , Shimin Guo , Yunseong Kim , Athira Rajeev , Quan Zhou , Andrew Jones , Anup Patel , Dapeng Mi , Thomas Falcon , Blake Jones , Swapnil Sapkal , Kan Liang , Howard Chu , Anubhav Shelat , Aditya Bodkhe , Chun-Tse Shao , Andi Kleen , Dmitry Vyukov , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-riscv@lists.infradead.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Pass the e_machine to the kvm functions so that they aren't just wired to EM_HOST. In the case of a session move some setup until the session is created. As the session isn't fully running the default EM_HOST is returned as no e_machine can be found in a running machine. This is, however, some marginal progress to cross platform support. Signed-off-by: Ian Rogers --- tools/perf/builtin-kvm.c | 45 ++++++++------ tools/perf/util/evsel.c | 2 +- tools/perf/util/evsel.h | 1 + .../perf/util/kvm-stat-arch/kvm-stat-arm64.c | 6 +- .../util/kvm-stat-arch/kvm-stat-loongarch.c | 2 +- .../perf/util/kvm-stat-arch/kvm-stat-riscv.c | 6 +- tools/perf/util/kvm-stat.c | 62 +++++++++---------- tools/perf/util/kvm-stat.h | 20 +++--- 8 files changed, 77 insertions(+), 67 deletions(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index bd9bda32157f..93ba07c58290 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -2,6 +2,7 @@ #include "builtin.h" #include "perf.h" =20 +#include #include "util/build-id.h" #include "util/evsel.h" #include "util/evlist.h" @@ -615,11 +616,11 @@ static const char *get_filename_for_perf_kvm(void) =20 #if defined(HAVE_LIBTRACEEVENT) =20 -static bool register_kvm_events_ops(struct perf_kvm_stat *kvm) +static bool register_kvm_events_ops(struct perf_kvm_stat *kvm, uint16_t e_= machine) { const struct kvm_reg_events_ops *events_ops; =20 - for (events_ops =3D kvm_reg_events_ops(); events_ops->name; events_ops++)= { + for (events_ops =3D kvm_reg_events_ops(e_machine); events_ops->name; even= ts_ops++) { if (!strcmp(events_ops->name, kvm->report_event)) { kvm->events_ops =3D events_ops->ops; return true; @@ -841,11 +842,11 @@ static bool handle_child_event(struct perf_kvm_stat *= kvm, return true; } =20 -static bool skip_event(const char *event) +static bool skip_event(uint16_t e_machine, const char *event) { const char * const *skip_events; =20 - for (skip_events =3D kvm_skip_events(); *skip_events; skip_events++) + for (skip_events =3D kvm_skip_events(e_machine); *skip_events; skip_event= s++) if (!strcmp(event, *skip_events)) return true; =20 @@ -901,9 +902,10 @@ static bool handle_end_event(struct perf_kvm_stat *kvm, =20 if (kvm->duration && time_diff > kvm->duration) { char decode[KVM_EVENT_NAME_LEN]; + uint16_t e_machine =3D perf_session__e_machine(kvm->session); =20 kvm->events_ops->decode_key(kvm, &event->key, decode); - if (!skip_event(decode)) { + if (!skip_event(e_machine, decode)) { pr_info("%" PRIu64 " VM %d, vcpu %d: %s event took %" PRIu64 "usec\n", sample->time, sample->pid, vcpu_record->vcpu_id, decode, time_diff / NSEC_PER_USEC); @@ -921,6 +923,8 @@ struct vcpu_event_record *per_vcpu_record(struct thread= *thread, /* Only kvm_entry records vcpu id. */ if (!thread__priv(thread) && kvm_entry_event(evsel)) { struct vcpu_event_record *vcpu_record; + struct machine *machine =3D maps__machine(thread__maps(thread)); + uint16_t e_machine =3D thread__e_machine(thread, machine, /*e_flags=3D*/= NULL); =20 vcpu_record =3D zalloc(sizeof(*vcpu_record)); if (!vcpu_record) { @@ -928,7 +932,7 @@ struct vcpu_event_record *per_vcpu_record(struct thread= *thread, return NULL; } =20 - vcpu_record->vcpu_id =3D evsel__intval(evsel, sample, vcpu_id_str()); + vcpu_record->vcpu_id =3D evsel__intval(evsel, sample, vcpu_id_str(e_mach= ine)); thread__set_priv(thread, vcpu_record); } =20 @@ -1163,6 +1167,7 @@ static int cpu_isa_config(struct perf_kvm_stat *kvm) { char buf[128], *cpuid; int err; + uint16_t e_machine; =20 if (kvm->live) { struct perf_cpu cpu =3D {-1}; @@ -1182,7 +1187,8 @@ static int cpu_isa_config(struct perf_kvm_stat *kvm) return -EINVAL; } =20 - err =3D cpu_isa_init(kvm, cpuid); + e_machine =3D perf_session__e_machine(kvm->session); + err =3D cpu_isa_init(kvm, e_machine, cpuid); if (err =3D=3D -ENOTSUP) pr_err("CPU %s is not supported.\n", cpuid); =20 @@ -1413,7 +1419,7 @@ static int kvm_events_live_report(struct perf_kvm_sta= t *kvm) =20 if (!verify_vcpu(kvm->trace_vcpu) || !is_valid_key(kvm) || - !register_kvm_events_ops(kvm)) { + !register_kvm_events_ops(kvm, EM_HOST)) { goto out; } =20 @@ -1568,6 +1574,11 @@ static int read_events(struct perf_kvm_stat *kvm) goto out_delete; } =20 + if (!register_kvm_events_ops(kvm, perf_session__e_machine(kvm->session)))= { + ret =3D -EINVAL; + goto out_delete; + } + /* * Do not use 'isa' recorded in kvm_exit tracepoint since it is not * traced in the old kernel. @@ -1610,9 +1621,6 @@ static int kvm_events_report_vcpu(struct perf_kvm_sta= t *kvm) if (!is_valid_key(kvm)) goto exit; =20 - if (!register_kvm_events_ops(kvm)) - goto exit; - if (kvm->use_stdio) { use_browser =3D 0; setup_pager(); @@ -1653,15 +1661,16 @@ kvm_events_record(struct perf_kvm_stat *kvm, int ar= gc, const char **argv) }; const char * const *events_tp; int ret; + uint16_t e_machine =3D EM_HOST; =20 events_tp_size =3D 0; - ret =3D setup_kvm_events_tp(kvm); + ret =3D setup_kvm_events_tp(kvm, e_machine); if (ret < 0) { pr_err("Unable to setup the kvm tracepoints\n"); return ret; } =20 - for (events_tp =3D kvm_events_tp(); *events_tp; events_tp++) + for (events_tp =3D kvm_events_tp(e_machine); *events_tp; events_tp++) events_tp_size++; =20 rec_argc =3D ARRAY_SIZE(record_args) + argc + 2 + @@ -1676,7 +1685,7 @@ kvm_events_record(struct perf_kvm_stat *kvm, int argc= , const char **argv) =20 for (j =3D 0; j < events_tp_size; j++) { rec_argv[i++] =3D STRDUP_FAIL_EXIT("-e"); - rec_argv[i++] =3D STRDUP_FAIL_EXIT(kvm_events_tp()[j]); + rec_argv[i++] =3D STRDUP_FAIL_EXIT(kvm_events_tp(e_machine)[j]); } =20 rec_argv[i++] =3D STRDUP_FAIL_EXIT("-o"); @@ -1770,7 +1779,7 @@ static struct evlist *kvm_live_event_list(void) if (evlist =3D=3D NULL) return NULL; =20 - for (events_tp =3D kvm_events_tp(); *events_tp; events_tp++) { + for (events_tp =3D kvm_events_tp(EM_HOST); *events_tp; events_tp++) { =20 tp =3D strdup(*events_tp); if (tp =3D=3D NULL) @@ -1895,7 +1904,7 @@ static int kvm_events_live(struct perf_kvm_stat *kvm, /* * generate the event list */ - err =3D setup_kvm_events_tp(kvm); + err =3D setup_kvm_events_tp(kvm, EM_HOST); if (err < 0) { pr_err("Unable to setup the kvm tracepoints\n"); return err; @@ -2005,7 +2014,7 @@ static int __cmd_record(const char *file_name, int ar= gc, const char **argv) =20 BUG_ON(i + 2 !=3D rec_argc); =20 - ret =3D kvm_add_default_arch_event(&i, rec_argv); + ret =3D kvm_add_default_arch_event(EM_HOST, &i, rec_argv); if (ret) goto EXIT; =20 @@ -2092,7 +2101,7 @@ static int __cmd_top(int argc, const char **argv) =20 BUG_ON(i !=3D argc); =20 - ret =3D kvm_add_default_arch_event(&i, rec_argv); + ret =3D kvm_add_default_arch_event(EM_HOST, &i, rec_argv); if (ret) goto EXIT; =20 diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 5ac1a05601b1..848d0faf6698 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -1008,7 +1008,7 @@ int evsel__group_desc(struct evsel *evsel, char *buf,= size_t size) return ret; } =20 -static uint16_t evsel__e_machine(struct evsel *evsel) +uint16_t evsel__e_machine(struct evsel *evsel) { struct perf_session *session =3D evsel__session(evsel); =20 diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index 95c4bd0f0f2e..eefb5d569971 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -546,6 +546,7 @@ static inline bool evsel__is_dummy_event(struct evsel *= evsel) =20 struct perf_session *evsel__session(struct evsel *evsel); struct perf_env *evsel__env(struct evsel *evsel); +uint16_t evsel__e_machine(struct evsel *evsel); =20 int evsel__store_ids(struct evsel *evsel, struct evlist *evlist); =20 diff --git a/tools/perf/util/kvm-stat-arch/kvm-stat-arm64.c b/tools/perf/ut= il/kvm-stat-arch/kvm-stat-arm64.c index 8003ff415b1a..c640dcd8af7c 100644 --- a/tools/perf/util/kvm-stat-arch/kvm-stat-arm64.c +++ b/tools/perf/util/kvm-stat-arch/kvm-stat-arm64.c @@ -22,7 +22,7 @@ static void event_get_key(struct evsel *evsel, struct event_key *key) { key->info =3D 0; - key->key =3D evsel__intval(evsel, sample, kvm_exit_reason()); + key->key =3D evsel__intval(evsel, sample, kvm_exit_reason(EM_AARCH64)); key->exit_reasons =3D arm64_exit_reasons; =20 /* @@ -40,14 +40,14 @@ static bool event_begin(struct evsel *evsel, struct perf_sample *sample __maybe_unused, struct event_key *key __maybe_unused) { - return evsel__name_is(evsel, kvm_entry_trace()); + return evsel__name_is(evsel, kvm_entry_trace(EM_AARCH64)); } =20 static bool event_end(struct evsel *evsel, struct perf_sample *sample, struct event_key *key) { - if (evsel__name_is(evsel, kvm_exit_trace())) { + if (evsel__name_is(evsel, kvm_exit_trace(EM_AARCH64))) { event_get_key(evsel, sample, key); return true; } diff --git a/tools/perf/util/kvm-stat-arch/kvm-stat-loongarch.c b/tools/per= f/util/kvm-stat-arch/kvm-stat-loongarch.c index a15ce072ac34..66c07e3ca40f 100644 --- a/tools/perf/util/kvm-stat-arch/kvm-stat-loongarch.c +++ b/tools/perf/util/kvm-stat-arch/kvm-stat-loongarch.c @@ -70,7 +70,7 @@ static bool event_end(struct evsel *evsel, * kvm:kvm_enter means returning to vmm and then to guest * kvm:kvm_reenter means returning to guest immediately */ - return evsel__name_is(evsel, kvm_entry_trace()) || + return evsel__name_is(evsel, kvm_entry_trace(EM_LOONGARCH)) || evsel__name_is(evsel, kvm_reenter_trace); } =20 diff --git a/tools/perf/util/kvm-stat-arch/kvm-stat-riscv.c b/tools/perf/ut= il/kvm-stat-arch/kvm-stat-riscv.c index b2c5d3220795..8d4d5d6ce720 100644 --- a/tools/perf/util/kvm-stat-arch/kvm-stat-riscv.c +++ b/tools/perf/util/kvm-stat-arch/kvm-stat-riscv.c @@ -27,7 +27,7 @@ static void event_get_key(struct evsel *evsel, int xlen =3D 64; // TODO: 32-bit support. =20 key->info =3D 0; - key->key =3D evsel__intval(evsel, sample, kvm_exit_reason()) & ~CAUSE_IRQ= _FLAG(xlen); + key->key =3D evsel__intval(evsel, sample, kvm_exit_reason(EM_RISCV)) & ~C= AUSE_IRQ_FLAG(xlen); key->exit_reasons =3D riscv_exit_reasons; } =20 @@ -35,14 +35,14 @@ static bool event_begin(struct evsel *evsel, struct perf_sample *sample __maybe_unused, struct event_key *key __maybe_unused) { - return evsel__name_is(evsel, kvm_entry_trace()); + return evsel__name_is(evsel, kvm_entry_trace(EM_RISCV)); } =20 static bool event_end(struct evsel *evsel, struct perf_sample *sample, struct event_key *key) { - if (evsel__name_is(evsel, kvm_exit_trace())) { + if (evsel__name_is(evsel, kvm_exit_trace(EM_RISCV))) { event_get_key(evsel, sample, key); return true; } diff --git a/tools/perf/util/kvm-stat.c b/tools/perf/util/kvm-stat.c index b1affd97917b..858b5dbd39f6 100644 --- a/tools/perf/util/kvm-stat.c +++ b/tools/perf/util/kvm-stat.c @@ -6,7 +6,7 @@ =20 bool kvm_exit_event(struct evsel *evsel) { - return evsel__name_is(evsel, kvm_exit_trace()); + return evsel__name_is(evsel, kvm_exit_trace(evsel__e_machine(evsel))); } =20 void exit_event_get_key(struct evsel *evsel, @@ -14,7 +14,7 @@ void exit_event_get_key(struct evsel *evsel, struct event_key *key) { key->info =3D 0; - key->key =3D evsel__intval(evsel, sample, kvm_exit_reason()); + key->key =3D evsel__intval(evsel, sample, kvm_exit_reason(evsel__e_machi= ne(evsel))); } =20 =20 @@ -31,7 +31,7 @@ bool exit_event_begin(struct evsel *evsel, =20 bool kvm_entry_event(struct evsel *evsel) { - return evsel__name_is(evsel, kvm_entry_trace()); + return evsel__name_is(evsel, kvm_entry_trace(evsel__e_machine(evsel))); } =20 bool exit_event_end(struct evsel *evsel, @@ -66,9 +66,9 @@ void exit_event_decode_key(struct perf_kvm_stat *kvm, scnprintf(decode, KVM_EVENT_NAME_LEN, "%s", exit_reason); } =20 -int setup_kvm_events_tp(struct perf_kvm_stat *kvm) +int setup_kvm_events_tp(struct perf_kvm_stat *kvm, uint16_t e_machine) { - switch (EM_HOST) { + switch (e_machine) { case EM_PPC: case EM_PPC64: return __setup_kvm_events_tp_powerpc(kvm); @@ -77,9 +77,9 @@ int setup_kvm_events_tp(struct perf_kvm_stat *kvm) } } =20 -int cpu_isa_init(struct perf_kvm_stat *kvm, const char *cpuid) +int cpu_isa_init(struct perf_kvm_stat *kvm, uint16_t e_machine, const char= *cpuid) { - switch (EM_HOST) { + switch (e_machine) { case EM_AARCH64: return __cpu_isa_init_arm64(kvm); case EM_LOONGARCH: @@ -95,14 +95,14 @@ int cpu_isa_init(struct perf_kvm_stat *kvm, const char = *cpuid) case EM_386: return __cpu_isa_init_x86(kvm, cpuid); default: - pr_err("Unsupported kvm-stat host %d\n", EM_HOST); + pr_err("Unsupported kvm-stat host %d\n", e_machine); return -1; } } =20 -const char *vcpu_id_str(void) +const char *vcpu_id_str(uint16_t e_machine) { - switch (EM_HOST) { + switch (e_machine) { case EM_AARCH64: case EM_RISCV: case EM_S390: @@ -114,14 +114,14 @@ const char *vcpu_id_str(void) case EM_386: return "vcpu_id"; default: - pr_err("Unsupported kvm-stat host %d\n", EM_HOST); + pr_err("Unsupported kvm-stat host %d\n", e_machine); return NULL; } } =20 -const char *kvm_exit_reason(void) +const char *kvm_exit_reason(uint16_t e_machine) { - switch (EM_HOST) { + switch (e_machine) { case EM_AARCH64: return "ret"; case EM_LOONGARCH: @@ -137,14 +137,14 @@ const char *kvm_exit_reason(void) case EM_386: return "exit_reason"; default: - pr_err("Unsupported kvm-stat host %d\n", EM_HOST); + pr_err("Unsupported kvm-stat host %d\n", e_machine); return NULL; } } =20 -const char *kvm_entry_trace(void) +const char *kvm_entry_trace(uint16_t e_machine) { - switch (EM_HOST) { + switch (e_machine) { case EM_AARCH64: case EM_RISCV: case EM_X86_64: @@ -158,14 +158,14 @@ const char *kvm_entry_trace(void) case EM_S390: return "kvm:kvm_s390_sie_enter"; default: - pr_err("Unsupported kvm-stat host %d\n", EM_HOST); + pr_err("Unsupported kvm-stat host %d\n", e_machine); return NULL; } } =20 -const char *kvm_exit_trace(void) +const char *kvm_exit_trace(uint16_t e_machine) { - switch (EM_HOST) { + switch (e_machine) { case EM_AARCH64: case EM_LOONGARCH: case EM_RISCV: @@ -178,14 +178,14 @@ const char *kvm_exit_trace(void) case EM_S390: return "kvm:kvm_s390_sie_exit"; default: - pr_err("Unsupported kvm-stat host %d\n", EM_HOST); + pr_err("Unsupported kvm-stat host %d\n", e_machine); return NULL; } } =20 -const char * const *kvm_events_tp(void) +const char * const *kvm_events_tp(uint16_t e_machine) { - switch (EM_HOST) { + switch (e_machine) { case EM_AARCH64: return __kvm_events_tp_arm64(); case EM_LOONGARCH: @@ -201,14 +201,14 @@ const char * const *kvm_events_tp(void) case EM_386: return __kvm_events_tp_x86(); default: - pr_err("Unsupported kvm-stat host %d\n", EM_HOST); + pr_err("Unsupported kvm-stat host %d\n", e_machine); return NULL; } } =20 -const struct kvm_reg_events_ops *kvm_reg_events_ops(void) +const struct kvm_reg_events_ops *kvm_reg_events_ops(uint16_t e_machine) { - switch (EM_HOST) { + switch (e_machine) { case EM_AARCH64: return __kvm_reg_events_ops_arm64(); case EM_LOONGARCH: @@ -224,14 +224,14 @@ const struct kvm_reg_events_ops *kvm_reg_events_ops(v= oid) case EM_386: return __kvm_reg_events_ops_x86(); default: - pr_err("Unsupported kvm-stat host %d\n", EM_HOST); + pr_err("Unsupported kvm-stat host %d\n", e_machine); return NULL; } } =20 -const char * const *kvm_skip_events(void) +const char * const *kvm_skip_events(uint16_t e_machine) { - switch (EM_HOST) { + switch (e_machine) { case EM_AARCH64: return __kvm_skip_events_arm64(); case EM_LOONGARCH: @@ -247,14 +247,14 @@ const char * const *kvm_skip_events(void) case EM_386: return __kvm_skip_events_x86(); default: - pr_err("Unsupported kvm-stat host %d\n", EM_HOST); + pr_err("Unsupported kvm-stat host %d\n", e_machine); return NULL; } } =20 -int kvm_add_default_arch_event(int *argc, const char **argv) +int kvm_add_default_arch_event(uint16_t e_machine, int *argc, const char *= *argv) { - switch (EM_HOST) { + switch (e_machine) { case EM_PPC: case EM_PPC64: return __kvm_add_default_arch_event_powerpc(argc, argv); diff --git a/tools/perf/util/kvm-stat.h b/tools/perf/util/kvm-stat.h index a54cd4496df9..794dc8ed1e52 100644 --- a/tools/perf/util/kvm-stat.h +++ b/tools/perf/util/kvm-stat.h @@ -138,10 +138,10 @@ bool kvm_entry_event(struct evsel *evsel); /* * arch specific callbacks and data structures */ -int setup_kvm_events_tp(struct perf_kvm_stat *kvm); +int setup_kvm_events_tp(struct perf_kvm_stat *kvm, uint16_t e_machine); int __setup_kvm_events_tp_powerpc(struct perf_kvm_stat *kvm); =20 -int cpu_isa_init(struct perf_kvm_stat *kvm, const char *cpuid); +int cpu_isa_init(struct perf_kvm_stat *kvm, uint16_t e_machine, const char= *cpuid); int __cpu_isa_init_arm64(struct perf_kvm_stat *kvm); int __cpu_isa_init_loongarch(struct perf_kvm_stat *kvm); int __cpu_isa_init_powerpc(struct perf_kvm_stat *kvm); @@ -149,12 +149,12 @@ int __cpu_isa_init_riscv(struct perf_kvm_stat *kvm); int __cpu_isa_init_s390(struct perf_kvm_stat *kvm, const char *cpuid); int __cpu_isa_init_x86(struct perf_kvm_stat *kvm, const char *cpuid); =20 -const char *vcpu_id_str(void); -const char *kvm_exit_reason(void); -const char *kvm_entry_trace(void); -const char *kvm_exit_trace(void); +const char *vcpu_id_str(uint16_t e_machine); +const char *kvm_exit_reason(uint16_t e_machine); +const char *kvm_entry_trace(uint16_t e_machine); +const char *kvm_exit_trace(uint16_t e_machine); =20 -const char * const *kvm_events_tp(void); +const char * const *kvm_events_tp(uint16_t e_machine); const char * const *__kvm_events_tp_arm64(void); const char * const *__kvm_events_tp_loongarch(void); const char * const *__kvm_events_tp_powerpc(void); @@ -162,7 +162,7 @@ const char * const *__kvm_events_tp_riscv(void); const char * const *__kvm_events_tp_s390(void); const char * const *__kvm_events_tp_x86(void); =20 -const struct kvm_reg_events_ops *kvm_reg_events_ops(void); +const struct kvm_reg_events_ops *kvm_reg_events_ops(uint16_t e_machine); const struct kvm_reg_events_ops *__kvm_reg_events_ops_arm64(void); const struct kvm_reg_events_ops *__kvm_reg_events_ops_loongarch(void); const struct kvm_reg_events_ops *__kvm_reg_events_ops_powerpc(void); @@ -170,7 +170,7 @@ const struct kvm_reg_events_ops *__kvm_reg_events_ops_r= iscv(void); const struct kvm_reg_events_ops *__kvm_reg_events_ops_s390(void); const struct kvm_reg_events_ops *__kvm_reg_events_ops_x86(void); =20 -const char * const *kvm_skip_events(void); +const char * const *kvm_skip_events(uint16_t e_machine); const char * const *__kvm_skip_events_arm64(void); const char * const *__kvm_skip_events_loongarch(void); const char * const *__kvm_skip_events_powerpc(void); @@ -178,7 +178,7 @@ const char * const *__kvm_skip_events_riscv(void); const char * const *__kvm_skip_events_s390(void); const char * const *__kvm_skip_events_x86(void); =20 -int kvm_add_default_arch_event(int *argc, const char **argv); +int kvm_add_default_arch_event(uint16_t e_machine, int *argc, const char *= *argv); int __kvm_add_default_arch_event_powerpc(int *argc, const char **argv); int __kvm_add_default_arch_event_x86(int *argc, const char **argv); =20 --=20 2.53.0.rc1.225.gd81095ad13-goog From nobody Sat Feb 7 12:19:40 2026 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0701A36EAA9 for ; Sat, 31 Jan 2026 20:02:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769889759; cv=none; b=aQlGBtcrPr3UNOmjFeB5WO55mqICVBnkXwMaYfWhdb/6b80RQmfpdsi3ABhq9ymcInJ7ZGhzAxZiYHil9Sn7lgg6a+aHL29aARxhArfZKw5QetFrwOFGFlwcRBXzQQZ9XoUcdjw2Hvyk3OaBVVs0uM5kjoz0zOBBbzlA5bP7ESU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769889759; c=relaxed/simple; bh=7n7fpTuVsLpW5dTaoi783s2qeiHqMmMBKZjZu/WCqdM=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=NCGhIcaHefuX/EwYI4vWnLWnYFhWWt0BOCrnnBprS2spNM+VlwJpYG1c0p3h7ZlfTLj09dFX9n18Ov4QlJnahMWqVngJNMYRzNeOUOIS8edmjVJKB4Sqe3NCxJD5ILu9DULAbQ1fRqZKJbVl84gK9Q+Zn5QY1eyqOz/k7gifbc4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Ehpd3Ood; arc=none smtp.client-ip=209.85.215.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Ehpd3Ood" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-b6ce1b57b9cso1761889a12.1 for ; Sat, 31 Jan 2026 12:02:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1769889757; x=1770494557; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=CH19sZmi6OhmnuWmP/MMQ8cKU7/WOZcdh//pactV2Lg=; b=Ehpd3OodArfedbo+1eKeaZnTS8nAgsMUigigfs7+K2MAYHIdZahy42HZ4rz8X1W1bz gyu9hSpO0AM5lEA33Vm8KMaxx0khOFS3Z/qVD2bZU6cBBB/rW4YDejPZiooHvd69hYGQ COq4WQRRYT7r5qumAfhJ2j7VE4pF+tUyMdkksBM0IAAWql0jkuGhQkpH32c41zcmK1EK AU9wllHSGQe8QIfAMD8wIUkvOTEMearNEDGFBuY5bAVG2F9uhRJwAjd5YzLHqteRI7rF Cdi/LGiCLeZD/5qqId9aLPCRgQARKgtky8BZ9P1OrLP0NPz6OyaoCtRf4jto8CLDf4a/ ZoOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769889757; x=1770494557; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=CH19sZmi6OhmnuWmP/MMQ8cKU7/WOZcdh//pactV2Lg=; b=wjY86TedtqDdQNAJwZr1PSBrToCrGsiWHYRf4FGOMf6nEwT/Qan719R5XFdvlilFU/ BUanaXt3Ta+F8bP/kWVpgEVF9rjGby2cWRTJzpsKNZQyyQiVaAUwUYbDP6GcfyZ8oNL4 jlDL775q1VNcT0VJOjNyAwzMX4tYCB5SKVHaiuPM+B+P48bLl3MmCKvhq8Cg8/zxdxoC tiXaXK+im5rePcB0wgThttOk14hfqf79cMEgl74v14utEuNtd4OsWfkqkCv/BDbcFLFa ghe7mwqtHOxOj8GEG+gjZjY/TY+S8hAYcHpO6mpn9SaHnKrwM8q7odD9laIeRwZORL6y Mu7w== X-Forwarded-Encrypted: i=1; AJvYcCX6ozodqovRLryWvlKp2CEXoBhRNlIccR9LOTSRmiSvIUuT3iUPtmI0Vv278wWYmIXv/kZt1aNcRQ2aMjI=@vger.kernel.org X-Gm-Message-State: AOJu0Yxev+Tx8jujmX3u3VwQvQuoEfbDeb0zN9MWpP9xfxAG2V95h1wA QqvBnMxwA/95qxO0skHRdVprmIIqvv56VxhV/+3luYJi/poIIFJCtFkbwxDox1uEV5JcP3lCTYc d9S+n8zz7xg== X-Received: from pgvz8.prod.google.com ([2002:a65:6648:0:b0:bd9:a349:94a8]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:3d19:b0:348:b7a1:431 with SMTP id adf61e73a8af0-392dffe0bbemr7270573637.10.1769889757129; Sat, 31 Jan 2026 12:02:37 -0800 (PST) Date: Sat, 31 Jan 2026 12:02:22 -0800 In-Reply-To: <20260131200224.1296136-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260131200224.1296136-1-irogers@google.com> X-Mailer: git-send-email 2.53.0.rc1.225.gd81095ad13-goog Message-ID: <20260131200224.1296136-5-irogers@google.com> Subject: [PATCH v2 4/6] perf session: Add e_flags to the e_machine helper From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , John Garry , Will Deacon , Mike Leach , Leo Yan , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti , Shimin Guo , Yunseong Kim , Athira Rajeev , Quan Zhou , Andrew Jones , Anup Patel , Dapeng Mi , Thomas Falcon , Blake Jones , Swapnil Sapkal , Kan Liang , Howard Chu , Anubhav Shelat , Aditya Bodkhe , Chun-Tse Shao , Andi Kleen , Dmitry Vyukov , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-riscv@lists.infradead.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Allow e_flags as well as e_machine to be computed using the e_machine helper. This isn't currently used, the argument is always NULL, but it will be used for a new header feature. Signed-off-by: Ian Rogers --- tools/perf/builtin-kvm.c | 9 +++++---- tools/perf/builtin-report.c | 4 ++-- tools/perf/builtin-script.c | 6 ++++-- tools/perf/util/evsel.c | 6 +++--- tools/perf/util/evsel.h | 2 +- tools/perf/util/kvm-stat.c | 12 ++++++++--- tools/perf/util/session.c | 40 +++++++++++++++++++++++++++---------- tools/perf/util/session.h | 2 +- 8 files changed, 55 insertions(+), 26 deletions(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 93ba07c58290..0c5e6b3aac74 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -902,7 +902,7 @@ static bool handle_end_event(struct perf_kvm_stat *kvm, =20 if (kvm->duration && time_diff > kvm->duration) { char decode[KVM_EVENT_NAME_LEN]; - uint16_t e_machine =3D perf_session__e_machine(kvm->session); + uint16_t e_machine =3D perf_session__e_machine(kvm->session, /*e_flags= =3D*/NULL); =20 kvm->events_ops->decode_key(kvm, &event->key, decode); if (!skip_event(e_machine, decode)) { @@ -1187,7 +1187,7 @@ static int cpu_isa_config(struct perf_kvm_stat *kvm) return -EINVAL; } =20 - e_machine =3D perf_session__e_machine(kvm->session); + e_machine =3D perf_session__e_machine(kvm->session, /*e_flags=3D*/NULL); err =3D cpu_isa_init(kvm, e_machine, cpuid); if (err =3D=3D -ENOTSUP) pr_err("CPU %s is not supported.\n", cpuid); @@ -1549,7 +1549,7 @@ static int kvm_live_open_events(struct perf_kvm_stat = *kvm) static int read_events(struct perf_kvm_stat *kvm) { int ret; - + uint16_t e_machine; struct perf_data file =3D { .path =3D kvm->file_name, .mode =3D PERF_DATA_MODE_READ, @@ -1574,7 +1574,8 @@ static int read_events(struct perf_kvm_stat *kvm) goto out_delete; } =20 - if (!register_kvm_events_ops(kvm, perf_session__e_machine(kvm->session)))= { + e_machine =3D perf_session__e_machine(kvm->session, /*e_flags=3D*/NULL); + if (!register_kvm_events_ops(kvm, e_machine)) { ret =3D -EINVAL; goto out_delete; } diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index 810ffd66b11c..3b81f4b3dc49 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -448,7 +448,7 @@ static int report__setup_sample_type(struct report *rep) } } =20 - callchain_param_setup(sample_type, perf_session__e_machine(session)); + callchain_param_setup(sample_type, perf_session__e_machine(session, /*e_f= lags=3D*/NULL)); =20 if (rep->stitch_lbr && (callchain_param.record_mode !=3D CALLCHAIN_LBR)) { ui__warning("Can't find LBR callchain. Switch off --stitch-lbr.\n" @@ -1296,7 +1296,7 @@ static int process_attr(const struct perf_tool *tool = __maybe_unused, */ sample_type =3D evlist__combined_sample_type(*pevlist); session =3D (*pevlist)->session; - callchain_param_setup(sample_type, perf_session__e_machine(session)); + callchain_param_setup(sample_type, perf_session__e_machine(session, /*e_f= lags=3D*/NULL)); return 0; } =20 diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index c7d5a325b5cb..14c6f6c3c4f2 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -2818,6 +2818,7 @@ static int process_attr(const struct perf_tool *tool,= union perf_event *event, struct perf_script *scr =3D container_of(tool, struct perf_script, tool); struct evlist *evlist; struct evsel *evsel, *pos; + uint16_t e_machine; u64 sample_type; int err; =20 @@ -2859,7 +2860,8 @@ static int process_attr(const struct perf_tool *tool,= union perf_event *event, * on events sample_type. */ sample_type =3D evlist__combined_sample_type(evlist); - callchain_param_setup(sample_type, perf_session__e_machine(evsel__session= (evsel))); + e_machine =3D perf_session__e_machine(evsel__session(evsel), /*e_flags=3D= */NULL); + callchain_param_setup(sample_type, e_machine); =20 /* Enable fields for callchain entries */ if (symbol_conf.use_callchain && @@ -3834,7 +3836,7 @@ static void script__setup_sample_type(struct perf_scr= ipt *script) struct perf_session *session =3D script->session; u64 sample_type =3D evlist__combined_sample_type(session->evlist); =20 - callchain_param_setup(sample_type, perf_session__e_machine(session)); + callchain_param_setup(sample_type, perf_session__e_machine(session, /*e_f= lags=3D*/NULL)); =20 if (script->stitch_lbr && (callchain_param.record_mode !=3D CALLCHAIN_LBR= )) { pr_warning("Can't find LBR callchain. Switch off --stitch-lbr.\n" diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 848d0faf6698..aff44ffd3ff1 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -1008,11 +1008,11 @@ int evsel__group_desc(struct evsel *evsel, char *bu= f, size_t size) return ret; } =20 -uint16_t evsel__e_machine(struct evsel *evsel) +uint16_t evsel__e_machine(struct evsel *evsel, uint32_t *e_flags) { struct perf_session *session =3D evsel__session(evsel); =20 - return session ? perf_session__e_machine(session) : EM_HOST; + return perf_session__e_machine(session, e_flags); } =20 static void __evsel__config_callchain(struct evsel *evsel, struct record_o= pts *opts, @@ -1050,7 +1050,7 @@ static void __evsel__config_callchain(struct evsel *e= vsel, struct record_opts *o =20 if (param->record_mode =3D=3D CALLCHAIN_DWARF) { if (!function) { - uint16_t e_machine =3D evsel__e_machine(evsel); + uint16_t e_machine =3D evsel__e_machine(evsel, /*e_flags=3D*/NULL); =20 evsel__set_sample_bit(evsel, REGS_USER); evsel__set_sample_bit(evsel, STACK_USER); diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index eefb5d569971..a3d754c029a0 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -546,7 +546,7 @@ static inline bool evsel__is_dummy_event(struct evsel *= evsel) =20 struct perf_session *evsel__session(struct evsel *evsel); struct perf_env *evsel__env(struct evsel *evsel); -uint16_t evsel__e_machine(struct evsel *evsel); +uint16_t evsel__e_machine(struct evsel *evsel, uint32_t *e_flags); =20 int evsel__store_ids(struct evsel *evsel, struct evlist *evlist); =20 diff --git a/tools/perf/util/kvm-stat.c b/tools/perf/util/kvm-stat.c index 858b5dbd39f6..27f16810498c 100644 --- a/tools/perf/util/kvm-stat.c +++ b/tools/perf/util/kvm-stat.c @@ -6,15 +6,19 @@ =20 bool kvm_exit_event(struct evsel *evsel) { - return evsel__name_is(evsel, kvm_exit_trace(evsel__e_machine(evsel))); + uint16_t e_machine =3D evsel__e_machine(evsel, /*e_flags=3D*/NULL); + + return evsel__name_is(evsel, kvm_exit_trace(e_machine)); } =20 void exit_event_get_key(struct evsel *evsel, struct perf_sample *sample, struct event_key *key) { + uint16_t e_machine =3D evsel__e_machine(evsel, /*e_flags=3D*/NULL); + key->info =3D 0; - key->key =3D evsel__intval(evsel, sample, kvm_exit_reason(evsel__e_machi= ne(evsel))); + key->key =3D evsel__intval(evsel, sample, kvm_exit_reason(e_machine)); } =20 =20 @@ -31,7 +35,9 @@ bool exit_event_begin(struct evsel *evsel, =20 bool kvm_entry_event(struct evsel *evsel) { - return evsel__name_is(evsel, kvm_entry_trace(evsel__e_machine(evsel))); + uint16_t e_machine =3D evsel__e_machine(evsel, /*e_flags=3D*/NULL); + + return evsel__name_is(evsel, kvm_entry_trace(e_machine)); } =20 bool exit_event_end(struct evsel *evsel, diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index d0053618f540..72e8bb67d740 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -2964,27 +2964,47 @@ struct perf_env *perf_session__env(struct perf_sess= ion *session) return &session->header.env; } =20 -static int perf_session__e_machine_cb(struct thread *thread, - void *arg __maybe_unused) +struct perf_session__e_machine_cb_args { + uint32_t e_flags; + uint16_t e_machine; + bool need_e_flags; +}; + +static int perf_session__e_machine_cb(struct thread *thread, void *_args) { - uint16_t *result =3D arg; + struct perf_session__e_machine_cb_args *args =3D _args; struct machine *machine =3D maps__machine(thread__maps(thread)); =20 - *result =3D thread__e_machine(thread, machine, /*e_flags=3D*/NULL); - return *result !=3D EM_NONE ? 1 : 0; + args->e_machine =3D thread__e_machine(thread, machine, + args->need_e_flags ? &args->e_flags : NULL); + return args->e_machine !=3D EM_NONE ? 1 : 0; } =20 /* * Note, a machine may have mixed 32-bit and 64-bit processes and so mixed * e_machines. Use thread__e_machine when this matters. */ -uint16_t perf_session__e_machine(struct perf_session *session) +uint16_t perf_session__e_machine(struct perf_session *session, uint32_t *e= _flags) { - uint16_t e_machine =3D EM_NONE; + struct perf_session__e_machine_cb_args args =3D { + .e_machine =3D EM_NONE, + .need_e_flags =3D e_flags !=3D NULL, + }; + + if (!session) { + /* Default to assuming a host machine. */ + if (e_flags) + *e_flags =3D EF_HOST; + + return EM_HOST; + } =20 machines__for_each_thread(&session->machines, - perf_session__e_machine_cb, - &e_machine); + perf_session__e_machine_cb, + &args); + + if (e_flags) + *e_flags =3D args.e_flags; =20 - return e_machine =3D=3D EM_NONE ? EM_HOST : e_machine; + return args.e_machine =3D=3D EM_NONE ? EM_HOST : args.e_machine; } diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h index eddc4c630b33..f05f0d4a6c23 100644 --- a/tools/perf/util/session.h +++ b/tools/perf/util/session.h @@ -211,6 +211,6 @@ int perf_event__process_finished_round(const struct per= f_tool *tool, struct ordered_events *oe); =20 struct perf_env *perf_session__env(struct perf_session *session); -uint16_t perf_session__e_machine(struct perf_session *session); +uint16_t perf_session__e_machine(struct perf_session *session, uint32_t *e= _flags); =20 #endif /* __PERF_SESSION_H */ --=20 2.53.0.rc1.225.gd81095ad13-goog From nobody Sat Feb 7 12:19:40 2026 Received: from mail-dy1-f201.google.com (mail-dy1-f201.google.com [74.125.82.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 275D336EA85 for ; Sat, 31 Jan 2026 20:02:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769889761; cv=none; b=ACggOHi5c+UgsCTFvYRQ6D7GYNCGmTFdpd6b5YZb5pDCG7H+ptANRgX7Qeh2YNQnVVnZfuMjaMvn8TYmUdzDh0C8ruh94EelEkAudyIPl/Q2mP23qTUHozNswUGGtAm13a3uNl0Xq2/ERl2nvqDsStGfil1UNuakR0mvBpPLcFc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769889761; c=relaxed/simple; bh=OzSHZgVSQiPsRKExjnMPTpTbG3IhOOTKw3fuldg3o4k=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=LYj9ZKAaHDf+IlocZBTDfiRK0l0P+ryuIA/5REByWvwWdm2lVgGW6FafutL5oc6lDz2sYmb5p6mO4XVxVGXKk/70eoMx3vKKHpUMZZDfLbZd7IXKqqMVxSzPU2rwmA2+WU2YvYyOeKwB1s8TuchmYrvAqknQh0TYHqP4YNRuR98= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=KSfIHd2H; arc=none smtp.client-ip=74.125.82.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="KSfIHd2H" Received: by mail-dy1-f201.google.com with SMTP id 5a478bee46e88-2b7ef896edcso2308960eec.0 for ; Sat, 31 Jan 2026 12:02:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1769889759; x=1770494559; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=hbIIGfMQy8kU/29JW+xHk5T5mRSTZKfA14hCK/ZK1Tw=; b=KSfIHd2HBrbZCM+FKwPAInhYPbUEazvXCZHwsFC3+q80lQN22WeqQa+ufNMm0h+wq9 by5LsKtLPUxbXv/Ay+ZOTeMoU9QSaTe54B3yZ9It1htNQCR5OY1NljAO2jhHtS57mkVs 1EM++xo86V8bh6dAOokEKIPdP3KGExGwGmKxYf5HnhL0qG6RsjS1SPrGbZKmNmuaSLS/ To1m2gQc7jClwvOuZ0DgpYcFCxYl0YLu3oYKRA6YJVb7Iqsgc+u9FzmA2EQJy+pn+ae+ Wjw1bFGZYOjIyEuEEfQG2qF+fPf1KxEZt2tHwY7YylEJ/+LoqVOLzrpp/H5YMCjbm/Mt IAsQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769889759; x=1770494559; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=hbIIGfMQy8kU/29JW+xHk5T5mRSTZKfA14hCK/ZK1Tw=; b=pajJBt9WSO119rsZ4BFLfzkqlvdwYqLb7w+EbeLeWhifDQY6JBeihRdbgN+Znfov1m IIrTFPA5cUL/8Iz7wS32qGABUCp9egqbn59jME8ZYEJt2eQOe+OT25lF8bGULLUdS3Tr K14YjoXYQHPiBe7Lz0/lEFPZpFgbymbeez/ivaMUFBY1S9B0kDHQZjTybWafoVYJbefd MaEX2QMI8wL4znWRGVD0PNXAKX5CIAvT4S9FPmAwhJeEpf8iITCycpaSKHjxj/47yZnu w3GelCgP+tyKK3i/P4438lxjFct9f2+oJjwefpP9nVFKwkT5pU4/deYoNkfHjXTN7CxK gttQ== X-Forwarded-Encrypted: i=1; AJvYcCU4fIb9q54C/Z4aLrpHQVnR0AIfbJi0ugq06wUgPANWAKEVoTsr5aOx6W2aaxDruWYzBH2y9BCDJSsPZug=@vger.kernel.org X-Gm-Message-State: AOJu0YxiJgaYXN9d/zgG5eDDQ47y6uCmXl8GSyZNRWH0xJPaQZkC0TBj segFGLJQHJgO8bnhWCH6ZSzJwbO565SowoEluITXy+lo7ecZRolRM+qfMZdcZD7YqAT/iGBwEi4 FP+dgyx7aaA== X-Received: from dycoz4.prod.google.com ([2002:a05:7301:fc84:b0:2b6:bdce:fb0]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7300:434f:b0:2b7:1746:c947 with SMTP id 5a478bee46e88-2b7c86268ebmr3367037eec.6.1769889759132; Sat, 31 Jan 2026 12:02:39 -0800 (PST) Date: Sat, 31 Jan 2026 12:02:23 -0800 In-Reply-To: <20260131200224.1296136-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260131200224.1296136-1-irogers@google.com> X-Mailer: git-send-email 2.53.0.rc1.225.gd81095ad13-goog Message-ID: <20260131200224.1296136-6-irogers@google.com> Subject: [PATCH v2 5/6] perf header: Add e_machine/e_flags to the header From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , John Garry , Will Deacon , Mike Leach , Leo Yan , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti , Shimin Guo , Yunseong Kim , Athira Rajeev , Quan Zhou , Andrew Jones , Anup Patel , Dapeng Mi , Thomas Falcon , Blake Jones , Swapnil Sapkal , Kan Liang , Howard Chu , Anubhav Shelat , Aditya Bodkhe , Chun-Tse Shao , Andi Kleen , Dmitry Vyukov , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-riscv@lists.infradead.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add 64-bits of feature data to record the ELF machine and flags. This allows readers to initialize based on the data. For example, `perf kvm stat` wants to initialize based on the kind of data to be read, but at initialization time there are no threads to base this data upon and using the host means cross platform support won't work. The values in the perf_env also act as a cache for these within the session. Signed-off-by: Ian Rogers --- tools/perf/util/env.h | 3 +++ tools/perf/util/header.c | 33 +++++++++++++++++++++++++++++++++ tools/perf/util/header.h | 1 + tools/perf/util/session.c | 33 +++++++++++++++++++++++++++------ 4 files changed, 64 insertions(+), 6 deletions(-) diff --git a/tools/perf/util/env.h b/tools/perf/util/env.h index 76ba1a36e9ff..a4501cbca375 100644 --- a/tools/perf/util/env.h +++ b/tools/perf/util/env.h @@ -74,6 +74,9 @@ struct perf_env { char *os_release; char *version; char *arch; + /* e_machine expanded from 16 to 32-bits for alignment. */ + u32 e_machine; + u32 e_flags; int nr_cpus_online; int nr_cpus_avail; char *cpu_desc; diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index eefd1cd73b6a..196bbe0c8407 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -378,6 +378,21 @@ static int write_arch(struct feat_fd *ff, return do_write_string(ff, uts.machine); } =20 +static int write_e_machine(struct feat_fd *ff, + struct evlist *evlist __maybe_unused) +{ + /* e_machine expanded from 16 to 32-bits for alignment. */ + uint32_t e_flags; + uint32_t e_machine =3D perf_session__e_machine(evlist->session, &e_flags); + int ret; + + ret =3D do_write(ff, &e_machine, sizeof(e_machine)); + if (ret) + return ret; + + return do_write(ff, &e_flags, sizeof(e_flags)); +} + static int write_version(struct feat_fd *ff, struct evlist *evlist __maybe_unused) { @@ -1784,6 +1799,12 @@ static void print_arch(struct feat_fd *ff, FILE *fp) fprintf(fp, "# arch : %s\n", ff->ph->env.arch); } =20 +static void print_e_machine(struct feat_fd *ff, FILE *fp) +{ + fprintf(fp, "# e_machine : %u\n", ff->ph->env.e_machine); + fprintf(fp, "# e_flags : %u\n", ff->ph->env.e_flags); +} + static void print_cpudesc(struct feat_fd *ff, FILE *fp) { fprintf(fp, "# cpudesc : %s\n", ff->ph->env.cpu_desc); @@ -2611,6 +2632,17 @@ FEAT_PROCESS_STR_FUN(arch, arch); FEAT_PROCESS_STR_FUN(cpudesc, cpu_desc); FEAT_PROCESS_STR_FUN(cpuid, cpuid); =20 +static int process_e_machine(struct feat_fd *ff, void *data __maybe_unused) +{ + int ret; + + ret =3D do_read_u32(ff, &ff->ph->env.e_machine); + if (ret) + return ret; + + return do_read_u32(ff, &ff->ph->env.e_flags); +} + #ifdef HAVE_LIBTRACEEVENT static int process_tracing_data(struct feat_fd *ff, void *data) { @@ -3729,6 +3761,7 @@ const struct perf_header_feature_ops feat_ops[HEADER_= LAST_FEATURE] =3D { FEAT_OPN(HYBRID_TOPOLOGY, hybrid_topology, true), FEAT_OPR(PMU_CAPS, pmu_caps, false), FEAT_OPR(CPU_DOMAIN_INFO, cpu_domain_info, true), + FEAT_OPR(E_MACHINE, e_machine, false), }; =20 struct header_print_data { diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h index 36cc74e2d14d..cc40ac796f52 100644 --- a/tools/perf/util/header.h +++ b/tools/perf/util/header.h @@ -54,6 +54,7 @@ enum { HEADER_HYBRID_TOPOLOGY, HEADER_PMU_CAPS, HEADER_CPU_DOMAIN_INFO, + HEADER_E_MACHINE, HEADER_LAST_FEATURE, HEADER_FEAT_BITS =3D 256, }; diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 72e8bb67d740..53f51c3f9603 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -2967,7 +2967,6 @@ struct perf_env *perf_session__env(struct perf_sessio= n *session) struct perf_session__e_machine_cb_args { uint32_t e_flags; uint16_t e_machine; - bool need_e_flags; }; =20 static int perf_session__e_machine_cb(struct thread *thread, void *_args) @@ -2975,8 +2974,7 @@ static int perf_session__e_machine_cb(struct thread *= thread, void *_args) struct perf_session__e_machine_cb_args *args =3D _args; struct machine *machine =3D maps__machine(thread__maps(thread)); =20 - args->e_machine =3D thread__e_machine(thread, machine, - args->need_e_flags ? &args->e_flags : NULL); + args->e_machine =3D thread__e_machine(thread, machine, &args->e_flags); return args->e_machine !=3D EM_NONE ? 1 : 0; } =20 @@ -2988,8 +2986,8 @@ uint16_t perf_session__e_machine(struct perf_session = *session, uint32_t *e_flags { struct perf_session__e_machine_cb_args args =3D { .e_machine =3D EM_NONE, - .need_e_flags =3D e_flags !=3D NULL, }; + struct perf_env *env; =20 if (!session) { /* Default to assuming a host machine. */ @@ -2999,12 +2997,35 @@ uint16_t perf_session__e_machine(struct perf_sessio= n *session, uint32_t *e_flags return EM_HOST; } =20 + env =3D perf_session__env(session); + if (env && env->e_machine !=3D EM_NONE) { + if (e_flags) + *e_flags =3D env->e_flags; + + return env->e_machine; + } + machines__for_each_thread(&session->machines, perf_session__e_machine_cb, &args); =20 + if (args.e_machine !=3D EM_NONE) { + if (env) { + env->e_machine =3D args.e_machine; + env->e_flags =3D args.e_flags; + } + if (e_flags) + *e_flags =3D args.e_flags; + + return args.e_machine; + } + + /* + * Couldn't determine from the perf_env or current set of + * threads. Default to the host. + */ if (e_flags) - *e_flags =3D args.e_flags; + *e_flags =3D EF_HOST; =20 - return args.e_machine =3D=3D EM_NONE ? EM_HOST : args.e_machine; + return EM_HOST; } --=20 2.53.0.rc1.225.gd81095ad13-goog From nobody Sat Feb 7 12:19:40 2026 Received: from mail-dy1-f201.google.com (mail-dy1-f201.google.com [74.125.82.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EE496371053 for ; Sat, 31 Jan 2026 20:02:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769889763; cv=none; b=OUVQiNwxH5+aRHx9AOQmDH3czgKPyOxHhGVEymS66QyqsVTZuNPXdOr5RKgYmA0BJdCAKblfJ66mvTnWIYp5+KOzIl4J2GF3BF7qygG6jgCt7WfNHjI7z0oNHDsun9e3QyYGwlz43Mqr43+lEcib8jg39lIOpNgm+ZqgvYUvNR4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769889763; c=relaxed/simple; bh=d4upQRvP0lDqXZNMbJh/OXbkaabdEA1OKhcE2+JqhOA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=OgmxkUE59GlV3oVPqFv+rENQ+BWVpTDCsKOYTvDThPMK9DcDM5C3xGbXJ1Sxn7Pu6B4JfdAE42OZRaOoSfTztdY5SA3UV04Gi4+orIrPni61a1wSf8GAODDexBTfekvtBcJQNIgg6Omw4XBaCSdSc5ZktbwEQCmh+HbMr65ZxFU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=BHD1wGy+; arc=none smtp.client-ip=74.125.82.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="BHD1wGy+" Received: by mail-dy1-f201.google.com with SMTP id 5a478bee46e88-2b7155ca88cso3346006eec.1 for ; Sat, 31 Jan 2026 12:02:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1769889761; x=1770494561; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=yU/No/CiRXNK30X5BW5gARgpwLegeQsixxR3xJoI9G0=; b=BHD1wGy+XKylBq57TAt25VNR7heUwP3MnJr5Rjq/atmcGdblHY4wFrpMKMjigA16rs xAB8jJZ3a/yZPCN45knZVVDLbemZe+IjsrBHowAmpgxQNnbYWIr5iiaGJUKpoProxYUL XatGJfRehKLpwL/sMt9YBQ6vtHDQQH+U7ELVkRFS3JFaQDGNQssPRIOu7tLCgyXjynVj +DaHlkbQtAXmfIKl24uQQ35VbF6KhxPt9wEBiBJ3OsjQF1u+9bzd7KKX4Ly5u2OnKpPs UcqDvJe1ya/B0DwBRtNklCh9oVWBDpMGf/56BWmretONqdb1XPnrR3qVJd9GKHUj6PP3 gQKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769889761; x=1770494561; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=yU/No/CiRXNK30X5BW5gARgpwLegeQsixxR3xJoI9G0=; b=SJA46GHcKVAsmpreOhnHs7HdJnGDE12bBQl3j3yVNtKWSAhtJSAr8zStKUDEVztn9X i77z+GImJoAWEW1x1uS2if4PJt6KXPvhDM1xMlXNXyuhfBKXqJQRIVNWTZ96oisd9bzv vEnMGDYrGL2pci1ol4f1m24IWQ3yUDWoB0tjIRNs5StX79/pmgn5YVHEEBkUKHSsaSvA nqqdlKg+WMw1N53DU5WWkbAMyBTDqbkpX/oav+Ch65/g3A8tdIRVd6Kd1L4noJmQFby3 XWjA/areaHeMZ2UL3nIMKzPcF1SwUxfqbBdV/kXYGsBn4kvDknd2ct3Msny/G+zBOopv Z9FQ== X-Forwarded-Encrypted: i=1; AJvYcCUNnZvnI6i9aWf0d1euz46/YpYOquQiIfxxNR8597uIt68z+xj/zP/LLZaqoUTAm6rNNzNnryKS3k/wDdM=@vger.kernel.org X-Gm-Message-State: AOJu0YwXqnNsC50m4srkiNCvF2ZS3roqzsRfLNde7/XXwhJlryyS6Yoh HaVBtvtOgBY+xdMy6USoKai92+XtLXyAD2vYaPqh2ToBuYOjgqEpHmj7OpZsN9DmNmY2aLkTmtR g6iKvrmHAwQ== X-Received: from dyek9.prod.google.com ([2002:a05:7300:6409:b0:2b7:4867:6bd0]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:693c:2b13:b0:2ae:614a:330e with SMTP id 5a478bee46e88-2b7c8943db0mr3682412eec.41.1769889761125; Sat, 31 Jan 2026 12:02:41 -0800 (PST) Date: Sat, 31 Jan 2026 12:02:24 -0800 In-Reply-To: <20260131200224.1296136-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260131200224.1296136-1-irogers@google.com> X-Mailer: git-send-email 2.53.0.rc1.225.gd81095ad13-goog Message-ID: <20260131200224.1296136-7-irogers@google.com> Subject: [PATCH v2 6/6] perf thread: Don't require machine to compute the e_machine From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , John Garry , Will Deacon , Mike Leach , Leo Yan , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti , Shimin Guo , Yunseong Kim , Athira Rajeev , Quan Zhou , Andrew Jones , Anup Patel , Dapeng Mi , Thomas Falcon , Blake Jones , Swapnil Sapkal , Kan Liang , Howard Chu , Anubhav Shelat , Aditya Bodkhe , Chun-Tse Shao , Andi Kleen , Dmitry Vyukov , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-riscv@lists.infradead.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The machine can be calculated from a thread via its maps. Don't require the machine argument to simplify callers and also to delay computing the machine until a little later. Signed-off-by: Ian Rogers --- tools/perf/util/scripting-engines/trace-event-python.c | 8 +++----- tools/perf/util/session.c | 3 +-- tools/perf/util/thread.c | 5 +++++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools= /perf/util/scripting-engines/trace-event-python.c index 62c9c73daef5..2b0df7bd9a46 100644 --- a/tools/perf/util/scripting-engines/trace-event-python.c +++ b/tools/perf/util/scripting-engines/trace-event-python.c @@ -837,7 +837,6 @@ static PyObject *get_perf_sample_dict(struct perf_sampl= e *sample, PyObject *callchain) { PyObject *dict, *dict_sample, *brstack, *brstacksym; - struct machine *machine; uint16_t e_machine =3D EM_HOST; uint32_t e_flags =3D EF_HOST; =20 @@ -926,10 +925,9 @@ static PyObject *get_perf_sample_dict(struct perf_samp= le *sample, PyLong_FromUnsignedLongLong(sample->cyc_cnt)); } =20 - if (al->thread) { - machine =3D maps__machine(thread__maps(al->thread)); - e_machine =3D thread__e_machine(al->thread, machine, &e_flags); - } + if (al->thread) + e_machine =3D thread__e_machine(al->thread, /*machine=3D*/NULL, &e_flags= ); + if (set_regs_in_dict(dict, sample, evsel, e_machine, e_flags)) Py_FatalError("Failed to setting regs in dict"); =20 diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 53f51c3f9603..4b465abfa36c 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -2972,9 +2972,8 @@ struct perf_session__e_machine_cb_args { static int perf_session__e_machine_cb(struct thread *thread, void *_args) { struct perf_session__e_machine_cb_args *args =3D _args; - struct machine *machine =3D maps__machine(thread__maps(thread)); =20 - args->e_machine =3D thread__e_machine(thread, machine, &args->e_flags); + args->e_machine =3D thread__e_machine(thread, /*machine=3D*/NULL, &args->= e_flags); return args->e_machine !=3D EM_NONE ? 1 : 0; } =20 diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c index 618f29afb160..22be77225bb0 100644 --- a/tools/perf/util/thread.c +++ b/tools/perf/util/thread.c @@ -499,6 +499,11 @@ uint16_t thread__e_machine(struct thread *thread, stru= ct machine *machine, uint3 return e_machine; } =20 + if (machine =3D=3D NULL) { + struct maps *maps =3D thread__maps(thread); + + machine =3D maps__machine(maps); + } tid =3D thread__tid(thread); pid =3D thread__pid(thread); if (pid !=3D tid) { --=20 2.53.0.rc1.225.gd81095ad13-goog