]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
x86/paravirt: Replace io_delay() hook with a bool
authorJuergen Gross <jgross@suse.com>
Mon, 19 Jan 2026 18:26:28 +0000 (19:26 +0100)
committerIngo Molnar <mingo@kernel.org>
Sun, 22 Mar 2026 07:43:05 +0000 (08:43 +0100)
The io_delay() paravirt hook is in no way performance critical and all users
setting it to a different function than native_io_delay() are using an empty
function as replacement.

Allow replacing the hook with a bool indicating whether native_io_delay()
should be called.

  [ bp: Massage commit message. ]

Signed-off-by: Juergen Gross <jgross@suse.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Link: https://patch.msgid.link/20260119182632.596369-3-jgross@suse.com
arch/x86/include/asm/io.h
arch/x86/include/asm/paravirt-base.h
arch/x86/include/asm/paravirt.h
arch/x86/include/asm/paravirt_types.h
arch/x86/kernel/cpu/vmware.c
arch/x86/kernel/kvm.c
arch/x86/kernel/paravirt.c
arch/x86/xen/enlighten_pv.c

index 2ea25745e0591426b41a2dc890371d1769cf85ae..4179a2ebe777f3eb7091c0fdf6e9f6317ca6f2c9 100644 (file)
@@ -242,11 +242,16 @@ extern int io_delay_type;
 extern void io_delay_init(void);
 
 #if defined(CONFIG_PARAVIRT)
-#include <asm/paravirt.h>
+#include <asm/paravirt-base.h>
 #else
+#define call_io_delay() true
+#endif
 
 static inline void slow_down_io(void)
 {
+       if (!call_io_delay())
+               return;
+
        native_io_delay();
 #ifdef REALLY_SLOW_IO
        native_io_delay();
@@ -255,8 +260,6 @@ static inline void slow_down_io(void)
 #endif
 }
 
-#endif
-
 #define BUILDIO(bwl, type)                                             \
 static inline void out##bwl##_p(type value, u16 port)                  \
 {                                                                      \
index 982a0b93bc766210e4c9d9dd7f29c560c61e4b40..3b9e7772d196744c1c196601dd7fdc542a59ea4e 100644 (file)
@@ -15,6 +15,8 @@ struct pv_info {
 #ifdef CONFIG_PARAVIRT_XXL
        u16 extra_user_64bit_cs;  /* __USER_CS if none */
 #endif
+       bool io_delay;
+
        const char *name;
 };
 
@@ -26,6 +28,10 @@ u64 _paravirt_ident_64(u64);
 #endif
 #define paravirt_nop   ((void *)nop_func)
 
+#ifdef CONFIG_PARAVIRT
+#define call_io_delay() pv_info.io_delay
+#endif
+
 #ifdef CONFIG_PARAVIRT_SPINLOCKS
 void paravirt_set_cap(void);
 #else
index fcf8ab50948aa184d7f7bfe0ad0a1030e527f1f7..cdfe4007443eeab1e2a131123acbee77f48c1aea 100644 (file)
 #include <linux/cpumask.h>
 #include <asm/frame.h>
 
-/* The paravirtualized I/O functions */
-static inline void slow_down_io(void)
-{
-       PVOP_VCALL0(pv_ops, cpu.io_delay);
-#ifdef REALLY_SLOW_IO
-       PVOP_VCALL0(pv_ops, cpu.io_delay);
-       PVOP_VCALL0(pv_ops, cpu.io_delay);
-       PVOP_VCALL0(pv_ops, cpu.io_delay);
-#endif
-}
-
 void native_flush_tlb_local(void);
 void native_flush_tlb_global(void);
 void native_flush_tlb_one_user(unsigned long addr);
index 9bcf6bce88f66300289fbf2e4de4ac05d6cbef29..4f5ae0068aab9de92227d6d6ed8c8da853ba8eea 100644 (file)
@@ -30,8 +30,6 @@ struct pv_lazy_ops {
 
 struct pv_cpu_ops {
        /* hooks for various privileged instructions */
-       void (*io_delay)(void);
-
 #ifdef CONFIG_PARAVIRT_XXL
        unsigned long (*get_debugreg)(int regno);
        void (*set_debugreg)(int regno, unsigned long value);
index a3e6936839b11796bf7eecdf7311167abb78f918..eee0d1a488029627b208e63abea81f70d5cbb58d 100644 (file)
@@ -339,7 +339,7 @@ arch_initcall(activate_jump_labels);
 static void __init vmware_paravirt_ops_setup(void)
 {
        pv_info.name = "VMware hypervisor";
-       pv_ops.cpu.io_delay = paravirt_nop;
+       pv_info.io_delay = false;
 
        if (vmware_tsc_khz == 0)
                return;
index 3bc06236381487c0d4af5d20ac71e2d8b9e7e873..29226d112029e39ec743ac80272ec0b6aa14ed7f 100644 (file)
@@ -75,12 +75,6 @@ DEFINE_PER_CPU_DECRYPTED(struct kvm_steal_time, steal_time) __aligned(64) __visi
 static int has_steal_clock = 0;
 
 static int has_guest_poll = 0;
-/*
- * No need for any "IO delay" on KVM
- */
-static void kvm_io_delay(void)
-{
-}
 
 #define KVM_TASK_SLEEP_HASHBITS 8
 #define KVM_TASK_SLEEP_HASHSIZE (1<<KVM_TASK_SLEEP_HASHBITS)
@@ -327,7 +321,7 @@ static void __init paravirt_ops_setup(void)
        pv_info.name = "KVM";
 
        if (kvm_para_has_feature(KVM_FEATURE_NOP_IO_DELAY))
-               pv_ops.cpu.io_delay = kvm_io_delay;
+               pv_info.io_delay = false;
 
 #ifdef CONFIG_X86_IO_APIC
        no_timer_check = 1;
index a6ed52cae0033ce7638182226453398ec94d662f..792fa96b32330c2e1d3a182929d49ee0a03dbcd1 100644 (file)
@@ -94,6 +94,7 @@ struct pv_info pv_info = {
 #ifdef CONFIG_PARAVIRT_XXL
        .extra_user_64bit_cs = __USER_CS,
 #endif
+       .io_delay = true,
 };
 
 /* 64-bit pagetable entries */
@@ -101,8 +102,6 @@ struct pv_info pv_info = {
 
 struct paravirt_patch_template pv_ops = {
        /* Cpu ops. */
-       .cpu.io_delay           = native_io_delay,
-
 #ifdef CONFIG_PARAVIRT_XXL
        .cpu.cpuid              = native_cpuid,
        .cpu.get_debugreg       = pv_native_get_debugreg,
index 6e459e47cafd71bbf4c2ae87b65da841e840a4fa..0a6a50f3e9a9b187e2a41104a3dcc0d467dd3180 100644 (file)
@@ -1045,10 +1045,6 @@ static void xen_update_io_bitmap(void)
 }
 #endif
 
-static void xen_io_delay(void)
-{
-}
-
 static DEFINE_PER_CPU(unsigned long, xen_cr0_value);
 
 static unsigned long xen_read_cr0(void)
@@ -1208,6 +1204,7 @@ void __init xen_setup_vcpu_info_placement(void)
 
 static const struct pv_info xen_info __initconst = {
        .extra_user_64bit_cs = FLAT_USER_CS64,
+       .io_delay = false,
        .name = "Xen",
 };
 
@@ -1391,7 +1388,6 @@ asmlinkage __visible void __init xen_start_kernel(struct start_info *si)
        pv_ops.cpu.invalidate_io_bitmap = xen_invalidate_io_bitmap;
        pv_ops.cpu.update_io_bitmap = xen_update_io_bitmap;
 #endif
-       pv_ops.cpu.io_delay = xen_io_delay;
        pv_ops.cpu.start_context_switch = xen_start_context_switch;
        pv_ops.cpu.end_context_switch = xen_end_context_switch;