From nobody Mon Feb 9 00:22:04 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 91E9DC4167B for ; Sun, 10 Dec 2023 08:13:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231695AbjLJIM4 (ORCPT ); Sun, 10 Dec 2023 03:12:56 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:32886 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229482AbjLJIMy (ORCPT ); Sun, 10 Dec 2023 03:12:54 -0500 Received: from AUS01-SY4-obe.outbound.protection.outlook.com (mail-sy4aus01olkn2175.outbound.protection.outlook.com [40.92.62.175]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 06A9EC5; Sun, 10 Dec 2023 00:13:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ksGonCfeaPwR6l5GxKxoTf6pnuz1Bjt0wtGjUOpjJf6cj4uLUkoo7i9+iZU069MuRND+1EMuEymxCokQ3aV/PXa7nFGpKj2mTN1fYNx4U9fI7E89R6P8RQA936lUW8mjzyV9LYXLfc0+yS2lAgzVqQnKUtfVHwFrSKDQhY4KXs5wwj+zzsDHpa8/zxBq/99Z+FqKs/+KFMFT3hF673nI5vaN+KvBNJBGKjdb42c5rm6ec0PiP7lTeJ3DKBupa1L+FbhF85Ocb/IIB42yOSlMwDq9YzMYUGm4apaiyWOKCvIWZHLOwR/Li/ich7zfIg7vCoSW8mz9lCoOrn90oMuNKQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=QPuHegOvjI1Wqy9bawitz85TcVTd7dRsokA5lEbAaHg=; b=CJJHfaihp31VcOb8dRdNImfqLJftgWnv8kkScbTIFaeSvgoh1/avnwQx38q+XkMMXlIPwsQmV8SC3a4ORVwHUubl3+Lqbq3VZcZCiA7JRgeCKJtxr7xXxunGCUHIdXRu41CHdH2Q2eGQCozVkOTOcWlvhhDqU3jWQGDsxSBv4sPyFni+Yr2lnfcCiijbs6/UeQXVtfiP9aPBmrquG0pW1nTKAXcO0PIjl8OsTxcDJfnsTD18Zh4QPnE85ZKgLNr/AYpja/XXsxJFDRCokptrgEzkK+J7VX0IqspcE4Pvzytg4hMzDrlUkm/ftXOS/9Y8IjwjwgtVO9fUoXLVRDwf5Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=QPuHegOvjI1Wqy9bawitz85TcVTd7dRsokA5lEbAaHg=; b=pR+oypzw3XWu2MtJ9PWqLyoJXpzYdwiWXRfzQoGX014y3p2dqrcyjSL2EBeHqLD1vEZtVAos/eVyYkRWKlWLHvsIHdv2cadY1a1AFthCw3Kddg2r+I5tnDOtdht9xAT70t3XseQXoeSjM/uWUi1gEpi9DNGJBkjSv2Hvw0+mfEhSPjcNmABUwkwai2eHlzUj9+/Hj0j5zpKMzvQCWxZefL2BKsVXtacDKYgOI+NAN24nCZyBtpWYoTfZ49y8vCgacGCBykd509lQMgjfUDjm+KxA3103CmrL2Out2aP8J2KqDVxrC7OJNBECn22Q0R+d66PnDcDgOCEU3vkmfX2EGA== Received: from SYBPR01MB6870.ausprd01.prod.outlook.com (2603:10c6:10:13d::10) by MEYPR01MB7339.ausprd01.prod.outlook.com (2603:10c6:220:15f::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7068.31; Sun, 10 Dec 2023 08:12:53 +0000 Received: from SYBPR01MB6870.ausprd01.prod.outlook.com ([fe80::be5a:160f:5418:9deb]) by SYBPR01MB6870.ausprd01.prod.outlook.com ([fe80::be5a:160f:5418:9deb%5]) with mapi id 15.20.7068.030; Sun, 10 Dec 2023 08:12:53 +0000 From: Tianyi Liu To: seanjc@google.com, pbonzini@redhat.com, peterz@infradead.org, mingo@redhat.com, acme@kernel.org Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, kvm@vger.kernel.org, x86@kernel.org, mark.rutland@arm.com, mlevitsk@redhat.com, maz@kernel.org, alexander.shishkin@linux.intel.com, jolsa@kernel.org, namhyung@kernel.org, irogers@google.com, adrian.hunter@intel.com, Tianyi Liu Subject: [PATCH v3 1/5] KVM: Add arch specific interfaces for sampling guest callchains Date: Sun, 10 Dec 2023 16:12:18 +0800 Message-ID: X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-TMN: [QSggTfQqFdbZg1h9Gs/NfozjCC3waagQZgTkdujY8Bxzr5XF3x6M1A==] X-ClientProxiedBy: SG2PR01CA0125.apcprd01.prod.exchangelabs.com (2603:1096:4:40::29) To SYBPR01MB6870.ausprd01.prod.outlook.com (2603:10c6:10:13d::10) X-Microsoft-Original-Message-ID: <20231210081218.2226-1-i.pear@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SYBPR01MB6870:EE_|MEYPR01MB7339:EE_ X-MS-Office365-Filtering-Correlation-Id: e6e3b1ce-4bc6-4d46-15a7-08dbf957cec1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: F3LN9hyPvN0CAVmU+CwhB+XgRrUEjHa4HI1zqe9BR1NM6xasWGUEsY21KafHRI3J6udF87Jntl/23EfJtc/Opb+vhobD14RLba1BTrlHBKYOmzbqq2koxkZRQyO47EL/bpUvwwpJs82XwF97jlhkabhXYL6QpsIGVVtU9lpA10RjaSs21fXg0BN0joIj17O6dK3xewzJ3XS8prVTjc6jURKdavKVp4MtSwUkCxXYXTcfMoFlZfpAgJUcjB64nhmc4a4vVp4s0GhSDaum5OMazYF/Hz6BtUzCXslKzjILBdQ5kiSCKp0NIZIbXdHPKNvnILwL0CqyYi4gvbrMTIUcPYDsYNFf3rXWgHjWybY4j2ZJ+PylNH/1lt9Nhd33yHflJVEkYE8KTeI4cQmMvGQ1K4L2u1Z50F4UtzZCsYcM2qBsvYnzn/tpBVJ8siv2xq+1biS8tCbKTX2LGHzeAv/VcTsmOfMam5OKlH5lRKcwojiBLArs8Oe7JqBihVrzmZmosCNboAUaeIUtAtQMILPIQBEAqiKd9nGVrjLHJXBtOGKZe6/c3uPc7dC3pBbQmuiORR8WwGUS3JF3ELuR7dNB4s+lH2ilIL9wYmogpQn+XtnqLXByGOk5o5pxnpH96IAN X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?bfaX2bWF1FUPdvdpZQncA5I18O7ptYdkMt6nx0ifU5KnqRLHs7jrC+3OkApL?= =?us-ascii?Q?fxVTlDbFNn72Dgr495NNCmI0GGVNCwyXh5SRDIMZ+YvAumLvKeSjIS6RIdXL?= =?us-ascii?Q?emV8BuC3mmRl+747dOAiz70Irb619dO/nEdYGHcONsAOmRNuKAWwdB5beKkT?= =?us-ascii?Q?yZ6fP6TpDQmIVxP6tbJ5eYQn7oDlnoVJSpDlhv7f30cW+494lfvA71sweScc?= =?us-ascii?Q?nWl0lko9StWR7WmPnW8xWCG1IaEP2aKT3C4HVTVWuzPUi3GoiDxDN2/faDxv?= =?us-ascii?Q?+vEQgB2TljwIF90NxgO79kp2A3J078cl+fqJfsxNvSTYqnXUaneJVlA5pzh3?= =?us-ascii?Q?PPHOOwJCG3pmKG9P9jhludrHaSN/FNwo8a38f0oMUJpWsYPNPsa8ifY+tgWb?= =?us-ascii?Q?132mPYMtJ7rdjuxyj/URGu4IlgbwMGiW2piN4H9HCXrqpqNlntj+ieNbvpDE?= =?us-ascii?Q?hXKJM0EGhXxun4QgOmg2WkpeSkpSe7+Rq2qnlZ7r/2zGr7iD6oTC1DCkWVMH?= =?us-ascii?Q?ic9wKPovWHoDqBfBOZu/wwh3nV56p7NQEvt4WkuynEDGkkQr9eJg+iaxd1nK?= =?us-ascii?Q?E2yzjVwj5FnRiVcLe2DSQObzVeayPx+YciEM4VRnMmL99zWtbkbqRJB106wU?= =?us-ascii?Q?ZTS1y7nukBk2PnlNdXxQ2YuzUVRW3EjOn8p7cXE3PZgLsTX7WAMNO/yXN5SK?= =?us-ascii?Q?hPqpmQH4pPQNOax0EujHor/8aRPEK47rYrGW4rIJ31MBTuFs5Xmaw/SQYDIp?= =?us-ascii?Q?GTeFjal0mMrPF0F+dlkrRO5uRf9irmJz+E13bXrKIfHtxMzvAvlxzxnFAGjo?= =?us-ascii?Q?mXzGlLCvykaq4KEmdBJOD4PK4OM9olx8GjBypIVsNCx1CznBHZvhM5A1m5YL?= =?us-ascii?Q?ZyB3QC+/Gre5VNyFdhuSMQtnIVlkwigUwSf1j9NjeChFKTXd7K4/B/hPRMa7?= =?us-ascii?Q?XU8bgBRxNWBvhIyMeRQ3IaVbLBcl7O734I9D0RkV4LTul6ebVJ4h9s4JtbKx?= =?us-ascii?Q?CDx27lwSqItG36eMojY/u+ux7wm78BUNJbvaPx0kp/odVsYv4lI/6K1ajjmP?= =?us-ascii?Q?gKAOu5ilBDYqaWRtm2FivhJo5mlyJvTy+TvaGeo9Yk3kjjWGB6HQV63LoU+o?= =?us-ascii?Q?YF+yPTxyQDZIoI4os49NP8tgvMnS9fRQTXyA1cyeV1WamQW4eIXQ9SufosCw?= =?us-ascii?Q?L7XNF3jSwER7xay8v8Z46Fg1kCAsjn46YpMrZcRhsm/r69oYsuiqnU5C3g/R?= =?us-ascii?Q?v2dTFAh8nf4ZuhvQKY2o?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: e6e3b1ce-4bc6-4d46-15a7-08dbf957cec1 X-MS-Exchange-CrossTenant-AuthSource: SYBPR01MB6870.ausprd01.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Dec 2023 08:12:53.2638 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: MEYPR01MB7339 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" This patch adds two architecture specific interfaces used by `perf kvm`: - kvm_arch_vcpu_get_unwind_info: Return required data for unwinding at once; including ip address, frame pointer, whether the guest vCPU is running in 32 or 64 bits, and possibly the base addresses of the segments. - kvm_arch_vcpu_read_virt: Read data from a virtual address of the guest vm. `perf_kvm.h` has been added to the `include/linux/` directory to store the interface structures between the perf events subsystem and the KVM subsystem. Since arm64 hasn't provided some foundational infrastructure, stub the arm64 implementation for now because it's a bit complex. The above interfaces require architecture support for `CONFIG_GUEST_PERF_EVENTS`, which is only implemented by x86 and arm64 currently. For more architectures, they need to implement these interfaces when enabling `CONFIG_GUEST_PERF_EVENTS`. In terms of safety, guests are designed to be read-only in this feature, and we will never inject page faults into the guests, ensuring that the guests are not interfered by profiling. In extremely rare cases, if the guest is modifying the page table, there is a possibility of reading incorrect data. Additionally, if certain programs running in the guest OS do not support frame pointers, it may also result in some erroneous data. These erroneous data will eventually appear as `[unknown]` entries in the report. It is sufficient as long as most of the records are correct for profiling. Signed-off-by: Tianyi Liu --- MAINTAINERS | 1 + arch/arm64/kvm/arm.c | 12 ++++++++++++ arch/x86/kvm/x86.c | 24 ++++++++++++++++++++++++ include/linux/kvm_host.h | 5 +++++ include/linux/perf_kvm.h | 18 ++++++++++++++++++ 5 files changed, 60 insertions(+) create mode 100644 include/linux/perf_kvm.h diff --git a/MAINTAINERS b/MAINTAINERS index 788be9ab5b73..5ee36b4a9701 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -16976,6 +16976,7 @@ F: arch/*/kernel/*/perf_event*.c F: arch/*/kernel/perf_callchain.c F: arch/*/kernel/perf_event*.c F: include/linux/perf_event.h +F: include/linux/perf_kvm.h F: include/uapi/linux/perf_event.h F: kernel/events/* F: tools/lib/perf/ diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c index e5f75f1f1085..5ae74b5c263a 100644 --- a/arch/arm64/kvm/arm.c +++ b/arch/arm64/kvm/arm.c @@ -574,6 +574,18 @@ unsigned long kvm_arch_vcpu_get_ip(struct kvm_vcpu *vc= pu) { return *vcpu_pc(vcpu); } + +bool kvm_arch_vcpu_get_unwind_info(struct kvm_vcpu *vcpu, struct perf_kvm_= guest_unwind_info *info) +{ + /* TODO: implement */ + return false; +} + +bool kvm_arch_vcpu_read_virt(struct kvm_vcpu *vcpu, gva_t addr, void *dest= , unsigned int length) +{ + /* TODO: implement */ + return false; +} #endif =20 static int kvm_vcpu_initialized(struct kvm_vcpu *vcpu) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 2c924075f6f1..9341cd80f665 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -13039,6 +13039,30 @@ unsigned long kvm_arch_vcpu_get_ip(struct kvm_vcpu= *vcpu) return kvm_rip_read(vcpu); } =20 +bool kvm_arch_vcpu_get_unwind_info(struct kvm_vcpu *vcpu, struct perf_kvm_= guest_unwind_info *info) +{ + info->ip_pointer =3D kvm_rip_read(vcpu); + info->frame_pointer =3D kvm_register_read_raw(vcpu, VCPU_REGS_RBP); + + info->is_guest_64bit =3D is_64_bit_mode(vcpu); + if (info->is_guest_64bit) { + info->segment_cs_base =3D 0; + info->segment_ss_base =3D 0; + } else { + info->segment_cs_base =3D get_segment_base(vcpu, VCPU_SREG_CS); + info->segment_ss_base =3D get_segment_base(vcpu, VCPU_SREG_SS); + } + return true; +} + +bool kvm_arch_vcpu_read_virt(struct kvm_vcpu *vcpu, gva_t addr, void *dest= , unsigned int length) +{ + struct x86_exception e; + + /* Return true on success */ + return kvm_read_guest_virt(vcpu, addr, dest, length, &e) =3D=3D X86EMUL_C= ONTINUE; +} + int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu) { return kvm_vcpu_exiting_guest_mode(vcpu) =3D=3D IN_GUEST_MODE; diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 4944136efaa2..6f5ff4209b0c 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -41,6 +41,7 @@ #include =20 #include +#include =20 #include #include @@ -1595,6 +1596,10 @@ static inline bool kvm_arch_intc_initialized(struct = kvm *kvm) =20 #ifdef CONFIG_GUEST_PERF_EVENTS unsigned long kvm_arch_vcpu_get_ip(struct kvm_vcpu *vcpu); +bool kvm_arch_vcpu_get_unwind_info(struct kvm_vcpu *vcpu, + struct perf_kvm_guest_unwind_info *info); +bool kvm_arch_vcpu_read_virt(struct kvm_vcpu *vcpu, gva_t addr, void *dest, + unsigned int length); =20 void kvm_register_perf_callbacks(unsigned int (*pt_intr_handler)(void)); void kvm_unregister_perf_callbacks(void); diff --git a/include/linux/perf_kvm.h b/include/linux/perf_kvm.h new file mode 100644 index 000000000000..e77eeebddabb --- /dev/null +++ b/include/linux/perf_kvm.h @@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _LINUX_PERF_KVM_H +#define _LINUX_PERF_KVM_H + +/* + * Structures as interface between Perf Event and KVM subsystem. + * Add more members for new architectures if necessary. + */ + +struct perf_kvm_guest_unwind_info { + unsigned long ip_pointer; + unsigned long frame_pointer; + bool is_guest_64bit; + unsigned long segment_cs_base; + unsigned long segment_ss_base; +}; + +#endif /* _LINUX_PERF_KVM_H */ --=20 2.34.1 From nobody Mon Feb 9 00:22:04 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8F2FDC4167B for ; Sun, 10 Dec 2023 08:15:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231749AbjLJIPR (ORCPT ); Sun, 10 Dec 2023 03:15:17 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47774 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229518AbjLJIPP (ORCPT ); Sun, 10 Dec 2023 03:15:15 -0500 Received: from AUS01-SY4-obe.outbound.protection.outlook.com (mail-sy4aus01olkn2156.outbound.protection.outlook.com [40.92.62.156]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 51F8AC6; Sun, 10 Dec 2023 00:15:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=REW2+iW1lTE75brGn8JouBVk/ZYBBezUKtXsXdoXh7HHSl7bbOMfSps7F61q+LPk/sA8xzWjYMykBJn9g9wzXwJ1r0U+YUzq5hcZvdexSeNOKH1o0GeTwLCFOCv1JakuIqvWlYyiHPYp6ujvHVUFT/PQYUDZXoe2ee8xqVkLOS2cxef3raMt3Pl4mnRa2fHK10l1qQbejFrL07vb2e+I1Lf6xtJGNK0xMdGdtRpzrLiqY6Hqly4PG4GayNdDchwTH3vDcw9h5EZcn47muq2WGaJ6RldbE8qCHxtkLzLH4i5xLba+nLhg+AZxkpbUT4T63WcejrDxKpJno2CJnQVNzw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=pxF+R4s6Cw2cH1iWqjVrs90ajnNFMMq5vaqUa7oXs9o=; b=UyiEV0Kbb3VTdQCVKXufdYwaGT2C6WjSVey/l4LsceGpsUTT2H9xTd9qDFZP49OIW/Pp4zI7Lu3bksS6wzkNBRgWGS3TkkMSd6LKCYceWYhypwJSH6qOf1nCn+g2bjmi1PGo/Yd0+4h2ZbLiEyOrSegVRKhwOnNjya0gT1zvsZxIFKy3vEuyWIYWvDVQvESP9cbPMUGhuIyHEclXrMbM+odId313zym2HWHpblqN+GAptfjPd2qkFblNEaUoy9XcWCyfBMiTBATWjOZYr/wC+Ysbjsy+mHgiH/64LBcNY+LuI4BHKqS+xQYqnnNmMiIR9LKLciimQ0oz0L4yUp021g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=pxF+R4s6Cw2cH1iWqjVrs90ajnNFMMq5vaqUa7oXs9o=; b=QHGF6j0PJzjvlRgm0+Ia6OdgsHGKpmuB9GAfHxO6C2wXpeEQ7ZdNkJHybBkYPPSDtu9J8Uw7EAepOuJ+RbXAaeHWQPMB+KocJbszJ9EIPgVVoNZHOtxGNEBurpPhQNUXw2Uvi3EWM/muru1e2X3jh5vlkkY8xQB0zaV9LKFQeF5ujFzNsdPFZ/MuylNZJZpmo6QF/BJe9Gct0XsrxBqm2EcGUyjCg1Gxf5g/7njttglVq3isTl7vU19VsbjflSz8l2MbWJInIc8FRSHuq9ZvyAx1EPXgMZyoYhAY/pRHhIK8LsDPx9XB2PGlGQZ8prBgru1owTe6rAFHkaCCxXKo2g== Received: from SYBPR01MB6870.ausprd01.prod.outlook.com (2603:10c6:10:13d::10) by MEYPR01MB7339.ausprd01.prod.outlook.com (2603:10c6:220:15f::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7068.31; Sun, 10 Dec 2023 08:15:12 +0000 Received: from SYBPR01MB6870.ausprd01.prod.outlook.com ([fe80::be5a:160f:5418:9deb]) by SYBPR01MB6870.ausprd01.prod.outlook.com ([fe80::be5a:160f:5418:9deb%5]) with mapi id 15.20.7068.030; Sun, 10 Dec 2023 08:15:12 +0000 From: Tianyi Liu To: seanjc@google.com, pbonzini@redhat.com, peterz@infradead.org, mingo@redhat.com, acme@kernel.org Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, kvm@vger.kernel.org, x86@kernel.org, mark.rutland@arm.com, mlevitsk@redhat.com, maz@kernel.org, alexander.shishkin@linux.intel.com, jolsa@kernel.org, namhyung@kernel.org, irogers@google.com, adrian.hunter@intel.com, Tianyi Liu Subject: [PATCH v3 2/5] perf kvm: Introduce guest interfaces for sampling callchains Date: Sun, 10 Dec 2023 16:14:52 +0800 Message-ID: X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-TMN: [tNQOTVHnuDQwQkpUy9i9+/3gTNGARQA5x7xlGvNEgKG54CKGU5CETA==] X-ClientProxiedBy: SG2PR03CA0107.apcprd03.prod.outlook.com (2603:1096:4:7c::35) To SYBPR01MB6870.ausprd01.prod.outlook.com (2603:10c6:10:13d::10) X-Microsoft-Original-Message-ID: <20231210081452.2312-1-i.pear@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SYBPR01MB6870:EE_|MEYPR01MB7339:EE_ X-MS-Office365-Filtering-Correlation-Id: 80c8c0ea-93a6-4a93-9b4c-08dbf95821c3 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: V2lVPkeEVw0TXhPSNndJFgrUfQfWQhe97/3dWJAom8I8E5xwvpRVo0D4oa1wpDtNYLTXvE6LrN2JpZ2K04UUo7cnjLbfZwnhbVv6n4sknlJ9kA2KeT77ZtZaPxjdCYBoQodjqkrR9Y+TSvYe1bHNeA0r9eJSB/u37ZR3RkI/kowuinjWLGm0MjPJ8lMEdb2KvXMW0WPoP5t4WTAYXxWymURvuPa7LDqE3HEu+hXJkNjN5MC/lTVatkDAkooWfuKh2nRsOw/x/LgeTcTyziGKAi18iUuJYOTjMD0KJrwjKcEueimehowQa0z/9k/gMLNZQHqwGT81EoiQMp6KOUZ7IL/RGAmOHaTw5661VM0vRVXxnzp+3b83x8Uy+/DAzzqHvN04TBz3IommzV28DPS655xsfLSxVuW4cMSCdVPBrXDguphsryjDtk/bWYYyJ9Xv5/1QeVjfsq7ietbowNTrsedf0L4i0wuNQ9U/p26wEYlRIxPdNLOaipDsjA9lURH/0nk5hBkPlRiSVfWtgUe1zhwb/17w50KXw0C2wT4cy9ZNJo3wW3TaUNAGGFRJOkMzy2rnutKrxp/24re6daIDsimlqWeFWzwrB6Jcs9v8jMYE+QlS9qhlhBv8zKEP46+G X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?9lgUD9GI56U0BB6wy6svR5OakY3jPajmR4UGCWi1PKSBK1khbQ/vfOXE6y8F?= =?us-ascii?Q?0St8D0nd1G8SvBPo/g+H6YgVeye6pW80B+lqimWMFq9vyGlMht+qHyia7a7Q?= =?us-ascii?Q?CFgEKraosAZBAj2giVCURb9TvFA52CRBeoGxbfCr0OthD3i3i66lWJ49lGf+?= =?us-ascii?Q?30GZREkGwW9xRl+Dw0Rr5GVIykKE7bP7ElQoffGEZT3OC4S7xuU94AocAyyN?= =?us-ascii?Q?1HFYaCqoup7WbqoeMxepIQGZqXgpA/VBWdbw3xPvUWeNA9BsopXiRTc2yupo?= =?us-ascii?Q?rXYvF0o/ULDA2ZhDFEPzyC2SzUw/ou2zyJ1Uhs7NdjnkYf5BT6p3OFkmI6FC?= =?us-ascii?Q?sP7r9Kn2hlp1NRBO1+7nWWaYirkeVcEHMHDs09/uuGj2FMzbpSO1OMhNMIie?= =?us-ascii?Q?crP4hEBlNRNMs8ZsTa54L8a/iS/N8R0KWYCTpw+G38kBWQkbof4xLKinuZTL?= =?us-ascii?Q?14SrisfoB+HBc03PteZd/t3J4EeFoictaZWFruZCeNorXZIqNyP1947AJoaB?= =?us-ascii?Q?zWf4pxnX+U9JB/94eWiL2abht+521Us736h3Z+qjPU9c8+5c80JGBIP6HWfq?= =?us-ascii?Q?zfi8D0YX0Nqk3RP3pQ8ttPsSbAZh3OA1eGr5ESc0nRzxnHJzcOSMrGAVrmIO?= =?us-ascii?Q?8sLX5OMjJSPQBt1FjJlq/wKV4EnrcwKG0Wxvnn0SgCUi5cE20SZsX1rM37+m?= =?us-ascii?Q?wjSb/5xdKdg6ERsj/8pFuiw4K71LoEdO2hqQdGnf5qaAd382uEODi58wf1WL?= =?us-ascii?Q?g7V2NSh6+wyVi4LcOASjJcf0288FMcyBXaMFcNA/W5JKzII5N/AoKEYRBPwj?= =?us-ascii?Q?PPOLKmSgegMK7kh7ovY6pgsiWhfn1NgDtE9DAXVGik80PMFh9F2tIipQKvbF?= =?us-ascii?Q?F/X/9EH8UW/ZFG+HoRMqzxfXPY6/WWOU2OK3XijDsCKk66rwvgKG7fG+mvuT?= =?us-ascii?Q?zfRt2DMtOW/GaRBcKgcUu8PPZkrLQyQCuylgY9XSKGAqxeqR9xXmd0BJfvM8?= =?us-ascii?Q?OJcxXJs9mMXHbpxG1PalBZ3TLyj8SJuzkRb9pq5HTqfl9tR1FWMCCSP1Hdtx?= =?us-ascii?Q?mUopb1rkpleE73Lfe73zR3qK9498hNRrfSIUe5P0iYwc+6tBjLbSeexDpwYM?= =?us-ascii?Q?9SBAmiVhzvj10A2SG39KZfzZOLTniVhDnIxvp0tnFkk37u+JH/MuxbTjtgHQ?= =?us-ascii?Q?3gn/5Td8l7a0biU7WfMkt+6qvBUjPgsIDAS7mePxp5Fl6WPUoRqE0k4MT/NG?= =?us-ascii?Q?x7MPDY6+utJlbrK0sqrq?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 80c8c0ea-93a6-4a93-9b4c-08dbf95821c3 X-MS-Exchange-CrossTenant-AuthSource: SYBPR01MB6870.ausprd01.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Dec 2023 08:15:12.4656 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: MEYPR01MB7339 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" This patch introduces two callback interfaces used between perf and KVM: - get_unwind_info: Return required data for unwinding at once; including ip address, frame pointer, whether the guest vCPU is running in 32 or 64 bits, and possibly the base addresses of the segments. - read_virt: Read data from a virtual address of the guest vm, used for reading the stack frames from the guest. Signed-off-by: Tianyi Liu --- include/linux/perf_event.h | 17 +++++++++++++++++ kernel/events/core.c | 10 ++++++++++ 2 files changed, 27 insertions(+) diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 5547ba68e6e4..dacc1623dcaa 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -17,6 +17,8 @@ #include #include =20 +#include + /* * Kernel-internal data types and definitions: */ @@ -32,6 +34,9 @@ struct perf_guest_info_callbacks { unsigned int (*state)(void); unsigned long (*get_ip)(void); + bool (*get_unwind_info)(struct perf_kvm_guest_unwind_info *info); + bool (*read_virt)(unsigned long addr, void *dest, + unsigned int len); unsigned int (*handle_intel_pt_intr)(void); }; =20 @@ -1500,6 +1505,8 @@ extern struct perf_guest_info_callbacks __rcu *perf_g= uest_cbs; =20 DECLARE_STATIC_CALL(__perf_guest_state, *perf_guest_cbs->state); DECLARE_STATIC_CALL(__perf_guest_get_ip, *perf_guest_cbs->get_ip); +DECLARE_STATIC_CALL(__perf_guest_get_unwind_info, *perf_guest_cbs->get_unw= ind_info); +DECLARE_STATIC_CALL(__perf_guest_read_virt, *perf_guest_cbs->read_virt); DECLARE_STATIC_CALL(__perf_guest_handle_intel_pt_intr, *perf_guest_cbs->ha= ndle_intel_pt_intr); =20 static inline unsigned int perf_guest_state(void) @@ -1510,6 +1517,14 @@ static inline unsigned long perf_guest_get_ip(void) { return static_call(__perf_guest_get_ip)(); } +static inline bool perf_guest_get_unwind_info(struct perf_kvm_guest_unwind= _info *info) +{ + return static_call(__perf_guest_get_unwind_info)(info); +} +static inline bool perf_guest_read_virt(unsigned long addr, void *dest, un= signed int length) +{ + return static_call(__perf_guest_read_virt)(addr, dest, length); +} static inline unsigned int perf_guest_handle_intel_pt_intr(void) { return static_call(__perf_guest_handle_intel_pt_intr)(); @@ -1519,6 +1534,8 @@ extern void perf_unregister_guest_info_callbacks(stru= ct perf_guest_info_callback #else static inline unsigned int perf_guest_state(void) { return 0; } static inline unsigned long perf_guest_get_ip(void) { return 0; } +static inline bool perf_guest_get_unwind_info(struct perf_kvm_guest_unwind= _info *) { return 0; } +static inline bool perf_guest_read_virt(unsigned long, void*, unsigned int= ) { return 0; } static inline unsigned int perf_guest_handle_intel_pt_intr(void) { return = 0; } #endif /* CONFIG_GUEST_PERF_EVENTS */ =20 diff --git a/kernel/events/core.c b/kernel/events/core.c index b704d83a28b2..4c5e35006217 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -6807,6 +6807,8 @@ struct perf_guest_info_callbacks __rcu *perf_guest_cb= s; =20 DEFINE_STATIC_CALL_RET0(__perf_guest_state, *perf_guest_cbs->state); DEFINE_STATIC_CALL_RET0(__perf_guest_get_ip, *perf_guest_cbs->get_ip); +DEFINE_STATIC_CALL_RET0(__perf_guest_get_unwind_info, *perf_guest_cbs->get= _unwind_info); +DEFINE_STATIC_CALL_RET0(__perf_guest_read_virt, *perf_guest_cbs->read_virt= ); DEFINE_STATIC_CALL_RET0(__perf_guest_handle_intel_pt_intr, *perf_guest_cbs= ->handle_intel_pt_intr); =20 void perf_register_guest_info_callbacks(struct perf_guest_info_callbacks *= cbs) @@ -6818,6 +6820,12 @@ void perf_register_guest_info_callbacks(struct perf_= guest_info_callbacks *cbs) static_call_update(__perf_guest_state, cbs->state); static_call_update(__perf_guest_get_ip, cbs->get_ip); =20 + if (cbs->get_unwind_info) + static_call_update(__perf_guest_get_unwind_info, cbs->get_unwind_info); + + if (cbs->read_virt) + static_call_update(__perf_guest_read_virt, cbs->read_virt); + /* Implementing ->handle_intel_pt_intr is optional. */ if (cbs->handle_intel_pt_intr) static_call_update(__perf_guest_handle_intel_pt_intr, @@ -6833,6 +6841,8 @@ void perf_unregister_guest_info_callbacks(struct perf= _guest_info_callbacks *cbs) rcu_assign_pointer(perf_guest_cbs, NULL); static_call_update(__perf_guest_state, (void *)&__static_call_return0); static_call_update(__perf_guest_get_ip, (void *)&__static_call_return0); + static_call_update(__perf_guest_get_unwind_info, (void *)&__static_call_r= eturn0); + static_call_update(__perf_guest_read_virt, (void *)&__static_call_return0= ); static_call_update(__perf_guest_handle_intel_pt_intr, (void *)&__static_call_return0); synchronize_rcu(); --=20 2.34.1 From nobody Mon Feb 9 00:22:04 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id BF299C4167B for ; Sun, 10 Dec 2023 08:15:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231758AbjLJIPq (ORCPT ); Sun, 10 Dec 2023 03:15:46 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34880 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229482AbjLJIPn (ORCPT ); Sun, 10 Dec 2023 03:15:43 -0500 Received: from AUS01-SY4-obe.outbound.protection.outlook.com (mail-sy4aus01olkn2154.outbound.protection.outlook.com [40.92.62.154]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B2BB3CB; Sun, 10 Dec 2023 00:15:49 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=APBNDeChfwMh/HYVKhasrfaaR3luvMG36xMw4L7TxhwDNxSZgS924tl0v6/QV1zpDVbEOKS+4ge23yAUqsM9lxCeWM6l5YWWA0Y9Ro270nC5P4zO8uhLpe1cWX0YD064ozQckE482iAzMf4lLg4zR+WLVWJC/0A3qUZDDZLwwF/Sn5YFb5X49ms0RXkqIrR4fs5B83riF5ywGAwizIHG4jkNgdlRfa2a3BbIL3iZz5Oj7eVeB9LeK9YJexVd5WVxouwtXydjb9HLOZ5+W/BGI5wDsWf5Ci24gXZC3JVaZJ/3GJUrSXgJe5c3HZA8LFUA471+QJJU0c8pGmnF2K6sEQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=N1i26DJnKwIxg92MeUs8Z6WMsFGvM3406uFpBVomlXY=; b=F4cojM3r6QaxB8USzKJ3l24gKvOrzQW2t5FesoMShpETcsTnl0PQI0Um9cxZZTlR4WhK9y+OMrRVoy4TAj7WLYQpw509lkekKPW128lW+NJxHpMvSKp9U3XDQ07zT/7xOE51PT2vc0OOvjbRXFXyCqn2gf1wLdTumtE1Q8+ehqKL0jL2Rx/Uqh9oijfsc6LA2g72OUtntB3tcz4TSA5eLeHwS8ItGONzFMtEfU78HEngcSZ34qWo71MiVimBgdtpBkpDA22uTN+9U5Nt1JBfWStU2hVHQelrDeGexz4SJlZT12UWAQhZDmPzLQK4+HETrHPISctmdjieSV0JXK6knA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=N1i26DJnKwIxg92MeUs8Z6WMsFGvM3406uFpBVomlXY=; b=cUETqePmG755InfSZkpI8kyawLtZ00ft0n/rLwuSYpd9GOq2ur1ru5G18zQu7j26IN1NxEFeS3wTPAn4hpLKWepFlctqqVMOQQVteWjGkFWgyGW4QTUAJ9ed5fo0Cdfyg2aP3HDbodRwjj0YRBdpTNVVtNDtVdXZ5qxFlDoybvXWd4MJBsGTz4DtIlXgyXZC8r53grOk2D4o8Qcx1EetWxs90cNGO6WtaDQ9EYKscesvOiAZ/YZosyEQHJTr9CRzWN5KIZAFmkHPu0foU+k8eJ2JzJb1jucLSCfoLrEwK4dTTTTmnZei/fNFrhFSrBTPriuvIsZnA4Gak54i80hnBQ== Received: from SYBPR01MB6870.ausprd01.prod.outlook.com (2603:10c6:10:13d::10) by MEYPR01MB7339.ausprd01.prod.outlook.com (2603:10c6:220:15f::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7068.31; Sun, 10 Dec 2023 08:15:42 +0000 Received: from SYBPR01MB6870.ausprd01.prod.outlook.com ([fe80::be5a:160f:5418:9deb]) by SYBPR01MB6870.ausprd01.prod.outlook.com ([fe80::be5a:160f:5418:9deb%5]) with mapi id 15.20.7068.030; Sun, 10 Dec 2023 08:15:42 +0000 From: Tianyi Liu To: seanjc@google.com, pbonzini@redhat.com, peterz@infradead.org, mingo@redhat.com, acme@kernel.org Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, kvm@vger.kernel.org, x86@kernel.org, mark.rutland@arm.com, mlevitsk@redhat.com, maz@kernel.org, alexander.shishkin@linux.intel.com, jolsa@kernel.org, namhyung@kernel.org, irogers@google.com, adrian.hunter@intel.com, Tianyi Liu Subject: [PATCH v3 3/5] KVM: implement new perf callback interfaces Date: Sun, 10 Dec 2023 16:15:24 +0800 Message-ID: X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-TMN: [v6yvaF+JLPh+PCgNnetddSJEklpOTVwqI2vcLPFcfPuR5Ao+D0+oBw==] X-ClientProxiedBy: SG2PR06CA0207.apcprd06.prod.outlook.com (2603:1096:4:68::15) To SYBPR01MB6870.ausprd01.prod.outlook.com (2603:10c6:10:13d::10) X-Microsoft-Original-Message-ID: <20231210081524.2358-1-i.pear@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SYBPR01MB6870:EE_|MEYPR01MB7339:EE_ X-MS-Office365-Filtering-Correlation-Id: 959e30c7-68cf-46c7-ed7a-08dbf9583383 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: DTWdeCFFWhDPIiCSiU2WhdHULaHA/1d9PaCApNoqxEqZiBgBKu5ooVtxpIxW4RpGaPr7PJ1nDB75vbH2y9QBwDEcHa2Up4VOGoAzIXCpNoh52L7385Fkvi/5KLcek1P328aSvBmwnv+dovEHSVOdyuf+MRHTpeqaHVBK/ZzYSyM59H5Ny5dAJL5HX9tUVqUofJGMYzaj6lD4vaecx8R9O4BG3y+FT0Uuo6uyPDHz3N2OdH4X94t4JwLRKCFtvCGT6VSP1rt7nzCjOVv6+c87+VUQAyoyk0KSWb+qwAHTgtIXyI3QM1fQplz8zr9/Wa2xNsI6TM8g62IWDrxYr9TSHOgUhdmP+KPXWq+eo5Q0jDHiKika9yxJC5LSJDZ8nOHNiFkrTmsHVZ8vOrqHFzypKemeiZQqD27ZvsLTAniCrO/h6zAHbpuKMR+4lUqWgoxUo5+CGpI/vPzV+BsXbfGNJJmTqilmOocu1sp1/sb/+t06ZFeDeC6WK3N+LxyC4IaOpWar+krvZEOMUbUCUwzjYHoR6QlLbnrC1JfTaGoa3Ml590bhrBfpV9DRB73yxWai1myPWshePip52SCPbdhtbO/SKAd5WnepLsdn1YgkZxNzRZomRyrHqAE10Gl/nVFN X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?O+3hlnb0oA++e28XlMGGv/Ma7t9Hx7Ixj99e0izFdqv8qZHYSo/xmO7mJsqI?= =?us-ascii?Q?9M1XcrJzR43q5M0duQMIVjFLuqDgR+fo6JbZc9R5eFDEZwCn6+qkeOSb+mkG?= =?us-ascii?Q?tmPl1xkqHtJMhfxO5y/cg2CSOVbIRIYKIR6/E45vx+YM/l10NrVQvtIxFGGh?= =?us-ascii?Q?t0VnuwARQIWjSMRxl/swjHgXS0nHu8Oq7QhquQ3jtUXov9KkbnSHBkf5ZYQf?= =?us-ascii?Q?/OuDNRuMrmaOTd6yN6KXNFEVYk42Hm99/GsQxDBrnbw06uatX4j8EM3qmCiz?= =?us-ascii?Q?itO2yJ0B6s2+rv+dA5E25D80ML6Q8wkSppG2pPgF7jtW1JOqUqis7JlIYsAr?= =?us-ascii?Q?MgdFZ1GVMsAC1QNK/awRyyEAve/AILX2dBza090NN2AmgmTG9hUqZ3BnZFB5?= =?us-ascii?Q?8GrcfgNKsLBt7TNWhgzsStBAU7HkEMTcu9F2ex2zX0YuCzik8wkBBFoDUyLa?= =?us-ascii?Q?/Pk49KQw2k6Z0W0yf17L2vvjO4isB64V16FS0dh2VtVOLv2GJEDph/yJwNYK?= =?us-ascii?Q?nBlutsecTWgr5yKsoR7paHCAuxPu6iYbdQyM80wvDnKhr9Y9ModZ9hC/silu?= =?us-ascii?Q?Y/YzIssKtzoUd1pymsq2lGIaFmItrjQUFsobDXgLPJ9F6rvG8a+fq6x2DeBR?= =?us-ascii?Q?fAvZfl1axOjVeZ1zoVHhkPXWl2SaK6PbxltPORp8HiswfbgHvKYKODyfII9y?= =?us-ascii?Q?tb7LWoKLz0+oR8Hgtk53js/LIi6J4HKUBurpO+NHJ1IrMdQrJ8OXyD54Xx59?= =?us-ascii?Q?4xaTJw7Tfr+JPqpcZb+Auk8aE5Kcd8KO9U3WOYfCxZpPov1uqRS6PC2OLfPN?= =?us-ascii?Q?7hPUCIKWUrtGFQEcsxSfaD7XBUY9Kg930Ydtlarazi3bLzZXEyULNnbrxD5A?= =?us-ascii?Q?kLUTrQ42+qZU9du4BBPR2wyWGuMIDoFuQS8mcO9F+EzMFRF1VuaweCPd/txg?= =?us-ascii?Q?jMsqZ8IyDySK3mav40ToOCpFsJUvr8BObDMOsXJbvgquHR5szXwkW7KMgB0e?= =?us-ascii?Q?GLGCgGKG0LbdzL/29w7zpF2CfvT9kPiAcctF3mEyWTkKc/7gVvUry03PILZp?= =?us-ascii?Q?jBw/OfgY6SH/5OGVDgFkhxIOfFIfV2KLD7HLxzAuMBP6v4sbD3o8nLMBTn9o?= =?us-ascii?Q?VgNEndTEMGb0sFW0jgTO60PJ0oihAtUJUNQHzfmX2DJblXu/KsVruYedjgsy?= =?us-ascii?Q?ct/jajxwSjoi2ZD+PSCpG4mkrZu7zcmfe8eaAzZbGNluWKzsF219IFcfji8a?= =?us-ascii?Q?37OrIAjlO19Uvs2MWWPX?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 959e30c7-68cf-46c7-ed7a-08dbf9583383 X-MS-Exchange-CrossTenant-AuthSource: SYBPR01MB6870.ausprd01.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Dec 2023 08:15:42.2392 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: MEYPR01MB7339 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" This patch provides two KVM implementations for the following two new perf interfaces, just redirecting them to the arch-specific implementations: - get_unwind_info - read_virt Signed-off-by: Tianyi Liu --- virt/kvm/kvm_main.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 486800a7024b..c47b6c0f8e94 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -6032,9 +6032,31 @@ static unsigned long kvm_guest_get_ip(void) return kvm_arch_vcpu_get_ip(vcpu); } =20 +static bool kvm_guest_get_unwind_info(struct perf_kvm_guest_unwind_info *i= nfo) +{ + struct kvm_vcpu *vcpu =3D kvm_get_running_vcpu(); + + if (WARN_ON_ONCE(!kvm_arch_pmi_in_guest(vcpu))) + return false; + + return kvm_arch_vcpu_get_unwind_info(vcpu, info); +} + +static bool kvm_guest_read_virt(unsigned long addr, void *dest, unsigned i= nt length) +{ + struct kvm_vcpu *vcpu =3D kvm_get_running_vcpu(); + + if (WARN_ON_ONCE(!kvm_arch_pmi_in_guest(vcpu))) + return false; + + return kvm_arch_vcpu_read_virt(vcpu, addr, dest, length); +} + static struct perf_guest_info_callbacks kvm_guest_cbs =3D { .state =3D kvm_guest_state, .get_ip =3D kvm_guest_get_ip, + .get_unwind_info =3D kvm_guest_get_unwind_info, + .read_virt =3D kvm_guest_read_virt, .handle_intel_pt_intr =3D NULL, }; =20 --=20 2.34.1 From nobody Mon Feb 9 00:22:04 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 757CCC4167B for ; Sun, 10 Dec 2023 08:16:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231925AbjLJIQO (ORCPT ); Sun, 10 Dec 2023 03:16:14 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34590 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231642AbjLJIQK (ORCPT ); Sun, 10 Dec 2023 03:16:10 -0500 Received: from AUS01-SY4-obe.outbound.protection.outlook.com (mail-sy4aus01olkn2173.outbound.protection.outlook.com [40.92.62.173]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 873BBC6; Sun, 10 Dec 2023 00:16:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=mj0hX3eJ9ZuLGB/elM4zySzuVt0TNhPdFikrBqJnjUpsni6fkF2e0iIop3Y2Q8KZP+DbjNtKY42LWqJ+0AjfDy6XZADwZ2VrN9wUCQ44sWPlsrsLZXM8LzNACFt3hV8WIxj98Bc/wmMemAtuhhtGAh7Xxe0OVLcsMb/JFGJ4uz3dbqDn1Fz/R6CAt1DCQvEJjPqt2UoxeXf6ngDduifHyhBploOv4Vfav4khvyjBfKJ1glYA0UUxQLkSPR0yyAPMx7z+jlnAkJ+enl/OQMkqT4i2hMm5VLX33zEJUlNKAhtPAiUvU7rvkoLFYL29g+hYBJPY7TTTDYPOC+6W2cYaZQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=0Dm06ddVNFaxYjCFCM3kfRfk86yrs5hrGvGUIaB4XIQ=; b=H5m3CRJ+h2jkPh1ujCOy/kKiS1guOB3ld9IqmULfn7jXkJrr2oAvx+JTKdvzSWVDmittOziJpSo7X/QwWhuTBoTVjjF72rPjS4RCpk5arW9ERrkbnMlL7c4cp8AMnn5gqUQL6CW6Z6uz/lxYnqZvS9bFbfk0V/ltNRtU9aYNfUcGDBiKh4zn5GTrRhf+PYhd4al7L6uZjohhExfo1aC/am9TOOoXCoPWlJtfPvfXs0w2J6UjJQnN9TKald9pt6hm/+gbJnV9dE2QeirAJEDZdc4OHX6KouEVzJpkM3THYqlDEEf+vUUUD/WgP+ai5hVwylr5lyCIxJu4yPdXSpRshg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=0Dm06ddVNFaxYjCFCM3kfRfk86yrs5hrGvGUIaB4XIQ=; b=cF2dG0Hq01NqygOCJrHGxHm0Xu//oOJLuGLcSqLcnLRcu1ZMsSbbieibiiU/rJ2ukhH3TQvWkU6Xv+hfMr473I85ujQ2+uXKDhZkq+yC+9z+l1QgDiyGnrf6fakfp97/Gf1fzXtsC1qp6zeizlqPQ0H1gfiGNMlAI9WEw8XkuaTVVr6Dtf+xPGibq5a3SYC57vy8XqEHK8siD2mDGtS0a9IrRYkLF9gPt1orfw3hTX1JrG2EJ5qASdOka9ui50FIIL+zF9jo+/hpLSUVD69S5MlPHxti7m21iVS3sYJF6iT4tiYg/BcCfW8Gh+qt0HgTocjSXM0TWNlreyZ7JB7Fkw== Received: from SYBPR01MB6870.ausprd01.prod.outlook.com (2603:10c6:10:13d::10) by MEYPR01MB7339.ausprd01.prod.outlook.com (2603:10c6:220:15f::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7068.31; Sun, 10 Dec 2023 08:16:08 +0000 Received: from SYBPR01MB6870.ausprd01.prod.outlook.com ([fe80::be5a:160f:5418:9deb]) by SYBPR01MB6870.ausprd01.prod.outlook.com ([fe80::be5a:160f:5418:9deb%5]) with mapi id 15.20.7068.030; Sun, 10 Dec 2023 08:16:08 +0000 From: Tianyi Liu To: seanjc@google.com, pbonzini@redhat.com, peterz@infradead.org, mingo@redhat.com, acme@kernel.org Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, kvm@vger.kernel.org, x86@kernel.org, mark.rutland@arm.com, mlevitsk@redhat.com, maz@kernel.org, alexander.shishkin@linux.intel.com, jolsa@kernel.org, namhyung@kernel.org, irogers@google.com, adrian.hunter@intel.com, Tianyi Liu Subject: [PATCH v3 4/5] perf kvm: Support sampling guest callchains Date: Sun, 10 Dec 2023 16:15:48 +0800 Message-ID: X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-TMN: [nxBWVOlGmlQ1xJ5XQuc0c+ocO9VbnVgbjQH4feY1jj5utdNLizQTHA==] X-ClientProxiedBy: SG2PR02CA0030.apcprd02.prod.outlook.com (2603:1096:3:18::18) To SYBPR01MB6870.ausprd01.prod.outlook.com (2603:10c6:10:13d::10) X-Microsoft-Original-Message-ID: <20231210081548.2393-1-i.pear@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SYBPR01MB6870:EE_|MEYPR01MB7339:EE_ X-MS-Office365-Filtering-Correlation-Id: 7d39b20f-c1d9-4f08-bba9-08dbf95842da X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: VhPLNFUfwgorjBnkLaWC5U1szG1SdKQi6pcJe1PewNYQZSkE6BXUaCcxPdkMq3mbvQeYKlOWLWsn0LqLfdkKMdMAetIfSFttTlmUGoKV1Tvsx+koV04M1BqzZLbUWbySzg9xGduQX8yah1csehOEhrHhNfKQ+UtvhwkDRHqlULo/cQBsr6rPlwjuPxm3+EggnCewLEN+FcfHVi4qTjiVGfHVZv0EsEg7sZYVQhXRjP97x6rdqXNNHggnQ9VsBEp1NUzvg9wIMwCHBxZD3/K2BLzPM1tUV+sdwYrd9uYhtZuHrLKzEupgL6Jz0Vqrn1N1wkZh3my/0IONp7QkNu4DE5YFg7myIVm2gkdyGnM3u0IqEcEw5Voq28mfXVekltLyjF7I/NJVyrVLqxzYE4ECf2bfc7qchqdmEeYdG9VO24V2Pc00LCon5owPPGF1+ShcxSHJOULNdWbw6OTlGSkuJid+MiBH/eWHB43wqQ2dj3jbOYr+SzHey+KzJ2jyfmfqeqQ3JDKh/4BpgdTpu5Ls5hQCzDwBMgg7GVoIdbeRqyBA3tGEyuK+0QdtgmmB5Ds2gqbokmEnY1IQHbLcWGquZHSf6Aw2AjUs4j27q7GMo+Q= X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?+WtLDFreWex/oyTB+gwN0IGw+9NNRbtghoEoDiHw6KMiHj+/oXnrLrNnyaJv?= =?us-ascii?Q?AjF7gn3zMR0uzkrW/4nhSzPpXLLE402wCO/Yhh/uuSP4BmhUrI8aUm2f5Sf0?= =?us-ascii?Q?ja2v1Pp86BAdGszX1rRJF7TixVEkn79gV5XlYqcYDWwljukt0kYVoUvBKCNm?= =?us-ascii?Q?E1XNTd8/VsJ2MxsEL7eNQn/HdRjw48KjxNqcHPIBeqsDwV2VF+ss77GvXAHN?= =?us-ascii?Q?2WePb1ECTyEfOA45aBUscN28gnL4d5H2BoYGg5dpK/h86lO7RLAh9htcpzJp?= =?us-ascii?Q?jBjz//WBPSWd0rzNP6sF3cPLTuyXXitbH/3kmNnr5RaYYmWKNG9VVPHGKZDk?= =?us-ascii?Q?2d18VuveByIOpXpalPQ8edzM6ak3MpbWz8wGASHeb1EEwnj2f1DM5hNset2s?= =?us-ascii?Q?pGy5ygQ7gr0jVKZwmgrmZ7LcjIsxjnlSELcLkbJ04ceYIRYFe9jnBDliFulq?= =?us-ascii?Q?6p4mTf2FuthkiEnLzenhsh+26N+1u4Pa9RObcpiOqXNM8OpUe4svp55PGF81?= =?us-ascii?Q?9LDE+6UatH7nwofd+c+B+0klA/cSHq1jt5DF8x7BO10VR85oE+xfgBB6k61q?= =?us-ascii?Q?82lnjuMMB7hQ1G1sR7GvjA2lvVUfiVF7FV+GKH0ZNCW2io9VqTN2q3lzNTwn?= =?us-ascii?Q?3qgnMYUlZQF/IGmCn3gFR2TCOlfJwax3O6a4DeLiET4eATqnXKGPq0e+t9di?= =?us-ascii?Q?7fwaviiyiB2MgSBz9BdY6XssLo0EItLnuHbq3PLYXXtP6bUAiMM5IMCf5Utq?= =?us-ascii?Q?8j0VYjVVC7L6wrXIYxdKnMbCrOL+qJL4dfEhDpwYooO1mKj0EtRxpnvI78CG?= =?us-ascii?Q?AId4SxvdNHR+YBiX8RnSYh1+Jr2sIs77F7P75woy8pvWkDBqNcx/TFmChokJ?= =?us-ascii?Q?qWyxhWWjPceUzDnKW4htziWeYT/hDfIvEtdUAUXxdS8bhP4WBtvuIwtp7yoP?= =?us-ascii?Q?OlyIc0YaOk/BUHsZqkC6YIR6myUJRZIRsaQ7BdPkqSw7fX8/7MXLZb8r+iC4?= =?us-ascii?Q?or37WdKPfPPgtxy0DInWxwFXlCzH9Pi1bjDVPkMlukLl2Yas+c1eRCto7HBy?= =?us-ascii?Q?q5FG4KJgOZ83HPZatzvjlz0dhFyVHPWBKQgwX5g6WkhOYGkaJ55vAtFRXllA?= =?us-ascii?Q?A7snwmDYkkf4TGGkNMGgofqH3hY5kAsXRcwQEE31QhIyXqzBTv0FQEdhWXzc?= =?us-ascii?Q?NPX3mU0AwftYxzoLoKr/W+MBK/JE4jRCreNZ82coyUdO9EJnEPMpN8nwKb72?= =?us-ascii?Q?PHAY8jkwq2H3ftlJxIJX?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7d39b20f-c1d9-4f08-bba9-08dbf95842da X-MS-Exchange-CrossTenant-AuthSource: SYBPR01MB6870.ausprd01.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Dec 2023 08:16:07.9711 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: MEYPR01MB7339 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" This patch provides support for sampling guests' callchains. The signature of `get_perf_callchain` has been modified to explicitly specify whether it needs to sample the host or guest callchain. Based on the context, `get_perf_callchain` will distribute each sampling request to one of `perf_callchain_user`, `perf_callchain_kernel`, or `perf_callchain_guest`. The reason for separately implementing `perf_callchain_user` and `perf_callchain_kernel` is that the kernel may utilize special unwinders like `ORC`. However, for the guest, we only support stackframe-based unwinding, so the implementation is generic and only needs to be separately implemented for 32-bit and 64-bit. Signed-off-by: Tianyi Liu --- arch/x86/events/core.c | 63 ++++++++++++++++++++++++++++++++------ include/linux/perf_event.h | 3 +- kernel/bpf/stackmap.c | 8 ++--- kernel/events/callchain.c | 27 +++++++++++++++- kernel/events/core.c | 7 ++++- 5 files changed, 91 insertions(+), 17 deletions(-) diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c index 40ad1425ffa2..4ff412225217 100644 --- a/arch/x86/events/core.c +++ b/arch/x86/events/core.c @@ -2758,11 +2758,6 @@ perf_callchain_kernel(struct perf_callchain_entry_ct= x *entry, struct pt_regs *re struct unwind_state state; unsigned long addr; =20 - if (perf_guest_state()) { - /* TODO: We don't support guest os callchain now */ - return; - } - if (perf_callchain_store(entry, regs->ip)) return; =20 @@ -2778,6 +2773,59 @@ perf_callchain_kernel(struct perf_callchain_entry_ct= x *entry, struct pt_regs *re } } =20 +static inline void +perf_callchain_guest32(struct perf_callchain_entry_ctx *entry, + const struct perf_kvm_guest_unwind_info *unwind_info) +{ + unsigned long ss_base, cs_base; + struct stack_frame_ia32 frame; + const struct stack_frame_ia32 *fp; + + cs_base =3D unwind_info->segment_cs_base; + ss_base =3D unwind_info->segment_ss_base; + + fp =3D (void *)(ss_base + unwind_info->frame_pointer); + while (fp && entry->nr < entry->max_stack) { + if (!perf_guest_read_virt((unsigned long)&fp->next_frame, + &frame.next_frame, sizeof(frame.next_frame))) + break; + if (!perf_guest_read_virt((unsigned long)&fp->return_address, + &frame.return_address, sizeof(frame.return_address))) + break; + perf_callchain_store(entry, cs_base + frame.return_address); + fp =3D (void *)(ss_base + frame.next_frame); + } +} + +void +perf_callchain_guest(struct perf_callchain_entry_ctx *entry) +{ + struct stack_frame frame; + const struct stack_frame *fp; + struct perf_kvm_guest_unwind_info unwind_info; + + if (!perf_guest_get_unwind_info(&unwind_info)) + return; + + perf_callchain_store(entry, unwind_info.ip_pointer); + + if (unwind_info.is_guest_64bit) { + fp =3D (void *)unwind_info.frame_pointer; + while (fp && entry->nr < entry->max_stack) { + if (!perf_guest_read_virt((unsigned long)&fp->next_frame, + &frame.next_frame, sizeof(frame.next_frame))) + break; + if (!perf_guest_read_virt((unsigned long)&fp->return_address, + &frame.return_address, sizeof(frame.return_address))) + break; + perf_callchain_store(entry, frame.return_address); + fp =3D (void *)frame.next_frame; + } + } else { + perf_callchain_guest32(entry, &unwind_info); + } +} + static inline int valid_user_frame(const void __user *fp, unsigned long size) { @@ -2861,11 +2909,6 @@ perf_callchain_user(struct perf_callchain_entry_ctx = *entry, struct pt_regs *regs struct stack_frame frame; const struct stack_frame __user *fp; =20 - if (perf_guest_state()) { - /* TODO: We don't support guest os callchain now */ - return; - } - /* * We don't know what to do with VM86 stacks.. ignore them for now. */ diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index dacc1623dcaa..483578672868 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -1552,9 +1552,10 @@ DECLARE_PER_CPU(struct perf_callchain_entry, perf_ca= llchain_entry); =20 extern void perf_callchain_user(struct perf_callchain_entry_ctx *entry, st= ruct pt_regs *regs); extern void perf_callchain_kernel(struct perf_callchain_entry_ctx *entry, = struct pt_regs *regs); +extern void perf_callchain_guest(struct perf_callchain_entry_ctx *entry); extern struct perf_callchain_entry * get_perf_callchain(struct pt_regs *regs, u32 init_nr, bool kernel, bool us= er, - u32 max_stack, bool crosstask, bool add_mark); + bool host, bool guest, u32 max_stack, bool crosstask, bool add_mark); extern int get_callchain_buffers(int max_stack); extern void put_callchain_buffers(void); extern struct perf_callchain_entry *get_callchain_entry(int *rctx); diff --git a/kernel/bpf/stackmap.c b/kernel/bpf/stackmap.c index d6b277482085..5ca41ca08d8a 100644 --- a/kernel/bpf/stackmap.c +++ b/kernel/bpf/stackmap.c @@ -294,8 +294,8 @@ BPF_CALL_3(bpf_get_stackid, struct pt_regs *, regs, str= uct bpf_map *, map, if (max_depth > sysctl_perf_event_max_stack) max_depth =3D sysctl_perf_event_max_stack; =20 - trace =3D get_perf_callchain(regs, 0, kernel, user, max_depth, - false, false); + trace =3D get_perf_callchain(regs, 0, kernel, user, true, false, + max_depth, false, false); =20 if (unlikely(!trace)) /* couldn't fetch the stack trace */ @@ -420,8 +420,8 @@ static long __bpf_get_stack(struct pt_regs *regs, struc= t task_struct *task, else if (kernel && task) trace =3D get_callchain_entry_for_task(task, max_depth); else - trace =3D get_perf_callchain(regs, 0, kernel, user, max_depth, - false, false); + trace =3D get_perf_callchain(regs, 0, kernel, user, true, false, + max_depth, false, false); if (unlikely(!trace)) goto err_fault; =20 diff --git a/kernel/events/callchain.c b/kernel/events/callchain.c index 1273be84392c..7e80729e95d0 100644 --- a/kernel/events/callchain.c +++ b/kernel/events/callchain.c @@ -45,6 +45,10 @@ __weak void perf_callchain_user(struct perf_callchain_en= try_ctx *entry, { } =20 +__weak void perf_callchain_guest(struct perf_callchain_entry_ctx *entry) +{ +} + static void release_callchain_buffers_rcu(struct rcu_head *head) { struct callchain_cpus_entries *entries; @@ -178,11 +182,12 @@ put_callchain_entry(int rctx) =20 struct perf_callchain_entry * get_perf_callchain(struct pt_regs *regs, u32 init_nr, bool kernel, bool us= er, - u32 max_stack, bool crosstask, bool add_mark) + bool host, bool guest, u32 max_stack, bool crosstask, bool add_mark) { struct perf_callchain_entry *entry; struct perf_callchain_entry_ctx ctx; int rctx; + unsigned int guest_state; =20 entry =3D get_callchain_entry(&rctx); if (!entry) @@ -194,6 +199,26 @@ get_perf_callchain(struct pt_regs *regs, u32 init_nr, = bool kernel, bool user, ctx.contexts =3D 0; ctx.contexts_maxed =3D false; =20 + guest_state =3D perf_guest_state(); + if (guest_state) { + if (!guest) + goto exit_put; + if (user && (guest_state & PERF_GUEST_USER)) { + if (add_mark) + perf_callchain_store_context(&ctx, PERF_CONTEXT_GUEST_USER); + perf_callchain_guest(&ctx); + } + if (kernel && !(guest_state & PERF_GUEST_USER)) { + if (add_mark) + perf_callchain_store_context(&ctx, PERF_CONTEXT_GUEST_KERNEL); + perf_callchain_guest(&ctx); + } + goto exit_put; + } + + if (unlikely(!host)) + goto exit_put; + if (kernel && !user_mode(regs)) { if (add_mark) perf_callchain_store_context(&ctx, PERF_CONTEXT_KERNEL); diff --git a/kernel/events/core.c b/kernel/events/core.c index 4c5e35006217..3dea3fe840e6 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -7607,6 +7607,8 @@ perf_callchain(struct perf_event *event, struct pt_re= gs *regs) { bool kernel =3D !event->attr.exclude_callchain_kernel; bool user =3D !event->attr.exclude_callchain_user; + bool host =3D !event->attr.exclude_host; + bool guest =3D !event->attr.exclude_guest; /* Disallow cross-task user callchains. */ bool crosstask =3D event->ctx->task && event->ctx->task !=3D current; const u32 max_stack =3D event->attr.sample_max_stack; @@ -7615,7 +7617,10 @@ perf_callchain(struct perf_event *event, struct pt_r= egs *regs) if (!kernel && !user) return &__empty_callchain; =20 - callchain =3D get_perf_callchain(regs, 0, kernel, user, + if (!host && !guest) + return &__empty_callchain; + + callchain =3D get_perf_callchain(regs, 0, kernel, user, host, guest, max_stack, crosstask, true); return callchain ?: &__empty_callchain; } --=20 2.34.1 From nobody Mon Feb 9 00:22:04 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9905CC4167B for ; Sun, 10 Dec 2023 08:16:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231915AbjLJIQm (ORCPT ); Sun, 10 Dec 2023 03:16:42 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42684 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231653AbjLJIQk (ORCPT ); Sun, 10 Dec 2023 03:16:40 -0500 Received: from AUS01-SY4-obe.outbound.protection.outlook.com (mail-sy4aus01olkn2174.outbound.protection.outlook.com [40.92.62.174]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A88D7E3; Sun, 10 Dec 2023 00:16:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Mj7clTcRpmfwzuRoAM2B6W3luIjSu7oVWJ08o0LokHbqJWcbKerHEzHo2+uduiaaHohLMg/FFiUoq7u+k1dCAvXFCuaBRJRtlAkEYe2PJpBgA6VVPWK6ilkRk6cIp6pK9b7H02u4WVNQ/UUQo1b1ULotD03+qqRh5NLpTqqr0LdcOvApLk3aMfpzbKeB4nTWmwUDdw9t4400LuygtROOH/tgHCG1zwPCUp7HHW6HKEBnCXe4YaKgEkiUvcd1DI6WecfNZC1Qg7z5+KKsFcFjlOtCq/wYUD9s9ZVzvk0RfH/wKxr1AjD0CV25h3wbnyOpUEUmaZHWGhjkih0/3ghaMQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Mhds1yoBbjrhkjhv8XPbO4OPO72aaoNMvMxayRbgsR4=; b=MRClbKtrKhZpjDdAAOpgwOjwoU8o3wE5WJveyCYqWIpUX1rONUmCyFPvbRTg48/ilYO73ZYqZn1iqLO6+NK57/cEc6HdgHjOBM2im2TVUnuQBW0m5ewtGGkUBURMTNpZKU2xWpEdELGo7sQY4cJyw6JF/DG1I/AkF+2y3Dumg0ihmAH58amWObIYMvSfC1JQeUB6gWBZKLnZJPA66WSwvtLdLT0mSHFE2KuI8fWFq2hNJx6E3adFZdW1WDRFbx001y9LlrYg3iZAqbsysMYOXMwEd2rDI1pLcBm96sbeZeJhyV7/bfe1B8vbhXl8uu2hJ3aZF6o6+7VKINSzRJZZpg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Mhds1yoBbjrhkjhv8XPbO4OPO72aaoNMvMxayRbgsR4=; b=czuqyxI+/jLrCtACYpUdol1ZJojbdl0voVkq3eixcteJ/IE90MsP6luwZCfzcMzdvTlKYVTLbi5tJb+h9aNfrVOFxJnH69DNtENmv6KffJaUTdtGodx0F49pTD4Dzcip3O1KqcGcKmlT5mycXGQMnohF+kTO1Qf1L+EnrwUNk0sh62pgFgjjjSbLWXJ+lr7Nl+J/gy5BSRK7yEOzl9t52m+9lBpceHVArMqZjv1Ic68R2Y+A7mmvQvwd3fS/tnoSjD4f8Fga9Lom5WRg9u8wILwMvi8lg4WBYpPrXsbKSCYTtSAwfKqIF61Rtvi0pE1LjckqfSW8kxu8aSHGSAefmw== Received: from SYBPR01MB6870.ausprd01.prod.outlook.com (2603:10c6:10:13d::10) by MEYPR01MB7339.ausprd01.prod.outlook.com (2603:10c6:220:15f::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7068.31; Sun, 10 Dec 2023 08:16:38 +0000 Received: from SYBPR01MB6870.ausprd01.prod.outlook.com ([fe80::be5a:160f:5418:9deb]) by SYBPR01MB6870.ausprd01.prod.outlook.com ([fe80::be5a:160f:5418:9deb%5]) with mapi id 15.20.7068.030; Sun, 10 Dec 2023 08:16:38 +0000 From: Tianyi Liu To: seanjc@google.com, pbonzini@redhat.com, peterz@infradead.org, mingo@redhat.com, acme@kernel.org Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, kvm@vger.kernel.org, x86@kernel.org, mark.rutland@arm.com, mlevitsk@redhat.com, maz@kernel.org, alexander.shishkin@linux.intel.com, jolsa@kernel.org, namhyung@kernel.org, irogers@google.com, adrian.hunter@intel.com, Tianyi Liu Subject: [PATCH v3 5/5] perf tools: Support PERF_CONTEXT_GUEST_* flags Date: Sun, 10 Dec 2023 16:16:14 +0800 Message-ID: X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-TMN: [8UVhiSmk+ilYe9quhayyz4kLLAPhV41H68ne61CRE+RkAwuHwNnW+A==] X-ClientProxiedBy: SG2P153CA0040.APCP153.PROD.OUTLOOK.COM (2603:1096:4:c6::9) To SYBPR01MB6870.ausprd01.prod.outlook.com (2603:10c6:10:13d::10) X-Microsoft-Original-Message-ID: <20231210081614.2435-1-i.pear@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SYBPR01MB6870:EE_|MEYPR01MB7339:EE_ X-MS-Office365-Filtering-Correlation-Id: ea4a1d05-76d7-4776-7e34-08dbf958554b X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 8KlL61KGK3844bxqcw2mjgws6tBrdbjGDYJLTUij/sCbrkbRQ9yEaxqamA5ScAvluCCmn5N/sVhI7etP8Grtx20mq9nYuREuuIRcf7sQoX35ZkFcaWWTmEmAolzKfhhy9YTa3GIow3x1DrR26RpnEDOhFOMuNMT9ndbUXrdTO1tijtCixldnQ+sEU1TotpzLEfbkByd1J5N5n4yiWMs+LTR0D6uwehA8ypOw9t3SYl8abVWwTxPQkS4YrvIIATv+9isVIdC8MNnxmTY2280yuRPce74WnF9T1W6rPo8+yS5+vNHkEhbetC/Lt8RDf4siTWmeqNdKmPSYoaeuVUIW2x5S4MlENHlbHaRHC6tOLHLGst5kQ86nkYnRruEa/IxMhtVNxPEog3mqZCQWl9afEWTHWlYUXVaDiIJvvTo5SDyIJMmEdHSrMpw9R9ZA+PGiPQVN+gxvxTXjbLm6VZHR++BtBLVp07kbNUeRS1ars6DErcgqyl2y/9SaBJSa3VmT14knUt5Inqj5VSzg5BafYp52mJMIA9vQOCFZAj8EnIbdDW1QwkW5Y2NZ3L/XYz4hUGYPnkkZA7vcVqOWF4SDWoTJShlOFbq/upMwa0P1dF5kFlTg6UvWHSspWoE7MIEv X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?KfEbjl6a6Sqms5Et/MeX36Qw/8VPmzfQ/l24QGo9AzUEAYvEhe/XKQFi0HiU?= =?us-ascii?Q?uLdJtjjeWxkV9CbU16DjwhY4NJvTyKQ2Q1IwcOMgnwl9RxhfJfrfe7QBHfqz?= =?us-ascii?Q?r7CzFR4yPNskOZkcdiwmG7e4eFPyLAZQFBRWDS9B4O92p1u0Lz/x41uUsEce?= =?us-ascii?Q?qM+qua2lkIaDuTqiDmFtNn4yIrAN3XOvALwlL7eZcKmnpduQ6N3iicyojbSR?= =?us-ascii?Q?dnxTdRAxhSwEzHsBwY5G0xAdiO0shG8zlBhWlGORZ7BkJ+iBjGdW0A5Oa9TR?= =?us-ascii?Q?cAgFNYbLtvxoQrqUW2AtuMHoQPLGGMGzp3jWBIBJyA5JFzuSeAEXiEdXAM03?= =?us-ascii?Q?n4/OsGGprziqjLFX1Q0Gkj8eunkfQ0AdJn/QhlxpSffJby2verSBwD0bLXtr?= =?us-ascii?Q?43ResD7TrvF58c7FFkKeNVyK6zrzy8dxkvRdXLmkqvCtB48FRDLolEXpz5p4?= =?us-ascii?Q?NZXBTzxFn8uTmZHDVwQgmY1hL+4lQLazqQar11Uyuhg1GsCg4tXL1bo4w2jb?= =?us-ascii?Q?jkLnOV/s4KGbOkBjAo3/UBnNAbrlJBHFjkaaPd/7M5rOsaIfvZtWuclQ7LYq?= =?us-ascii?Q?kGw/mWXNsWCRKc4Q7pArjkJPiI9Y1TP5bzOJLpzjbafdFLBs7K7TPYyJ7gId?= =?us-ascii?Q?/OJuFp63Ps3K6FZ+AZIsNh1LB5QC+/nbX6nB80qtK2YKdW2l3cNPaVNJ07ay?= =?us-ascii?Q?ApbjN69a/hI5LsVWo40l7CMyKLaJ3bUTPmwZC0Z4TwurZrrYqUWWA5RuIFac?= =?us-ascii?Q?IglBm0TTopp8zQ4eRlBTKjPAFg07ryA9EOPLOmFiqRUQWbksE6/8Z5XmceA5?= =?us-ascii?Q?mvCuW5ITzyP5KTUtRUjUizWqgIa7N5T+fujzcTkannuCKNZ61Bqa7DpewIz4?= =?us-ascii?Q?xWCjTelW71QJre1aWOtoDSygZAKj5iwZoB5aPnVkoT5eDojCyC+rNQ6XZT5U?= =?us-ascii?Q?5alCoAl/5P+XrA8PSUUeeLVaU4BxPXkeCNFcTUc26/yZ2APDg/QfP8romr/l?= =?us-ascii?Q?onN/Zoy1faXmhBL7iD8qSQQDMfBQ4ndz7h1VibyWE6zn+CYsdBv4uyAibKxr?= =?us-ascii?Q?/HszVvkGTJc5Zu6eaS8XFojieu6AzEuzDMV6pEyhq3m0zQ9wdPmBRuQGm6QW?= =?us-ascii?Q?PTSzhpeIloU0y1PvZhjJJgnOhrLPJN6ldj5cEBxiRkc7HmKWmPnZoQAHa6Lq?= =?us-ascii?Q?hotUe9DY2aYNWhHlxUjKUz7vDGFn/3Wl25fqPQiWOUZndr1zJsdvrZZY0uAS?= =?us-ascii?Q?9VZqthVg+h498A6Ddnq7?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: ea4a1d05-76d7-4776-7e34-08dbf958554b X-MS-Exchange-CrossTenant-AuthSource: SYBPR01MB6870.ausprd01.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Dec 2023 08:16:38.9013 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: MEYPR01MB7339 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The `perf` util currently has an incomplete implementation for the following event flags. Events with these flags will be dropped or be identified as unknown types: `PERF_CONTEXT_GUEST_KERNEL` `PERF_CONTEXT_GUEST_USER` This patch makes `perf script`, `perf timechart` and `perf data` to correctly identify these flags. Signed-off-by: Tianyi Liu --- tools/perf/builtin-timechart.c | 6 ++++++ tools/perf/util/data-convert-json.c | 6 ++++++ tools/perf/util/machine.c | 6 ++++++ 3 files changed, 18 insertions(+) diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c index 19d4542ea18a..6a368b6a323e 100644 --- a/tools/perf/builtin-timechart.c +++ b/tools/perf/builtin-timechart.c @@ -536,6 +536,12 @@ static const char *cat_backtrace(union perf_event *eve= nt, case PERF_CONTEXT_USER: cpumode =3D PERF_RECORD_MISC_USER; break; + case PERF_CONTEXT_GUEST_KERNEL: + cpumode =3D PERF_RECORD_MISC_GUEST_KERNEL; + break; + case PERF_CONTEXT_GUEST_USER: + cpumode =3D PERF_RECORD_MISC_GUEST_USER; + break; default: pr_debug("invalid callchain context: " "%"PRId64"\n", (s64) ip); diff --git a/tools/perf/util/data-convert-json.c b/tools/perf/util/data-con= vert-json.c index 5bb3c2ba95ca..62686f78d973 100644 --- a/tools/perf/util/data-convert-json.c +++ b/tools/perf/util/data-convert-json.c @@ -205,6 +205,12 @@ static int process_sample_event(struct perf_tool *tool, case PERF_CONTEXT_USER: cpumode =3D PERF_RECORD_MISC_USER; break; + case PERF_CONTEXT_GUEST_KERNEL: + cpumode =3D PERF_RECORD_MISC_GUEST_KERNEL; + break; + case PERF_CONTEXT_GUEST_USER: + cpumode =3D PERF_RECORD_MISC_GUEST_USER; + break; default: pr_debug("invalid callchain context: %" PRId64 "\n", (s64) ip); diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index 90c750150b19..28eac11d0f61 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c @@ -2343,6 +2343,12 @@ static int add_callchain_ip(struct thread *thread, case PERF_CONTEXT_USER: *cpumode =3D PERF_RECORD_MISC_USER; break; + case PERF_CONTEXT_GUEST_KERNEL: + *cpumode =3D PERF_RECORD_MISC_GUEST_KERNEL; + break; + case PERF_CONTEXT_GUEST_USER: + *cpumode =3D PERF_RECORD_MISC_GUEST_USER; + break; default: pr_debug("invalid callchain context: " "%"PRId64"\n", (s64) ip); --=20 2.34.1