From nobody Mon Feb 9 16:35:01 2026 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=1630111032; cv=none; d=zohomail.com; s=zohoarc; b=E3rTuRoHpP79DHd0n4RpoV27zIdNHpKQbhJg5W+8sJT76WZoGETEQRnKmI0bwFFwnUG/RhzVys4NwwLzWVbzuoqM8Ige3KcOOyl4Ifet+ejePZhg67yhNr1qVfY15h4o/uCXnOkJHMB1TUEoud3t01Tf6nFJGFUFXxTtDBKpiUM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1630111032; 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=0YXYNwfO2nP0d/8tcUlJOlRfQipYSfj6KR9im5qFSzU=; b=SmOx7a7rmpdjVGig9g1LPYByTpQU6cqChVQECQxaVtUujNP8vFoX7jjPkktOqiZ1bLG83eXuguuaNZTplukUI+P5QwCwBOVkNV3nLJ2zpZ/jZjSKe1fulMoTqG4Zz642qv9QQlpreqe6bUJpj270B8PcdPVk4/XbvA63Sbf27cI= 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 163011103218611.759935257003235; Fri, 27 Aug 2021 17:37:12 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.174046.317561 (Exim 4.92) (envelope-from ) id 1mJmLC-0006Sx-23; Sat, 28 Aug 2021 00:36:58 +0000 Received: by outflank-mailman (output) from mailman id 174046.317561; Sat, 28 Aug 2021 00:36:58 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1mJmLB-0006Rt-Ue; Sat, 28 Aug 2021 00:36:57 +0000 Received: by outflank-mailman (input) for mailman id 174046; Sat, 28 Aug 2021 00:36:56 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1mJmLA-0003pb-GI for xen-devel@lists.xenproject.org; Sat, 28 Aug 2021 00:36:56 +0000 Received: from mail-yb1-xb4a.google.com (unknown [2607:f8b0:4864:20::b4a]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id 25f6a977-aae4-4981-8c9d-2ee9ffd0d29a; Sat, 28 Aug 2021 00:36:39 +0000 (UTC) Received: by mail-yb1-xb4a.google.com with SMTP id f8-20020a2585480000b02905937897e3daso1666669ybn.2 for ; Fri, 27 Aug 2021 17:36:39 -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: 25f6a977-aae4-4981-8c9d-2ee9ffd0d29a DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=reply-to:date:in-reply-to:message-id:mime-version:references :subject:from:to:cc; bh=0YXYNwfO2nP0d/8tcUlJOlRfQipYSfj6KR9im5qFSzU=; b=M/Xe0rMtGmxdkWl9mi5EOW9t7UlutI0HqYiemomWjM6+KLBUeVT3ObS3xgkFOcpBHA tjEreWTZww/GaibpuFp3TP6uJw/XXrbB7rgTViYSk8FfdflF+cKbmXPkirpzaUgFSwuF vLlNrQEp4R0vbB3TstwUqA/I7NNS4Ui2hk2YFYsQ9QF7i+W+jF4GnB9pW6MAQRukcU/q md3KD2Uem7PScXCJD2QVRXMKOLsNPxZapGXO+7H3E2dqptEoTOpWEpWO/03jkHSd2XRu P5sFFQ6xUG9CInfC2TWxYV5PcoFZlV4zv4dllrmT/FnIzl+/h7hBbAB8LVIwt89dViD6 wzQw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:reply-to:date:in-reply-to:message-id :mime-version:references:subject:from:to:cc; bh=0YXYNwfO2nP0d/8tcUlJOlRfQipYSfj6KR9im5qFSzU=; b=GbyD2D0W6SskeF2WVTPW46DRLtTWM1sCr2DAB6EstlKiK8+bzs5w4TolxcWFvnBugc jhJ9Kbhk4yQq+t/VcD/6R7zR+QHn3C6am6cNeAbJWIerioUXzh60GbR73smxhuEe+Ytd PDrZcrtfUFkpt3SZ5FlDa/fXVSIz8+vsSGAqTDT/8s0wkEUXkkmC3P2ZUgWnjvkT1pRE sKfCh4c37L/XyOgjGzT+c+RHFj8SFOTgX71X+Il8jGImOX0bGhmwq9jy2tF2ANWOgxvW V66XJ2HAqozprjcMqSa6q7+Pe6Ghh4ueMchHReWwfBOSBCEr8gluZN2KsASzlokyeRuQ Cr5Q== X-Gm-Message-State: AOAM5305lrd0RhX4FYV4w2ZLRFRd9Nt3tT8cE6JaIpA/Cq67DxnZz5nt ISo7C4wGzKqkqU37LAiGaIfst7ww4ds= X-Google-Smtp-Source: ABdhPJx7+h99mRUNQ5W6YGQDjwrL7hApQN1LKnrNBAh3ncOOeOsVF2BhDlqAamjvA/RKoXSaOf42ZGz737c= X-Received: from seanjc798194.pdx.corp.google.com ([2620:15c:90:200:f66c:b851:7e79:7ed4]) (user=seanjc job=sendgmr) by 2002:a25:6545:: with SMTP id z66mr9189208ybb.149.1630110999440; Fri, 27 Aug 2021 17:36:39 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 27 Aug 2021 17:35:51 -0700 In-Reply-To: <20210828003558.713983-1-seanjc@google.com> Message-Id: <20210828003558.713983-7-seanjc@google.com> Mime-Version: 1.0 References: <20210828003558.713983-1-seanjc@google.com> X-Mailer: git-send-email 2.33.0.259.gc128427fd7-goog Subject: [PATCH v2 06/13] 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 , Catalin Marinas , Marc Zyngier , Guo Ren , Nick Hu , Greentime Hu , Vincent Chen , Paul Walmsley , Palmer Dabbelt , Albert Ou , Thomas Gleixner , Borislav Petkov , x86@kernel.org, Paolo Bonzini , Boris Ostrovsky , Juergen Gross Cc: Alexander Shishkin , Jiri Olsa , Namhyung Kim , James Morse , Alexandru Elisei , Suzuki K Poulose , "H. Peter Anvin" , Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , Stefano Stabellini , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.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: 1630111032715100005 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 --- 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 039fe59399a2..893de1a51fea 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 bae951344e28..b2a4d085aa4f 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 e75971f85cc8..a5d5893b80b0 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 d7f606e06446..ec36e7aded89 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -6484,6 +6484,7 @@ static void perf_pending_event(struct irq_work *entry) =20 #ifdef CONFIG_HAVE_GUEST_PERF_EVENTS 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.259.gc128427fd7-goog