From: Carlos Llamas <cmllamas@google.com>
To: Sami Tolvanen <samitolvanen@google.com>
Cc: Kees Cook <keescook@chromium.org>,
Peter Zijlstra <peterz@infradead.org>,
Sean Christopherson <seanjc@google.com>,
LKML <linux-kernel@vger.kernel.org>,
linux-arm-kernel <linux-arm-kernel@lists.infradead.org>,
kvmarm <kvmarm@lists.cs.columbia.edu>,
kvm@vger.kernel.org, Will McVicker <willmcvicker@google.com>
Subject: Re: [PATCH v4 09/17] perf/core: Use static_call to optimize perf_guest_info_callbacks
Date: Tue, 10 Mar 2026 03:26:44 +0000 [thread overview]
Message-ID: <aa-PdKMKz5SndqB0@google.com> (raw)
In-Reply-To: <20260309223156.GA73501@google.com>
On Mon, Mar 09, 2026 at 10:31:56PM +0000, Sami Tolvanen wrote:
> Hi Carlos,
>
> If you need a stub with a matching CFI type for an arbitrary function,
> perhaps you can do something like this (arm64, untested):
>
> #define DEFINE_TYPED_STUB_RET0(name, reffunc) \
> typeof(reffunc) name; \
> __ADDRESSABLE(name); \
> asm( \
> " " __ALIGN_STR " \n" \
> " .4byte __kcfi_typeid_" #name " \n" \
> #name ": \n" \
> " bti c \n" \
> " mov x0, xzr \n" \
> " ret " \
> )
>
> For the !CONFIG_CFI case, or architectures that implement static calls,
> you can probably just point the stub to __static_call_return0:
>
> #define DEFINE_TYPED_STUB_RET0(name, reffunc) \
> typeof(reffunc) name __asm__("__static_call_return0")
>
> Sami
Oh that is pretty cool it worked for me. This is the patch I tested
with. Still needs a bit more plumbing but no more CFI issues.
---
diff --git a/arch/arm64/include/asm/linkage.h b/arch/arm64/include/asm/linkage.h
index 40bd17add539..708dbdf2c9fe 100644
--- a/arch/arm64/include/asm/linkage.h
+++ b/arch/arm64/include/asm/linkage.h
@@ -5,8 +5,10 @@
#include <asm/assembler.h>
#endif
+#include <linux/stringify.h>
+
#define __ALIGN .balign CONFIG_FUNCTION_ALIGNMENT
-#define __ALIGN_STR ".balign " #CONFIG_FUNCTION_ALIGNMENT
+#define __ALIGN_STR __stringify(__ALIGN)
/*
* When using in-kernel BTI we need to ensure that PCS-conformant
diff --git a/include/linux/static_call.h b/include/linux/static_call.h
index 78a77a4ae0ea..8b96eb66d2c8 100644
--- a/include/linux/static_call.h
+++ b/include/linux/static_call.h
@@ -184,6 +184,9 @@ extern int static_call_text_reserved(void *start, void *end);
extern long __static_call_return0(void);
+#define static_call_update_stub(name) \
+ static_call_update(name, __static_call_return0)
+
#define DEFINE_STATIC_CALL(name, _func) \
DECLARE_STATIC_CALL(name, _func); \
struct static_call_key STATIC_CALL_KEY(name) = { \
@@ -270,6 +273,9 @@ static inline int static_call_text_reserved(void *start, void *end)
extern long __static_call_return0(void);
+#define static_call_update_stub(name) \
+ static_call_update(name, __static_call_return0)
+
#define EXPORT_STATIC_CALL(name) \
EXPORT_SYMBOL(STATIC_CALL_KEY(name)); \
EXPORT_SYMBOL(STATIC_CALL_TRAMP(name))
@@ -306,8 +312,25 @@ static inline long __static_call_return0(void)
#define DEFINE_STATIC_CALL_NULL(name, _func) \
__DEFINE_STATIC_CALL(name, _func, NULL)
+/* Move somewhere under arch/arm64/... */
+#define ARCH_DEFINE_TYPED_STUB_RET0(name, reffunc) \
+ typeof(reffunc) name; \
+ __ADDRESSABLE(name); \
+ asm( \
+ " " __ALIGN_STR "\n" \
+ " .4byte __kcfi_typeid_" #name "\n" \
+ #name ":\n" \
+ " bti c\n" \
+ " mov x0, xzr\n" \
+ " ret" \
+ );
+
#define DEFINE_STATIC_CALL_RET0(name, _func) \
- __DEFINE_STATIC_CALL(name, _func, __static_call_return0)
+ ARCH_DEFINE_TYPED_STUB_RET0(__static_call_##name, _func) \
+ __DEFINE_STATIC_CALL(name, _func, __static_call_##name)
+
+#define static_call_update_stub(name) \
+ static_call_update(name, __static_call_##name)
static inline void __static_call_nop(void) { }
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 1f5699b339ec..b60a1991474b 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -7701,10 +7701,10 @@ void perf_unregister_guest_info_callbacks(struct perf_guest_info_callbacks *cbs)
return;
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_handle_intel_pt_intr, (void *)&__static_call_return0);
- static_call_update(__perf_guest_handle_mediated_pmi, (void *)&__static_call_return0);
+ static_call_update_stub(__perf_guest_state);
+ static_call_update_stub(__perf_guest_get_ip);
+ static_call_update_stub(__perf_guest_handle_intel_pt_intr);
+ static_call_update_stub(__perf_guest_handle_mediated_pmi);
synchronize_rcu();
}
EXPORT_SYMBOL_GPL(perf_unregister_guest_info_callbacks);
next prev parent reply other threads:[~2026-03-10 3:26 UTC|newest]
Thread overview: 59+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-11 2:07 [PATCH v4 00/17] perf: KVM: Fix, optimize, and clean up callbacks Sean Christopherson
2021-11-11 2:07 ` [PATCH v4 01/17] perf: Protect perf_guest_cbs with RCU Sean Christopherson
2021-11-11 7:26 ` Paolo Bonzini
2021-11-11 10:47 ` Peter Zijlstra
2021-11-12 7:55 ` Paolo Bonzini
2021-11-18 14:34 ` [tip: perf/core] " tip-bot2 for Sean Christopherson
2021-11-11 2:07 ` [PATCH v4 02/17] KVM: x86: Register perf callbacks after calling vendor's hardware_setup() Sean Christopherson
2021-11-18 14:34 ` [tip: perf/core] " tip-bot2 for Sean Christopherson
2021-11-11 2:07 ` [PATCH v4 03/17] KVM: x86: Register Processor Trace interrupt hook iff PT enabled in guest Sean Christopherson
2021-11-18 14:34 ` [tip: perf/core] " tip-bot2 for Sean Christopherson
2021-11-11 2:07 ` [PATCH v4 04/17] perf: Stop pretending that perf can handle multiple guest callbacks Sean Christopherson
2021-11-18 14:34 ` [tip: perf/core] " tip-bot2 for Sean Christopherson
2021-11-11 2:07 ` [PATCH v4 05/17] perf: Drop dead and useless guest "support" from arm, csky, nds32 and riscv Sean Christopherson
2021-11-18 14:34 ` [tip: perf/core] " tip-bot2 for Sean Christopherson
2021-11-11 2:07 ` [PATCH v4 06/17] perf/core: Rework guest callbacks to prepare for static_call support Sean Christopherson
2021-11-18 14:34 ` [tip: perf/core] " tip-bot2 for Like Xu
2021-11-11 2:07 ` [PATCH v4 07/17] perf: Add wrappers for invoking guest callbacks Sean Christopherson
2021-11-18 14:34 ` [tip: perf/core] " tip-bot2 for Sean Christopherson
2021-11-11 2:07 ` [PATCH v4 08/17] perf: Force architectures to opt-in to " Sean Christopherson
2021-11-18 14:34 ` [tip: perf/core] " tip-bot2 for Sean Christopherson
2021-11-11 2:07 ` [PATCH v4 09/17] perf/core: Use static_call to optimize perf_guest_info_callbacks Sean Christopherson
2021-11-18 14:34 ` [tip: perf/core] " tip-bot2 for Sean Christopherson
2022-02-02 18:43 ` [PATCH v4 09/17] " Sean Christopherson
2022-02-04 17:35 ` Sami Tolvanen
2022-02-06 13:08 ` Peter Zijlstra
2022-02-06 18:45 ` Kees Cook
2022-02-06 20:28 ` Peter Zijlstra
2022-02-07 2:55 ` Kees Cook
2022-02-18 22:35 ` Will McVicker
2022-08-24 16:45 ` Sean Christopherson
2026-03-09 19:27 ` Carlos Llamas
2026-03-09 22:31 ` Sami Tolvanen
2026-03-10 3:26 ` Carlos Llamas [this message]
2026-03-11 22:57 ` [PATCH] static_call: use CFI-compliant return0 stubs Carlos Llamas
2026-03-11 23:14 ` Peter Zijlstra
2026-03-12 0:16 ` Carlos Llamas
2026-03-12 7:40 ` Ard Biesheuvel
2026-03-12 8:07 ` Peter Zijlstra
2026-03-12 17:18 ` Carlos Llamas
2026-03-11 23:05 ` [PATCH v4 09/17] perf/core: Use static_call to optimize perf_guest_info_callbacks Carlos Llamas
2021-11-11 2:07 ` [PATCH v4 10/17] KVM: x86: Drop current_vcpu for kvm_running_vcpu + kvm_arch_vcpu variable Sean Christopherson
2021-11-18 14:34 ` [tip: perf/core] " tip-bot2 for Sean Christopherson
2021-11-11 2:07 ` [PATCH v4 11/17] KVM: x86: More precisely identify NMI from guest when handling PMI Sean Christopherson
2021-11-18 14:34 ` [tip: perf/core] " tip-bot2 for Sean Christopherson
2021-11-11 2:07 ` [PATCH v4 12/17] KVM: Move x86's perf guest info callbacks to generic KVM Sean Christopherson
2021-11-18 14:34 ` [tip: perf/core] " tip-bot2 for Sean Christopherson
2021-11-11 2:07 ` [PATCH v4 13/17] KVM: x86: Move Intel Processor Trace interrupt handler to vmx.c Sean Christopherson
2021-11-18 14:34 ` [tip: perf/core] " tip-bot2 for Sean Christopherson
2021-11-11 2:07 ` [PATCH v4 14/17] KVM: arm64: Convert to the generic perf callbacks Sean Christopherson
2021-11-18 14:34 ` [tip: perf/core] " tip-bot2 for Sean Christopherson
2021-11-11 2:07 ` [PATCH v4 15/17] KVM: arm64: Hide kvm_arm_pmu_available behind CONFIG_HW_PERF_EVENTS=y Sean Christopherson
2021-11-11 21:49 ` Marc Zyngier
2021-11-18 14:34 ` [tip: perf/core] " tip-bot2 for Sean Christopherson
2021-11-11 2:07 ` [PATCH v4 16/17] KVM: arm64: Drop perf.c and fold its tiny bits of code into arm.c Sean Christopherson
2021-11-11 21:49 ` Marc Zyngier
2021-11-18 14:34 ` [tip: perf/core] " tip-bot2 for Sean Christopherson
2021-11-11 2:07 ` [PATCH v4 17/17] perf: Drop guest callback (un)register stubs Sean Christopherson
2021-11-18 14:34 ` [tip: perf/core] " tip-bot2 for Sean Christopherson
2021-11-11 11:19 ` [PATCH v4 00/17] perf: KVM: Fix, optimize, and clean up callbacks Peter Zijlstra
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aa-PdKMKz5SndqB0@google.com \
--to=cmllamas@google.com \
--cc=keescook@chromium.org \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=peterz@infradead.org \
--cc=samitolvanen@google.com \
--cc=seanjc@google.com \
--cc=willmcvicker@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox