mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 03:11:11 -04:00
x86/paravirt: Replace io_delay() hook with a bool
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
This commit is contained in:
committed by
Ingo Molnar
parent
36c1eb9531
commit
9eece49856
@@ -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) \
|
||||
{ \
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user