x86/paravirt: Move halt paravirt calls under CONFIG_PARAVIRT
authorKirill A. Shutemov <kirill.shutemov@linux.intel.com>
Fri, 28 Feb 2025 01:44:14 +0000 (01:44 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 25 Apr 2025 08:45:37 +0000 (10:45 +0200)
commit 22cc5ca5de52bbfc36a7d4a55323f91fb4492264 upstream.

CONFIG_PARAVIRT_XXL is mainly defined/used by XEN PV guests. For
other VM guest types, features supported under CONFIG_PARAVIRT
are self sufficient. CONFIG_PARAVIRT mainly provides support for
TLB flush operations and time related operations.

For TDX guest as well, paravirt calls under CONFIG_PARVIRT meets
most of its requirement except the need of HLT and SAFE_HLT
paravirt calls, which is currently defined under
CONFIG_PARAVIRT_XXL.

Since enabling CONFIG_PARAVIRT_XXL is too bloated for TDX guest
like platforms, move HLT and SAFE_HLT paravirt calls under
CONFIG_PARAVIRT.

Moving HLT and SAFE_HLT paravirt calls are not fatal and should not
break any functionality for current users of CONFIG_PARAVIRT.

Fixes: bfe6ed0c6727 ("x86/tdx: Add HLT support for TDX guests")
Co-developed-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Signed-off-by: Vishal Annapurve <vannapurve@google.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Reviewed-by: Andi Kleen <ak@linux.intel.com>
Reviewed-by: Tony Luck <tony.luck@intel.com>
Reviewed-by: Juergen Gross <jgross@suse.com>
Tested-by: Ryan Afranji <afranji@google.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: stable@kernel.org
Link: https://lore.kernel.org/r/20250228014416.3925664-2-vannapurve@google.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/x86/include/asm/irqflags.h
arch/x86/include/asm/paravirt.h
arch/x86/include/asm/paravirt_types.h
arch/x86/kernel/paravirt.c

index 8c5ae649d2df82999815998c5ba92ba044dfbea9..9acfe2bcf1fd5bbfb6f24e3a606200e9593b4155 100644 (file)
@@ -56,6 +56,28 @@ static __always_inline void native_halt(void)
 
 #endif
 
+#ifndef CONFIG_PARAVIRT
+#ifndef __ASSEMBLY__
+/*
+ * Used in the idle loop; sti takes one instruction cycle
+ * to complete:
+ */
+static __always_inline void arch_safe_halt(void)
+{
+       native_safe_halt();
+}
+
+/*
+ * Used when interrupts are already enabled or to
+ * shutdown the processor:
+ */
+static __always_inline void halt(void)
+{
+       native_halt();
+}
+#endif /* __ASSEMBLY__ */
+#endif /* CONFIG_PARAVIRT */
+
 #ifdef CONFIG_PARAVIRT_XXL
 #include <asm/paravirt.h>
 #else
@@ -77,24 +99,6 @@ static __always_inline void arch_local_irq_enable(void)
        native_irq_enable();
 }
 
-/*
- * Used in the idle loop; sti takes one instruction cycle
- * to complete:
- */
-static __always_inline void arch_safe_halt(void)
-{
-       native_safe_halt();
-}
-
-/*
- * Used when interrupts are already enabled or to
- * shutdown the processor:
- */
-static __always_inline void halt(void)
-{
-       native_halt();
-}
-
 /*
  * For spinlocks, etc:
  */
index 6c8ff12140aea9a860ccd229c1bf74acc7948b07..d8537e30cee192b2eac6a4d5a84143e0047d01a4 100644 (file)
@@ -103,6 +103,16 @@ static inline void notify_page_enc_status_changed(unsigned long pfn,
        PVOP_VCALL3(mmu.notify_page_enc_status_changed, pfn, npages, enc);
 }
 
+static __always_inline void arch_safe_halt(void)
+{
+       PVOP_VCALL0(irq.safe_halt);
+}
+
+static inline void halt(void)
+{
+       PVOP_VCALL0(irq.halt);
+}
+
 #ifdef CONFIG_PARAVIRT_XXL
 static inline void load_sp0(unsigned long sp0)
 {
@@ -168,16 +178,6 @@ static inline void __write_cr4(unsigned long x)
        PVOP_VCALL1(cpu.write_cr4, x);
 }
 
-static __always_inline void arch_safe_halt(void)
-{
-       PVOP_VCALL0(irq.safe_halt);
-}
-
-static inline void halt(void)
-{
-       PVOP_VCALL0(irq.halt);
-}
-
 extern noinstr void pv_native_wbinvd(void);
 
 static __always_inline void wbinvd(void)
index 772d03487520e595ba458ae9032f8a0a2dc00101..4149df559aaeac49fa5ef6b06d2bb682f5cd77c7 100644 (file)
@@ -130,10 +130,9 @@ struct pv_irq_ops {
        struct paravirt_callee_save save_fl;
        struct paravirt_callee_save irq_disable;
        struct paravirt_callee_save irq_enable;
-
+#endif
        void (*safe_halt)(void);
        void (*halt)(void);
-#endif
 } __no_randomize_layout;
 
 struct pv_mmu_ops {
index 8d51c86caa415fb76eaf87452fe3a684575de4d9..234851fe0ef8e7e499f4a33bff9e245fc04d092f 100644 (file)
@@ -142,6 +142,11 @@ int paravirt_disable_iospace(void)
        return request_resource(&ioport_resource, &reserve_ioports);
 }
 
+static noinstr void pv_native_safe_halt(void)
+{
+       native_safe_halt();
+}
+
 #ifdef CONFIG_PARAVIRT_XXL
 static noinstr void pv_native_write_cr2(unsigned long val)
 {
@@ -162,11 +167,6 @@ noinstr void pv_native_wbinvd(void)
 {
        native_wbinvd();
 }
-
-static noinstr void pv_native_safe_halt(void)
-{
-       native_safe_halt();
-}
 #endif
 
 struct pv_info pv_info = {
@@ -224,9 +224,11 @@ struct paravirt_patch_template pv_ops = {
        .irq.save_fl            = __PV_IS_CALLEE_SAVE(pv_native_save_fl),
        .irq.irq_disable        = __PV_IS_CALLEE_SAVE(pv_native_irq_disable),
        .irq.irq_enable         = __PV_IS_CALLEE_SAVE(pv_native_irq_enable),
+#endif /* CONFIG_PARAVIRT_XXL */
+
+       /* Irq HLT ops. */
        .irq.safe_halt          = pv_native_safe_halt,
        .irq.halt               = native_halt,
-#endif /* CONFIG_PARAVIRT_XXL */
 
        /* Mmu ops. */
        .mmu.flush_tlb_user     = native_flush_tlb_local,