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.
This enables to replace the hook with a bool indicating whether
native_io_delay() should be called.
Signed-off-by: Juergen Gross <jgross@suse.com>
---
V3:
- rebase to tip/master kernel branch
---
arch/x86/include/asm/io.h | 9 ++++++---
arch/x86/include/asm/paravirt-base.h | 6 ++++++
arch/x86/include/asm/paravirt.h | 11 -----------
arch/x86/include/asm/paravirt_types.h | 2 --
arch/x86/kernel/cpu/vmware.c | 2 +-
arch/x86/kernel/kvm.c | 8 +-------
arch/x86/kernel/paravirt.c | 3 +--
arch/x86/xen/enlighten_pv.c | 6 +-----
8 files changed, 16 insertions(+), 31 deletions(-)
diff --git a/arch/x86/include/asm/io.h b/arch/x86/include/asm/io.h
index ca309a3227c7..8a9292ce7d2d 100644
--- a/arch/x86/include/asm/io.h
+++ b/arch/x86/include/asm/io.h
@@ -243,11 +243,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();
@@ -256,8 +261,6 @@ static inline void slow_down_io(void)
#endif
}
-#endif
-
#define BUILDIO(bwl, type) \
static inline void out##bwl##_p(type value, u16 port) \
{ \
diff --git a/arch/x86/include/asm/paravirt-base.h b/arch/x86/include/asm/paravirt-base.h
index 982a0b93bc76..3b9e7772d196 100644
--- a/arch/x86/include/asm/paravirt-base.h
+++ b/arch/x86/include/asm/paravirt-base.h
@@ -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
diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h
index b21072af731d..f4885bd98a18 100644
--- a/arch/x86/include/asm/paravirt.h
+++ b/arch/x86/include/asm/paravirt.h
@@ -19,17 +19,6 @@
#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);
diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h
index 7ccd41628d36..3946d0f69921 100644
--- a/arch/x86/include/asm/paravirt_types.h
+++ b/arch/x86/include/asm/paravirt_types.h
@@ -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);
diff --git a/arch/x86/kernel/cpu/vmware.c b/arch/x86/kernel/cpu/vmware.c
index a3e6936839b1..eee0d1a48802 100644
--- a/arch/x86/kernel/cpu/vmware.c
+++ b/arch/x86/kernel/cpu/vmware.c
@@ -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;
diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
index de550b12d9ab..8c3221048d9f 100644
--- a/arch/x86/kernel/kvm.c
+++ b/arch/x86/kernel/kvm.c
@@ -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)
@@ -314,7 +308,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;
diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c
index a6ed52cae003..792fa96b3233 100644
--- a/arch/x86/kernel/paravirt.c
+++ b/arch/x86/kernel/paravirt.c
@@ -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,
diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c
index 8a19a88190ee..9c9695f5d158 100644
--- a/arch/x86/xen/enlighten_pv.c
+++ b/arch/x86/xen/enlighten_pv.c
@@ -1046,10 +1046,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)
@@ -1209,6 +1205,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",
};
@@ -1392,7 +1389,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;
--
2.51.0
Hi Juergen,
kernel test robot noticed the following build errors:
[auto build test ERROR on tip/master]
[also build test ERROR on next-20260115]
[cannot apply to kvm/queue kvm/next tip/x86/core kvm/linux-next tip/auto-latest linus/master v6.19-rc5]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Juergen-Gross/x86-paravirt-Replace-io_delay-hook-with-a-bool/20260115-165320
base: tip/master
patch link: https://lore.kernel.org/r/20260115084849.31502-2-jgross%40suse.com
patch subject: [PATCH v3 1/5] x86/paravirt: Replace io_delay() hook with a bool
config: x86_64-randconfig-006-20260115 (https://download.01.org/0day-ci/archive/20260115/202601152321.kJ6D4yKM-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.4.0-5) 12.4.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260115/202601152321.kJ6D4yKM-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202601152321.kJ6D4yKM-lkp@intel.com/
All errors (new ones prefixed by >>):
arch/x86/kernel/tboot.c: In function 'tboot_shutdown':
>> arch/x86/kernel/tboot.c:255:17: error: implicit declaration of function 'halt' [-Werror=implicit-function-declaration]
255 | halt();
| ^~~~
cc1: some warnings being treated as errors
vim +/halt +255 arch/x86/kernel/tboot.c
58c41d28259c24 H. Peter Anvin 2009-08-14 225
3162534069597e Joseph Cihula 2009-06-30 226 void tboot_shutdown(u32 shutdown_type)
3162534069597e Joseph Cihula 2009-06-30 227 {
3162534069597e Joseph Cihula 2009-06-30 228 void (*shutdown)(void);
3162534069597e Joseph Cihula 2009-06-30 229
3162534069597e Joseph Cihula 2009-06-30 230 if (!tboot_enabled())
3162534069597e Joseph Cihula 2009-06-30 231 return;
3162534069597e Joseph Cihula 2009-06-30 232
11520e5e7c1855 Linus Torvalds 2012-12-15 233 /*
11520e5e7c1855 Linus Torvalds 2012-12-15 234 * if we're being called before the 1:1 mapping is set up then just
11520e5e7c1855 Linus Torvalds 2012-12-15 235 * return and let the normal shutdown happen; this should only be
11520e5e7c1855 Linus Torvalds 2012-12-15 236 * due to very early panic()
11520e5e7c1855 Linus Torvalds 2012-12-15 237 */
11520e5e7c1855 Linus Torvalds 2012-12-15 238 if (!tboot_pg_dir)
11520e5e7c1855 Linus Torvalds 2012-12-15 239 return;
11520e5e7c1855 Linus Torvalds 2012-12-15 240
3162534069597e Joseph Cihula 2009-06-30 241 /* if this is S3 then set regions to MAC */
3162534069597e Joseph Cihula 2009-06-30 242 if (shutdown_type == TB_SHUTDOWN_S3)
58c41d28259c24 H. Peter Anvin 2009-08-14 243 if (tboot_setup_sleep())
58c41d28259c24 H. Peter Anvin 2009-08-14 244 return;
3162534069597e Joseph Cihula 2009-06-30 245
3162534069597e Joseph Cihula 2009-06-30 246 tboot->shutdown_type = shutdown_type;
3162534069597e Joseph Cihula 2009-06-30 247
3162534069597e Joseph Cihula 2009-06-30 248 switch_to_tboot_pt();
3162534069597e Joseph Cihula 2009-06-30 249
3162534069597e Joseph Cihula 2009-06-30 250 shutdown = (void(*)(void))(unsigned long)tboot->shutdown_entry;
3162534069597e Joseph Cihula 2009-06-30 251 shutdown();
3162534069597e Joseph Cihula 2009-06-30 252
3162534069597e Joseph Cihula 2009-06-30 253 /* should not reach here */
3162534069597e Joseph Cihula 2009-06-30 254 while (1)
3162534069597e Joseph Cihula 2009-06-30 @255 halt();
3162534069597e Joseph Cihula 2009-06-30 256 }
3162534069597e Joseph Cihula 2009-06-30 257
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
Hi Juergen,
kernel test robot noticed the following build errors:
[auto build test ERROR on tip/master]
[also build test ERROR on next-20260115]
[cannot apply to kvm/queue kvm/next tip/x86/core kvm/linux-next tip/auto-latest linus/master v6.19-rc5]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Juergen-Gross/x86-paravirt-Replace-io_delay-hook-with-a-bool/20260115-165320
base: tip/master
patch link: https://lore.kernel.org/r/20260115084849.31502-2-jgross%40suse.com
patch subject: [PATCH v3 1/5] x86/paravirt: Replace io_delay() hook with a bool
config: i386-randconfig-011-20260115 (https://download.01.org/0day-ci/archive/20260115/202601152203.plJOoOEF-lkp@intel.com/config)
compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260115/202601152203.plJOoOEF-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202601152203.plJOoOEF-lkp@intel.com/
All errors (new ones prefixed by >>):
>> drivers/cpufreq/longhaul.c:145:2: error: call to undeclared function 'arch_safe_halt'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
145 | safe_halt();
| ^
include/linux/irqflags.h:231:3: note: expanded from macro 'safe_halt'
231 | raw_safe_halt(); \
| ^
include/linux/irqflags.h:192:27: note: expanded from macro 'raw_safe_halt'
192 | #define raw_safe_halt() arch_safe_halt()
| ^
>> drivers/cpufreq/longhaul.c:150:2: error: call to undeclared function 'halt'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
150 | halt();
| ^
drivers/cpufreq/longhaul.c:179:2: error: call to undeclared function 'arch_safe_halt'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
179 | safe_halt();
| ^
include/linux/irqflags.h:231:3: note: expanded from macro 'safe_halt'
231 | raw_safe_halt(); \
| ^
include/linux/irqflags.h:192:27: note: expanded from macro 'raw_safe_halt'
192 | #define raw_safe_halt() arch_safe_halt()
| ^
drivers/cpufreq/longhaul.c:187:4: error: call to undeclared function 'halt'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
187 | halt();
| ^
drivers/cpufreq/longhaul.c:205:3: error: call to undeclared function 'halt'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
205 | halt();
| ^
drivers/cpufreq/longhaul.c:224:4: error: call to undeclared function 'halt'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
224 | halt();
| ^
drivers/cpufreq/longhaul.c:165:6: warning: variable 't' set but not used [-Wunused-but-set-variable]
165 | u32 t;
| ^
1 warning and 6 errors generated.
vim +/arch_safe_halt +145 drivers/cpufreq/longhaul.c
^1da177e4c3f41 arch/i386/kernel/cpu/cpufreq/longhaul.c Linus Torvalds 2005-04-16 134
ac617bd0f7b959 arch/x86/kernel/cpu/cpufreq/longhaul.c Dave Jones 2009-01-17 135 static void do_longhaul1(unsigned int mults_index)
^1da177e4c3f41 arch/i386/kernel/cpu/cpufreq/longhaul.c Linus Torvalds 2005-04-16 136 {
dadb49d8746bc4 arch/i386/kernel/cpu/cpufreq/longhaul.c Rafa� Bilski 2006-07-03 137 union msr_bcr2 bcr2;
^1da177e4c3f41 arch/i386/kernel/cpu/cpufreq/longhaul.c Linus Torvalds 2005-04-16 138
c435e608cf59ff drivers/cpufreq/longhaul.c Ingo Molnar 2025-04-09 139 rdmsrq(MSR_VIA_BCR2, bcr2.val);
dadb49d8746bc4 arch/i386/kernel/cpu/cpufreq/longhaul.c Rafa� Bilski 2006-07-03 140 /* Enable software clock multiplier */
dadb49d8746bc4 arch/i386/kernel/cpu/cpufreq/longhaul.c Rafa� Bilski 2006-07-03 141 bcr2.bits.ESOFTBF = 1;
ac617bd0f7b959 arch/x86/kernel/cpu/cpufreq/longhaul.c Dave Jones 2009-01-17 142 bcr2.bits.CLOCKMUL = mults_index & 0xff;
dadb49d8746bc4 arch/i386/kernel/cpu/cpufreq/longhaul.c Rafa� Bilski 2006-07-03 143
dadb49d8746bc4 arch/i386/kernel/cpu/cpufreq/longhaul.c Rafa� Bilski 2006-07-03 144 /* Sync to timer tick */
dadb49d8746bc4 arch/i386/kernel/cpu/cpufreq/longhaul.c Rafa� Bilski 2006-07-03 @145 safe_halt();
dadb49d8746bc4 arch/i386/kernel/cpu/cpufreq/longhaul.c Rafa� Bilski 2006-07-03 146 /* Change frequency on next halt or sleep */
78255eb2397332 drivers/cpufreq/longhaul.c Ingo Molnar 2025-04-09 147 wrmsrq(MSR_VIA_BCR2, bcr2.val);
179da8e6e8903a arch/i386/kernel/cpu/cpufreq/longhaul.c Rafa� Bilski 2006-08-08 148 /* Invoke transition */
179da8e6e8903a arch/i386/kernel/cpu/cpufreq/longhaul.c Rafa� Bilski 2006-08-08 149 ACPI_FLUSH_CPU_CACHE();
179da8e6e8903a arch/i386/kernel/cpu/cpufreq/longhaul.c Rafa� Bilski 2006-08-08 @150 halt();
dadb49d8746bc4 arch/i386/kernel/cpu/cpufreq/longhaul.c Rafa� Bilski 2006-07-03 151
dadb49d8746bc4 arch/i386/kernel/cpu/cpufreq/longhaul.c Rafa� Bilski 2006-07-03 152 /* Disable software clock multiplier */
dadb49d8746bc4 arch/i386/kernel/cpu/cpufreq/longhaul.c Rafa� Bilski 2006-07-03 153 local_irq_disable();
c435e608cf59ff drivers/cpufreq/longhaul.c Ingo Molnar 2025-04-09 154 rdmsrq(MSR_VIA_BCR2, bcr2.val);
dadb49d8746bc4 arch/i386/kernel/cpu/cpufreq/longhaul.c Rafa� Bilski 2006-07-03 155 bcr2.bits.ESOFTBF = 0;
78255eb2397332 drivers/cpufreq/longhaul.c Ingo Molnar 2025-04-09 156 wrmsrq(MSR_VIA_BCR2, bcr2.val);
^1da177e4c3f41 arch/i386/kernel/cpu/cpufreq/longhaul.c Linus Torvalds 2005-04-16 157 }
^1da177e4c3f41 arch/i386/kernel/cpu/cpufreq/longhaul.c Linus Torvalds 2005-04-16 158
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
© 2016 - 2026 Red Hat, Inc.