From nobody Fri Nov 29 18:33:21 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass(p=reject dis=none) header.from=google.com ARC-Seal: i=1; a=rsa-sha256; t=1632269201; cv=none; d=zohomail.com; s=zohoarc; b=Ire5YZkhAJoVNa9wm84Xu+fyrsFMtr9/gUFyaqEPruvvb+h9P37ulytH7ycSciSg/Pu6bjNhPVJtdx71TlgLrepbEuGR65FPHfDgwfNL/Cz4YIAGwNTA8VlK/3Kr5QJTUuXn/eheVi0Vm950YvMWQoRWfh0oiuKzOGNiz+S+204= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1632269201; h=Content-Type:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=Cp2CdTnLL6A1x2kdouAhprhgeg+5iimEQVWESNgPeTg=; b=kGtStsdi4mZLmYKp0wvovOe+cJ0khsaiHtIo8CA52oVNBS9iNoj8xYAX0bKq9DbdbT/qpm/TqTMJJVL3ztJMAr2hw1LGL5JNBZ5tZPd0mF+3aDfUElBFCMUmeylypsr7tRiK2ZZpm2kdQcwqk/GrWoph1VXuK6CUbpaW+xR6Ot4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 16322692016382.209224781962007; Tue, 21 Sep 2021 17:06:41 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.191997.342238 (Exim 4.92) (envelope-from ) id 1mSpmM-0003Rb-Ir; Wed, 22 Sep 2021 00:06:26 +0000 Received: by outflank-mailman (output) from mailman id 191997.342238; Wed, 22 Sep 2021 00:06:26 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1mSpmM-0003RT-F6; Wed, 22 Sep 2021 00:06:26 +0000 Received: by outflank-mailman (input) for mailman id 191997; Wed, 22 Sep 2021 00:06:24 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1mSpmK-0000pt-QD for xen-devel@lists.xenproject.org; Wed, 22 Sep 2021 00:06:24 +0000 Received: from mail-qv1-xf49.google.com (unknown [2607:f8b0:4864:20::f49]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id ed1d47d4-d448-4e03-a056-0c7e6cfc8e76; Wed, 22 Sep 2021 00:05:57 +0000 (UTC) Received: by mail-qv1-xf49.google.com with SMTP id cf6-20020a05621403e600b0037a70d2f960so7547939qvb.13 for ; Tue, 21 Sep 2021 17:05:57 -0700 (PDT) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: ed1d47d4-d448-4e03-a056-0c7e6cfc8e76 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=reply-to:date:in-reply-to:message-id:mime-version:references :subject:from:to:cc; bh=Cp2CdTnLL6A1x2kdouAhprhgeg+5iimEQVWESNgPeTg=; b=im2v/L0cygljwm5grHDru5KUhJuz5mZRJLACtD7RonWb5WoFe/D5WuNqzEdPm4G7v8 rtZr1SHPj05vTG7DdnlSfc+js4UC81QNGDJIA03zdbB9ZdKNy7ID7mCnhXtnu+34C5yg kUtUAZ7DnWVxLqGUghCbUvK1tlzpDYoybfavKORupjQBShzw6o2YA6YeI5IYrMg7CfgX eElXUTHHYzoIzH2D6fm/ZsLOYCZfPdqD00Yv1xavmD27sqD4jDFv4lzctvG3WIPr12RY fcZFN2Q5aGT2PHFfiGVI0yXdul/Sbxc2AMnbSor81BxbiWNV0X2MfR+Z7ZjLq99nqexs iEqw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:reply-to:date:in-reply-to:message-id :mime-version:references:subject:from:to:cc; bh=Cp2CdTnLL6A1x2kdouAhprhgeg+5iimEQVWESNgPeTg=; b=w0Rdl/sDbvpxrNAF6AsD5IGnSLvNN0YkU7oXZdSKhl3ij7MZFc1V+cdNXwR4emczTK i2Wr8DOU6Bi8BDKceVcgdT3zcJdswpR9dSbtBch4vfbW2OiG89mgrMBkXNH3tC8B8qVe YYANMmRm2dKOIL59+dc5MCKSsfLcRFwELLC/qrQfVuu9FhXd+iq0UpFIMPGCKKTNScJb 6wvy+fPXT5t0CLay5Tjkj+11l5G1L5r0nKG9oHhj+i+1J0ttfSLpUBz9CYGj1c8ggjVW lbwf3SaX3DlwRuH4ofYa0XEV+4iqj0qkvKflMBy33sMcv5e7E/UCjl74kay5usDOVWuE Y7kQ== X-Gm-Message-State: AOAM531PUc2RkzuKjsZQuSbuK32kIL3IVAkzVz+BEHwt0+OA7XHr97G/ MRUNcBt4AyRqVzFehZ8qSi0yOw90MAs= X-Google-Smtp-Source: ABdhPJzsZI5IFhqZMKlAhv/Y45oE9l0vm7I+arslrU5gdLF3H8fHDTQL7yct2ww41HqVKvUsbfn37B7Lw9I= X-Received: from seanjc798194.pdx.corp.google.com ([2620:15c:90:200:b022:92d6:d37b:686c]) (user=seanjc job=sendgmr) by 2002:ad4:4671:: with SMTP id z17mr33495586qvv.62.1632269156742; Tue, 21 Sep 2021 17:05:56 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 21 Sep 2021 17:05:23 -0700 In-Reply-To: <20210922000533.713300-1-seanjc@google.com> Message-Id: <20210922000533.713300-7-seanjc@google.com> Mime-Version: 1.0 References: <20210922000533.713300-1-seanjc@google.com> X-Mailer: git-send-email 2.33.0.464.g1972c5931b-goog Subject: [PATCH v3 06/16] perf/core: Rework guest callbacks to prepare for static_call support From: Sean Christopherson To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Will Deacon , Mark Rutland , Marc Zyngier , Guo Ren , Nick Hu , Greentime Hu , Vincent Chen , Paul Walmsley , Palmer Dabbelt , Albert Ou , Paolo Bonzini , Boris Ostrovsky , Juergen Gross Cc: Alexander Shishkin , Jiri Olsa , Namhyung Kim , James Morse , Alexandru Elisei , Suzuki K Poulose , Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , Stefano Stabellini , linux-arm-kernel@lists.infradead.org, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, kvmarm@lists.cs.columbia.edu, linux-csky@vger.kernel.org, linux-riscv@lists.infradead.org, kvm@vger.kernel.org, xen-devel@lists.xenproject.org, Artem Kashkanov , Like Xu , Zhu Lingshan X-ZohoMail-DKIM: pass (identity @google.com) X-ZM-MESSAGEID: 1632269203990100001 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Like Xu To prepare for using static_calls to optimize perf's guest callbacks, replace ->is_in_guest and ->is_user_mode with a new multiplexed hook ->state, tweak ->handle_intel_pt_intr to play nice with being called when there is no active guest, and drop "guest" from ->is_in_guest. Return '0' from ->state and ->handle_intel_pt_intr to indicate "not in guest" so that DEFINE_STATIC_CALL_RET0 can be used to define the static calls, i.e. no callback =3D=3D !guest. Suggested-by: Peter Zijlstra (Intel) Originally-by: Peter Zijlstra (Intel) Signed-off-by: Like Xu Signed-off-by: Zhu Lingshan [sean: extracted from static_call patch, fixed get_ip() bug, wrote changelo= g] Signed-off-by: Sean Christopherson Reviewed-by: Boris Ostrovsky Reviewed-by: Paolo Bonzini --- arch/arm64/kernel/perf_callchain.c | 13 +++++----- arch/arm64/kvm/perf.c | 35 +++++++++++--------------- arch/x86/events/core.c | 13 +++++----- arch/x86/events/intel/core.c | 5 +--- arch/x86/include/asm/kvm_host.h | 2 +- arch/x86/kvm/pmu.c | 2 +- arch/x86/kvm/x86.c | 40 ++++++++++++++++-------------- arch/x86/xen/pmu.c | 32 ++++++++++-------------- include/linux/perf_event.h | 10 +++++--- kernel/events/core.c | 1 + 10 files changed, 74 insertions(+), 79 deletions(-) diff --git a/arch/arm64/kernel/perf_callchain.c b/arch/arm64/kernel/perf_ca= llchain.c index 86d9f2013172..274dc3e11b6d 100644 --- a/arch/arm64/kernel/perf_callchain.c +++ b/arch/arm64/kernel/perf_callchain.c @@ -104,7 +104,7 @@ void perf_callchain_user(struct perf_callchain_entry_ct= x *entry, { struct perf_guest_info_callbacks *guest_cbs =3D perf_get_guest_cbs(); =20 - if (guest_cbs && guest_cbs->is_in_guest()) { + if (guest_cbs && guest_cbs->state()) { /* We don't support guest os callchain now */ return; } @@ -152,7 +152,7 @@ void perf_callchain_kernel(struct perf_callchain_entry_= ctx *entry, struct perf_guest_info_callbacks *guest_cbs =3D perf_get_guest_cbs(); struct stackframe frame; =20 - if (guest_cbs && guest_cbs->is_in_guest()) { + if (guest_cbs && guest_cbs->state()) { /* We don't support guest os callchain now */ return; } @@ -165,8 +165,8 @@ unsigned long perf_instruction_pointer(struct pt_regs *= regs) { struct perf_guest_info_callbacks *guest_cbs =3D perf_get_guest_cbs(); =20 - if (guest_cbs && guest_cbs->is_in_guest()) - return guest_cbs->get_guest_ip(); + if (guest_cbs && guest_cbs->state()) + return guest_cbs->get_ip(); =20 return instruction_pointer(regs); } @@ -174,10 +174,11 @@ unsigned long perf_instruction_pointer(struct pt_regs= *regs) unsigned long perf_misc_flags(struct pt_regs *regs) { struct perf_guest_info_callbacks *guest_cbs =3D perf_get_guest_cbs(); + unsigned int guest_state =3D guest_cbs ? guest_cbs->state() : 0; int misc =3D 0; =20 - if (guest_cbs && guest_cbs->is_in_guest()) { - if (guest_cbs->is_user_mode()) + if (guest_state) { + if (guest_state & PERF_GUEST_USER) misc |=3D PERF_RECORD_MISC_GUEST_USER; else misc |=3D PERF_RECORD_MISC_GUEST_KERNEL; diff --git a/arch/arm64/kvm/perf.c b/arch/arm64/kvm/perf.c index c37c0cf1bfe9..3e99ac4ab2d6 100644 --- a/arch/arm64/kvm/perf.c +++ b/arch/arm64/kvm/perf.c @@ -13,39 +13,34 @@ =20 DEFINE_STATIC_KEY_FALSE(kvm_arm_pmu_available); =20 -static int kvm_is_in_guest(void) +static unsigned int kvm_guest_state(void) { - return kvm_get_running_vcpu() !=3D NULL; -} + struct kvm_vcpu *vcpu =3D kvm_get_running_vcpu(); + unsigned int state; =20 -static int kvm_is_user_mode(void) -{ - struct kvm_vcpu *vcpu; - - vcpu =3D kvm_get_running_vcpu(); + if (!vcpu) + return 0; =20 - if (vcpu) - return !vcpu_mode_priv(vcpu); + state =3D PERF_GUEST_ACTIVE; + if (!vcpu_mode_priv(vcpu)) + state |=3D PERF_GUEST_USER; =20 - return 0; + return state; } =20 static unsigned long kvm_get_guest_ip(void) { - struct kvm_vcpu *vcpu; + struct kvm_vcpu *vcpu =3D kvm_get_running_vcpu(); =20 - vcpu =3D kvm_get_running_vcpu(); + if (WARN_ON_ONCE(!vcpu)) + return 0; =20 - if (vcpu) - return *vcpu_pc(vcpu); - - return 0; + return *vcpu_pc(vcpu); } =20 static struct perf_guest_info_callbacks kvm_guest_cbs =3D { - .is_in_guest =3D kvm_is_in_guest, - .is_user_mode =3D kvm_is_user_mode, - .get_guest_ip =3D kvm_get_guest_ip, + .state =3D kvm_guest_state, + .get_ip =3D kvm_get_guest_ip, }; =20 void kvm_perf_init(void) diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c index ffb3e6c0d367..3a7630fdd340 100644 --- a/arch/x86/events/core.c +++ b/arch/x86/events/core.c @@ -2765,7 +2765,7 @@ perf_callchain_kernel(struct perf_callchain_entry_ctx= *entry, struct pt_regs *re struct unwind_state state; unsigned long addr; =20 - if (guest_cbs && guest_cbs->is_in_guest()) { + if (guest_cbs && guest_cbs->state()) { /* TODO: We don't support guest os callchain now */ return; } @@ -2869,7 +2869,7 @@ 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 (guest_cbs && guest_cbs->is_in_guest()) { + if (guest_cbs && guest_cbs->state()) { /* TODO: We don't support guest os callchain now */ return; } @@ -2948,8 +2948,8 @@ unsigned long perf_instruction_pointer(struct pt_regs= *regs) { struct perf_guest_info_callbacks *guest_cbs =3D perf_get_guest_cbs(); =20 - if (guest_cbs && guest_cbs->is_in_guest()) - return guest_cbs->get_guest_ip(); + if (guest_cbs && guest_cbs->state()) + return guest_cbs->get_ip(); =20 return regs->ip + code_segment_base(regs); } @@ -2957,10 +2957,11 @@ unsigned long perf_instruction_pointer(struct pt_re= gs *regs) unsigned long perf_misc_flags(struct pt_regs *regs) { struct perf_guest_info_callbacks *guest_cbs =3D perf_get_guest_cbs(); + unsigned int guest_state =3D guest_cbs ? guest_cbs->state() : 0; int misc =3D 0; =20 - if (guest_cbs && guest_cbs->is_in_guest()) { - if (guest_cbs->is_user_mode()) + if (guest_state) { + if (guest_state & PERF_GUEST_USER) misc |=3D PERF_RECORD_MISC_GUEST_USER; else misc |=3D PERF_RECORD_MISC_GUEST_KERNEL; diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c index 9baa46185d94..524ad1f747bd 100644 --- a/arch/x86/events/intel/core.c +++ b/arch/x86/events/intel/core.c @@ -2855,10 +2855,7 @@ static int handle_pmi_common(struct pt_regs *regs, u= 64 status) handled++; =20 guest_cbs =3D perf_get_guest_cbs(); - if (unlikely(guest_cbs && guest_cbs->is_in_guest() && - guest_cbs->handle_intel_pt_intr)) - guest_cbs->handle_intel_pt_intr(); - else + if (likely(!guest_cbs || !guest_cbs->handle_intel_pt_intr())) intel_pt_interrupt(); } =20 diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_hos= t.h index 1ea4943a73d7..1080166fc0cf 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1874,7 +1874,7 @@ int kvm_skip_emulated_instruction(struct kvm_vcpu *vc= pu); int kvm_complete_insn_gp(struct kvm_vcpu *vcpu, int err); void __kvm_request_immediate_exit(struct kvm_vcpu *vcpu); =20 -int kvm_is_in_guest(void); +unsigned int kvm_guest_state(void); =20 void __user *__x86_set_memory_region(struct kvm *kvm, int id, gpa_t gpa, u32 size); diff --git a/arch/x86/kvm/pmu.c b/arch/x86/kvm/pmu.c index 0772bad9165c..5b68d4188de0 100644 --- a/arch/x86/kvm/pmu.c +++ b/arch/x86/kvm/pmu.c @@ -87,7 +87,7 @@ static void kvm_perf_overflow_intr(struct perf_event *per= f_event, * woken up. So we should wake it, but this is impossible from * NMI context. Do it from irq work instead. */ - if (!kvm_is_in_guest()) + if (!kvm_guest_state()) irq_work_queue(&pmc_to_pmu(pmc)->irq_work); else kvm_make_request(KVM_REQ_PMI, pmc->vcpu); diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index ffc6c2d73508..6cc66466f301 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -8267,44 +8267,48 @@ static void kvm_timer_init(void) DEFINE_PER_CPU(struct kvm_vcpu *, current_vcpu); EXPORT_PER_CPU_SYMBOL_GPL(current_vcpu); =20 -int kvm_is_in_guest(void) +unsigned int kvm_guest_state(void) { - return __this_cpu_read(current_vcpu) !=3D NULL; -} + struct kvm_vcpu *vcpu =3D __this_cpu_read(current_vcpu); + unsigned int state; =20 -static int kvm_is_user_mode(void) -{ - int user_mode =3D 3; + if (!vcpu) + return 0; =20 - if (__this_cpu_read(current_vcpu)) - user_mode =3D static_call(kvm_x86_get_cpl)(__this_cpu_read(current_vcpu)= ); + state =3D PERF_GUEST_ACTIVE; + if (static_call(kvm_x86_get_cpl)(vcpu)) + state |=3D PERF_GUEST_USER; =20 - return user_mode !=3D 0; + return state; } =20 -static unsigned long kvm_get_guest_ip(void) +static unsigned long kvm_guest_get_ip(void) { - unsigned long ip =3D 0; + struct kvm_vcpu *vcpu =3D __this_cpu_read(current_vcpu); =20 - if (__this_cpu_read(current_vcpu)) - ip =3D kvm_rip_read(__this_cpu_read(current_vcpu)); + if (WARN_ON_ONCE(!vcpu)) + return 0; =20 - return ip; + return kvm_rip_read(vcpu); } =20 -static void kvm_handle_intel_pt_intr(void) +static unsigned int kvm_handle_intel_pt_intr(void) { struct kvm_vcpu *vcpu =3D __this_cpu_read(current_vcpu); =20 + /* '0' on failure so that the !PT case can use a RET0 static call. */ + if (!vcpu) + return 0; + kvm_make_request(KVM_REQ_PMI, vcpu); __set_bit(MSR_CORE_PERF_GLOBAL_OVF_CTRL_TRACE_TOPA_PMI_BIT, (unsigned long *)&vcpu->arch.pmu.global_status); + return 1; } =20 static struct perf_guest_info_callbacks kvm_guest_cbs =3D { - .is_in_guest =3D kvm_is_in_guest, - .is_user_mode =3D kvm_is_user_mode, - .get_guest_ip =3D kvm_get_guest_ip, + .state =3D kvm_guest_state, + .get_ip =3D kvm_guest_get_ip, .handle_intel_pt_intr =3D NULL, }; =20 diff --git a/arch/x86/xen/pmu.c b/arch/x86/xen/pmu.c index e13b0b49fcdf..89dd6b1708b0 100644 --- a/arch/x86/xen/pmu.c +++ b/arch/x86/xen/pmu.c @@ -413,34 +413,29 @@ int pmu_apic_update(uint32_t val) } =20 /* perf callbacks */ -static int xen_is_in_guest(void) +static unsigned int xen_guest_state(void) { const struct xen_pmu_data *xenpmu_data =3D get_xenpmu_data(); + unsigned int state =3D 0; =20 if (!xenpmu_data) { pr_warn_once("%s: pmudata not initialized\n", __func__); - return 0; + return state; } =20 if (!xen_initial_domain() || (xenpmu_data->domain_id >=3D DOMID_SELF)) - return 0; + return state; =20 - return 1; -} + state |=3D PERF_GUEST_ACTIVE; =20 -static int xen_is_user_mode(void) -{ - const struct xen_pmu_data *xenpmu_data =3D get_xenpmu_data(); - - if (!xenpmu_data) { - pr_warn_once("%s: pmudata not initialized\n", __func__); - return 0; + if (xenpmu_data->pmu.pmu_flags & PMU_SAMPLE_PV) { + if (xenpmu_data->pmu.pmu_flags & PMU_SAMPLE_USER) + state |=3D PERF_GUEST_USER; + } else if (xenpmu_data->pmu.r.regs.cpl & 3) { + state |=3D PERF_GUEST_USER; } =20 - if (xenpmu_data->pmu.pmu_flags & PMU_SAMPLE_PV) - return (xenpmu_data->pmu.pmu_flags & PMU_SAMPLE_USER); - else - return !!(xenpmu_data->pmu.r.regs.cpl & 3); + return state; } =20 static unsigned long xen_get_guest_ip(void) @@ -456,9 +451,8 @@ static unsigned long xen_get_guest_ip(void) } =20 static struct perf_guest_info_callbacks xen_guest_cbs =3D { - .is_in_guest =3D xen_is_in_guest, - .is_user_mode =3D xen_is_user_mode, - .get_guest_ip =3D xen_get_guest_ip, + .state =3D xen_guest_state, + .get_ip =3D xen_get_guest_ip, }; =20 /* Convert registers from Xen's format to Linux' */ diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 317d4658afe9..f9be88a47434 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -26,11 +26,13 @@ # include #endif =20 +#define PERF_GUEST_ACTIVE 0x01 +#define PERF_GUEST_USER 0x02 + struct perf_guest_info_callbacks { - int (*is_in_guest)(void); - int (*is_user_mode)(void); - unsigned long (*get_guest_ip)(void); - void (*handle_intel_pt_intr)(void); + unsigned int (*state)(void); + unsigned long (*get_ip)(void); + unsigned int (*handle_intel_pt_intr)(void); }; =20 #ifdef CONFIG_HAVE_HW_BREAKPOINT diff --git a/kernel/events/core.c b/kernel/events/core.c index d90a43572400..2e3dc9fbd5d9 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -6483,6 +6483,7 @@ static void perf_pending_event(struct irq_work *entry) } =20 struct perf_guest_info_callbacks *perf_guest_cbs; + void perf_register_guest_info_callbacks(struct perf_guest_info_callbacks *= cbs) { if (WARN_ON_ONCE(perf_guest_cbs)) --=20 2.33.0.464.g1972c5931b-goog