* [PATCH v2 0/5] x86: Cleanups around slow_down_io()
@ 2025-12-16 13:41 Juergen Gross
2025-12-16 13:41 ` [PATCH v2 1/5] x86/paravirt: Replace io_delay() hook with a bool Juergen Gross
2026-01-09 12:07 ` [PATCH v2 0/5] x86: Cleanups around slow_down_io() Juergen Gross
0 siblings, 2 replies; 3+ messages in thread
From: Juergen Gross @ 2025-12-16 13:41 UTC (permalink / raw)
To: linux-kernel, x86, virtualization, kvm, linux-block
Cc: Juergen Gross, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, H. Peter Anvin, Ajay Kaher, Alexey Makhalov,
Broadcom internal kernel review list, Paolo Bonzini,
Vitaly Kuznetsov, Boris Ostrovsky, xen-devel, Denis Efremov,
Jens Axboe
While looking at paravirt cleanups I stumbled over slow_down_io() and
the related REALLY_SLOW_IO define.
Do several cleanups, resulting in a deletion of REALLY_SLOW_IO and the
io_delay() paravirt function hook.
Patch 4 is removing the config options for selecting the default delay
mechanism and sets the default to "no delay". This is in preparation of
removing the io_delay() functionality completely, as suggested by Ingo
Molnar.
Patch 5 is adding an additional config option allowing to avoid
building io_delay.c (default is still to build it).
Changes in V2:
- patches 2 and 3 of V1 have been applied
- new patches 4 and 5
Juergen Gross (5):
x86/paravirt: Replace io_delay() hook with a bool
block/floppy: Don't use REALLY_SLOW_IO for delays
x86/io: Remove REALLY_SLOW_IO handling
x86/io_delay: Switch io_delay() default mechanism to "none"
x86/io_delay: Add config option for controlling build of io_delay.
arch/x86/Kconfig | 8 +++
arch/x86/Kconfig.debug | 30 ----------
arch/x86/include/asm/floppy.h | 31 ++++++++--
arch/x86/include/asm/io.h | 17 +++---
arch/x86/include/asm/paravirt.h | 11 +---
arch/x86/include/asm/paravirt_types.h | 3 +-
arch/x86/kernel/Makefile | 3 +-
arch/x86/kernel/cpu/vmware.c | 2 +-
arch/x86/kernel/io_delay.c | 81 +--------------------------
arch/x86/kernel/kvm.c | 8 +--
arch/x86/kernel/paravirt.c | 3 +-
arch/x86/kernel/setup.c | 4 +-
arch/x86/xen/enlighten_pv.c | 6 +-
drivers/block/floppy.c | 2 -
14 files changed, 55 insertions(+), 154 deletions(-)
--
2.51.0
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH v2 1/5] x86/paravirt: Replace io_delay() hook with a bool
2025-12-16 13:41 [PATCH v2 0/5] x86: Cleanups around slow_down_io() Juergen Gross
@ 2025-12-16 13:41 ` Juergen Gross
2026-01-09 12:07 ` [PATCH v2 0/5] x86: Cleanups around slow_down_io() Juergen Gross
1 sibling, 0 replies; 3+ messages in thread
From: Juergen Gross @ 2025-12-16 13:41 UTC (permalink / raw)
To: linux-kernel, x86, virtualization, kvm
Cc: Juergen Gross, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, H. Peter Anvin, Ajay Kaher, Alexey Makhalov,
Broadcom internal kernel review list, Paolo Bonzini,
Vitaly Kuznetsov, Boris Ostrovsky, xen-devel
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>
---
arch/x86/include/asm/io.h | 7 +++++--
arch/x86/include/asm/paravirt.h | 11 +----------
arch/x86/include/asm/paravirt_types.h | 3 +--
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 +-----
7 files changed, 11 insertions(+), 29 deletions(-)
diff --git a/arch/x86/include/asm/io.h b/arch/x86/include/asm/io.h
index ca309a3227c7..0448575569b9 100644
--- a/arch/x86/include/asm/io.h
+++ b/arch/x86/include/asm/io.h
@@ -245,9 +245,14 @@ extern void io_delay_init(void);
#if defined(CONFIG_PARAVIRT)
#include <asm/paravirt.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.h b/arch/x86/include/asm/paravirt.h
index b5e59a7ba0d0..0ab798d234cc 100644
--- a/arch/x86/include/asm/paravirt.h
+++ b/arch/x86/include/asm/paravirt.h
@@ -53,16 +53,7 @@ static inline u64 paravirt_steal_clock(int cpu)
void __init paravirt_set_cap(void);
#endif
-/* The paravirtualized I/O functions */
-static inline void slow_down_io(void)
-{
- PVOP_VCALL0(cpu.io_delay);
-#ifdef REALLY_SLOW_IO
- PVOP_VCALL0(cpu.io_delay);
- PVOP_VCALL0(cpu.io_delay);
- PVOP_VCALL0(cpu.io_delay);
-#endif
-}
+#define call_io_delay() pv_info.io_delay
void native_flush_tlb_local(void);
void native_flush_tlb_global(void);
diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h
index 3502939415ad..b4c15856eab5 100644
--- a/arch/x86/include/asm/paravirt_types.h
+++ b/arch/x86/include/asm/paravirt_types.h
@@ -36,6 +36,7 @@ struct pv_info {
#ifdef CONFIG_PARAVIRT_XXL
u16 extra_user_64bit_cs; /* __USER_CS if none */
#endif
+ bool io_delay;
const char *name;
};
@@ -51,8 +52,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 cb3f900c46fc..47db25d63c8d 100644
--- a/arch/x86/kernel/cpu/vmware.c
+++ b/arch/x86/kernel/cpu/vmware.c
@@ -338,7 +338,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 df78ddee0abb..24e403cdce69 100644
--- a/arch/x86/kernel/kvm.c
+++ b/arch/x86/kernel/kvm.c
@@ -74,12 +74,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)
@@ -313,7 +307,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 ab3e172dcc69..8ee952e7e7d4 100644
--- a/arch/x86/kernel/paravirt.c
+++ b/arch/x86/kernel/paravirt.c
@@ -113,6 +113,7 @@ struct pv_info pv_info = {
#ifdef CONFIG_PARAVIRT_XXL
.extra_user_64bit_cs = __USER_CS,
#endif
+ .io_delay = true,
};
/* 64-bit pagetable entries */
@@ -120,8 +121,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 4806cc28d7ca..a43b525f25cd 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",
};
@@ -1253,7 +1250,6 @@ static const typeof(pv_ops) xen_cpu_ops __initconst = {
.invalidate_io_bitmap = xen_invalidate_io_bitmap,
.update_io_bitmap = xen_update_io_bitmap,
#endif
- .io_delay = xen_io_delay,
.start_context_switch = xen_start_context_switch,
.end_context_switch = xen_end_context_switch,
--
2.51.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH v2 0/5] x86: Cleanups around slow_down_io()
2025-12-16 13:41 [PATCH v2 0/5] x86: Cleanups around slow_down_io() Juergen Gross
2025-12-16 13:41 ` [PATCH v2 1/5] x86/paravirt: Replace io_delay() hook with a bool Juergen Gross
@ 2026-01-09 12:07 ` Juergen Gross
1 sibling, 0 replies; 3+ messages in thread
From: Juergen Gross @ 2026-01-09 12:07 UTC (permalink / raw)
To: linux-kernel, x86, virtualization, kvm, linux-block
Cc: Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen,
H. Peter Anvin, Ajay Kaher, Alexey Makhalov,
Broadcom internal kernel review list, Paolo Bonzini,
Vitaly Kuznetsov, Boris Ostrovsky, xen-devel, Denis Efremov,
Jens Axboe
[-- Attachment #1.1.1: Type: text/plain, Size: 1892 bytes --]
Gentle ping.
On 16.12.25 14:41, Juergen Gross wrote:
> While looking at paravirt cleanups I stumbled over slow_down_io() and
> the related REALLY_SLOW_IO define.
>
> Do several cleanups, resulting in a deletion of REALLY_SLOW_IO and the
> io_delay() paravirt function hook.
>
> Patch 4 is removing the config options for selecting the default delay
> mechanism and sets the default to "no delay". This is in preparation of
> removing the io_delay() functionality completely, as suggested by Ingo
> Molnar.
>
> Patch 5 is adding an additional config option allowing to avoid
> building io_delay.c (default is still to build it).
>
> Changes in V2:
> - patches 2 and 3 of V1 have been applied
> - new patches 4 and 5
>
> Juergen Gross (5):
> x86/paravirt: Replace io_delay() hook with a bool
> block/floppy: Don't use REALLY_SLOW_IO for delays
> x86/io: Remove REALLY_SLOW_IO handling
> x86/io_delay: Switch io_delay() default mechanism to "none"
> x86/io_delay: Add config option for controlling build of io_delay.
>
> arch/x86/Kconfig | 8 +++
> arch/x86/Kconfig.debug | 30 ----------
> arch/x86/include/asm/floppy.h | 31 ++++++++--
> arch/x86/include/asm/io.h | 17 +++---
> arch/x86/include/asm/paravirt.h | 11 +---
> arch/x86/include/asm/paravirt_types.h | 3 +-
> arch/x86/kernel/Makefile | 3 +-
> arch/x86/kernel/cpu/vmware.c | 2 +-
> arch/x86/kernel/io_delay.c | 81 +--------------------------
> arch/x86/kernel/kvm.c | 8 +--
> arch/x86/kernel/paravirt.c | 3 +-
> arch/x86/kernel/setup.c | 4 +-
> arch/x86/xen/enlighten_pv.c | 6 +-
> drivers/block/floppy.c | 2 -
> 14 files changed, 55 insertions(+), 154 deletions(-)
>
[-- Attachment #1.1.2: OpenPGP public key --]
[-- Type: application/pgp-keys, Size: 3743 bytes --]
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 495 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-01-09 12:08 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-16 13:41 [PATCH v2 0/5] x86: Cleanups around slow_down_io() Juergen Gross
2025-12-16 13:41 ` [PATCH v2 1/5] x86/paravirt: Replace io_delay() hook with a bool Juergen Gross
2026-01-09 12:07 ` [PATCH v2 0/5] x86: Cleanups around slow_down_io() Juergen Gross
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox