From: Sean Christopherson <seanjc@google.com>
To: Sohil Mehta <sohil.mehta@intel.com>
Cc: x86@kernel.org, linux-kernel@vger.kernel.org,
Xin Li <xin@zytor.com>, "H . Peter Anvin" <hpa@zytor.com>,
Andy Lutomirski <luto@kernel.org>,
Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
Dave Hansen <dave.hansen@linux.intel.com>,
Peter Zijlstra <peterz@infradead.org>,
Adrian Hunter <adrian.hunter@intel.com>,
Kan Liang <kan.liang@linux.intel.com>,
Tony Luck <tony.luck@intel.com>, Zhang Rui <rui.zhang@intel.com>,
Steven Rostedt <rostedt@goodmis.org>,
Andrew Cooper <andrew.cooper3@citrix.com>,
"Kirill A . Shutemov" <kirill.shutemov@linux.intel.com>,
Jacob Pan <jacob.pan@linux.microsoft.com>,
Andi Kleen <ak@linux.intel.com>, Kai Huang <kai.huang@intel.com>,
Sandipan Das <sandipan.das@amd.com>,
linux-perf-users@vger.kernel.org, linux-edac@vger.kernel.org,
kvm@vger.kernel.org, linux-pm@vger.kernel.org,
linux-trace-kernel@vger.kernel.org
Subject: Re: [PATCH v6 1/9] x86/fred, KVM: VMX: Pass event data to the FRED entry point from KVM
Date: Wed, 14 May 2025 07:15:42 -0700 [thread overview]
Message-ID: <aCSljsvI0A-HC_DT@google.com> (raw)
In-Reply-To: <20250513203803.2636561-2-sohil.mehta@intel.com>
On Tue, May 13, 2025, Sohil Mehta wrote:
> diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
> index 5c5766467a61..1d43d4a2f6b6 100644
> --- a/arch/x86/kvm/vmx/vmx.c
> +++ b/arch/x86/kvm/vmx/vmx.c
> @@ -7079,7 +7079,7 @@ static void handle_external_interrupt_irqoff(struct kvm_vcpu *vcpu,
>
> kvm_before_interrupt(vcpu, KVM_HANDLING_IRQ);
> if (cpu_feature_enabled(X86_FEATURE_FRED))
> - fred_entry_from_kvm(EVENT_TYPE_EXTINT, vector);
> + fred_entry_from_kvm(EVENT_TYPE_EXTINT, vector, 0);
> else
> vmx_do_interrupt_irqoff(gate_offset((gate_desc *)host_idt_base + vector));
> kvm_after_interrupt(vcpu);
> @@ -7393,7 +7393,8 @@ static noinstr void vmx_vcpu_enter_exit(struct kvm_vcpu *vcpu,
> is_nmi(vmx_get_intr_info(vcpu))) {
> kvm_before_interrupt(vcpu, KVM_HANDLING_NMI);
> if (cpu_feature_enabled(X86_FEATURE_FRED))
> - fred_entry_from_kvm(EVENT_TYPE_NMI, NMI_VECTOR);
> + fred_entry_from_kvm(EVENT_TYPE_NMI, NMI_VECTOR,
> + vmx_get_exit_qual(vcpu));
> else
> vmx_do_nmi_irqoff();
> kvm_after_interrupt(vcpu);
As a prep patch, what if we provide separate wrappers for IRQ vs. NMI? That way
KVM doesn't need to shove a '0' literal for the IRQ case. There isn't that much
code that's actually shared between the two, once you account for KVM having to
hardcode the NMI information.
Compile tested only...
--
From: Sean Christopherson <seanjc@google.com>
Date: Wed, 14 May 2025 07:07:55 -0700
Subject: [PATCH] x86/fred: Provide separate IRQ vs. NMI wrappers for "entry"
from KVM
Provide separate wrappers for forwarding IRQs vs NMIs from KVM in
anticipation of adding support for NMI source reporting, which will add
an NMI-only parameter, i.e. will further pollute the current API with a
param that is a hardcoded for one of the two call sites.
Opportunistically tag the non-FRED NMI wrapper __always_inline, as the
compiler could theoretically generate a function call and trigger and a
(completely benign) "leaving noinstr" warning.
Signed-off-by: Sean Christopherson <seanjc@google.com>
---
arch/x86/include/asm/fred.h | 24 +++++++++++++++++++-----
arch/x86/kvm/vmx/vmx.c | 4 ++--
2 files changed, 21 insertions(+), 7 deletions(-)
diff --git a/arch/x86/include/asm/fred.h b/arch/x86/include/asm/fred.h
index 2a29e5216881..dfb4f5e6a37a 100644
--- a/arch/x86/include/asm/fred.h
+++ b/arch/x86/include/asm/fred.h
@@ -10,6 +10,7 @@
#include <asm/asm.h>
#include <asm/trapnr.h>
+#include <asm/irq_vectors.h>
/*
* FRED event return instruction opcodes for ERET{S,U}; supported in
@@ -70,14 +71,26 @@ __visible void fred_entry_from_user(struct pt_regs *regs);
__visible void fred_entry_from_kernel(struct pt_regs *regs);
__visible void __fred_entry_from_kvm(struct pt_regs *regs);
-/* Can be called from noinstr code, thus __always_inline */
-static __always_inline void fred_entry_from_kvm(unsigned int type, unsigned int vector)
+/* Must be called from noinstr code, thus __always_inline */
+static __always_inline void fred_nmi_from_kvm(void)
{
struct fred_ss ss = {
.ss =__KERNEL_DS,
- .type = type,
+ .type = EVENT_TYPE_NMI,
+ .vector = NMI_VECTOR,
+ .nmi = true,
+ .lm = 1,
+ };
+
+ asm_fred_entry_from_kvm(ss);
+}
+
+static inline void fred_irq_from_kvm(unsigned int vector)
+{
+ struct fred_ss ss = {
+ .ss =__KERNEL_DS,
+ .type = EVENT_TYPE_EXTINT,
.vector = vector,
- .nmi = type == EVENT_TYPE_NMI,
.lm = 1,
};
@@ -109,7 +122,8 @@ static __always_inline unsigned long fred_event_data(struct pt_regs *regs) { ret
static inline void cpu_init_fred_exceptions(void) { }
static inline void cpu_init_fred_rsps(void) { }
static inline void fred_complete_exception_setup(void) { }
-static inline void fred_entry_from_kvm(unsigned int type, unsigned int vector) { }
+static __always_inline void fred_nmi_from_kvm(void) { }
+static inline void fred_irq_from_kvm(unsigned int vector) { }
static inline void fred_sync_rsp0(unsigned long rsp0) { }
static inline void fred_update_rsp0(void) { }
#endif /* CONFIG_X86_FRED */
diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
index 5c5766467a61..271f92fee76b 100644
--- a/arch/x86/kvm/vmx/vmx.c
+++ b/arch/x86/kvm/vmx/vmx.c
@@ -7079,7 +7079,7 @@ static void handle_external_interrupt_irqoff(struct kvm_vcpu *vcpu,
kvm_before_interrupt(vcpu, KVM_HANDLING_IRQ);
if (cpu_feature_enabled(X86_FEATURE_FRED))
- fred_entry_from_kvm(EVENT_TYPE_EXTINT, vector);
+ fred_irq_from_kvm(vector);
else
vmx_do_interrupt_irqoff(gate_offset((gate_desc *)host_idt_base + vector));
kvm_after_interrupt(vcpu);
@@ -7393,7 +7393,7 @@ static noinstr void vmx_vcpu_enter_exit(struct kvm_vcpu *vcpu,
is_nmi(vmx_get_intr_info(vcpu))) {
kvm_before_interrupt(vcpu, KVM_HANDLING_NMI);
if (cpu_feature_enabled(X86_FEATURE_FRED))
- fred_entry_from_kvm(EVENT_TYPE_NMI, NMI_VECTOR);
+ fred_nmi_from_kvm();
else
vmx_do_nmi_irqoff();
kvm_after_interrupt(vcpu);
base-commit: 9f35e33144ae5377d6a8de86dd3bd4d995c6ac65
--
next prev parent reply other threads:[~2025-05-14 14:15 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-13 20:37 [PATCH v6 0/9] x86: Add support for NMI-source reporting with FRED Sohil Mehta
2025-05-13 20:37 ` [PATCH v6 1/9] x86/fred, KVM: VMX: Pass event data to the FRED entry point from KVM Sohil Mehta
2025-05-14 14:15 ` Sean Christopherson [this message]
2025-05-14 21:34 ` Sohil Mehta
2025-05-16 1:15 ` Sean Christopherson
2025-06-02 20:45 ` Sohil Mehta
2025-05-13 20:37 ` [PATCH v6 2/9] x86/cpufeatures: Add the CPUID feature bit for NMI-source reporting Sohil Mehta
2025-05-13 20:37 ` [PATCH v6 3/9] x86/nmi: Extend the registration interface to include the NMI-source vector Sohil Mehta
2025-06-03 7:23 ` Xin Li
2025-06-03 17:35 ` Sohil Mehta
2025-06-03 17:07 ` Dave Hansen
2025-06-03 18:02 ` Sohil Mehta
2025-06-03 18:19 ` Dave Hansen
2025-06-03 20:24 ` Sohil Mehta
2025-05-13 20:37 ` [PATCH v6 4/9] x86/nmi: Assign and register NMI-source vectors Sohil Mehta
2025-06-03 16:34 ` Xin Li
2025-06-03 21:45 ` Sohil Mehta
2025-06-04 15:28 ` H. Peter Anvin
2025-06-11 21:34 ` Sohil Mehta
2025-06-03 17:23 ` Dave Hansen
2025-06-03 20:22 ` Sohil Mehta
2025-06-03 21:54 ` Dave Hansen
2025-06-03 22:33 ` Sohil Mehta
2025-06-04 15:22 ` H. Peter Anvin
2025-05-13 20:37 ` [PATCH v6 5/9] x86/nmi: Add support to handle NMIs with source information Sohil Mehta
2025-06-03 16:53 ` Xin Li
2025-05-13 20:38 ` [PATCH v6 6/9] x86/nmi: Prepare for the new NMI-source vector encoding Sohil Mehta
2025-05-13 20:38 ` [PATCH v6 7/9] x86/nmi: Enable NMI-source for IPIs delivered as NMIs Sohil Mehta
2025-05-13 20:38 ` [PATCH v6 8/9] perf/x86: Enable NMI-source reporting for perfmon Sohil Mehta
2025-06-03 16:57 ` Xin Li
2025-05-13 20:38 ` [PATCH v6 9/9] x86/nmi: Print source information with the unknown NMI console message Sohil Mehta
2025-06-03 16:55 ` Xin Li
2025-06-04 1:55 ` Sohil Mehta
2025-06-04 2:41 ` Xin Li
2025-06-04 15:41 ` H. Peter Anvin
2025-06-11 21:39 ` Sohil Mehta
2025-06-04 15:29 ` H. Peter Anvin
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=aCSljsvI0A-HC_DT@google.com \
--to=seanjc@google.com \
--cc=adrian.hunter@intel.com \
--cc=ak@linux.intel.com \
--cc=andrew.cooper3@citrix.com \
--cc=bp@alien8.de \
--cc=dave.hansen@linux.intel.com \
--cc=hpa@zytor.com \
--cc=jacob.pan@linux.microsoft.com \
--cc=kai.huang@intel.com \
--cc=kan.liang@linux.intel.com \
--cc=kirill.shutemov@linux.intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-edac@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=rui.zhang@intel.com \
--cc=sandipan.das@amd.com \
--cc=sohil.mehta@intel.com \
--cc=tglx@linutronix.de \
--cc=tony.luck@intel.com \
--cc=x86@kernel.org \
--cc=xin@zytor.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;
as well as URLs for NNTP newsgroup(s).