Message ID | 1700488898-12431-3-git-send-email-mihai.carabas@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [1/7] x86: Move ARCH_HAS_CPU_RELAX to arch | expand |
On Mon, Nov 20, 2023 at 4:15 PM Mihai Carabas <mihai.carabas@oracle.com> wrote: > > From: Joao Martins <joao.m.martins@oracle.com> > > Right now, kvm_para_has_hint(KVM_HINTS_REALTIME) is x86 only, and so in the > pursuit of making cpuidle-haltpoll arch independent, move the check for > haltpoll enablement to be defined per architecture. Same thing for > boot_option_idle_override. To that end, add a arch_haltpoll_want() and move the > check there. > > Signed-off-by: Joao Martins <joao.m.martins@oracle.com> > Signed-off-by: Ankur Arora <ankur.a.arora@oracle.com> > Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com> From the cpuidle side: Acked-by: Rafael J. Wysocki <rafael@kernel.org> > --- > arch/x86/include/asm/cpuidle_haltpoll.h | 1 + > arch/x86/kernel/kvm.c | 10 ++++++++++ > drivers/cpuidle/cpuidle-haltpoll.c | 8 ++------ > include/linux/cpuidle_haltpoll.h | 5 +++++ > 4 files changed, 18 insertions(+), 6 deletions(-) > > diff --git a/arch/x86/include/asm/cpuidle_haltpoll.h b/arch/x86/include/asm/cpuidle_haltpoll.h > index c8b39c6716ff..2c5a53ce266f 100644 > --- a/arch/x86/include/asm/cpuidle_haltpoll.h > +++ b/arch/x86/include/asm/cpuidle_haltpoll.h > @@ -4,5 +4,6 @@ > > void arch_haltpoll_enable(unsigned int cpu); > void arch_haltpoll_disable(unsigned int cpu); > +bool arch_haltpoll_want(void); > > #endif > diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c > index 1cceac5984da..75a24f107b2a 100644 > --- a/arch/x86/kernel/kvm.c > +++ b/arch/x86/kernel/kvm.c > @@ -1151,4 +1151,14 @@ void arch_haltpoll_disable(unsigned int cpu) > smp_call_function_single(cpu, kvm_enable_host_haltpoll, NULL, 1); > } > EXPORT_SYMBOL_GPL(arch_haltpoll_disable); > + > +bool arch_haltpoll_want(void) > +{ > + /* Do not load haltpoll if idle= is passed */ > + if (boot_option_idle_override != IDLE_NO_OVERRIDE) > + return false; > + > + return kvm_para_has_hint(KVM_HINTS_REALTIME); > +} > +EXPORT_SYMBOL_GPL(arch_haltpoll_want); > #endif > diff --git a/drivers/cpuidle/cpuidle-haltpoll.c b/drivers/cpuidle/cpuidle-haltpoll.c > index e66df22f9695..72f9c84990c5 100644 > --- a/drivers/cpuidle/cpuidle-haltpoll.c > +++ b/drivers/cpuidle/cpuidle-haltpoll.c > @@ -96,7 +96,7 @@ static void haltpoll_uninit(void) > > static bool haltpoll_want(void) > { > - return kvm_para_has_hint(KVM_HINTS_REALTIME) || force; > + return (kvm_para_available() && arch_haltpoll_want()) || force; > } > > static int __init haltpoll_init(void) > @@ -104,11 +104,7 @@ static int __init haltpoll_init(void) > int ret; > struct cpuidle_driver *drv = &haltpoll_driver; > > - /* Do not load haltpoll if idle= is passed */ > - if (boot_option_idle_override != IDLE_NO_OVERRIDE) > - return -ENODEV; > - > - if (!kvm_para_available() || !haltpoll_want()) > + if (!haltpoll_want()) > return -ENODEV; > > cpuidle_poll_state_init(drv); > diff --git a/include/linux/cpuidle_haltpoll.h b/include/linux/cpuidle_haltpoll.h > index d50c1e0411a2..bae68a6603e3 100644 > --- a/include/linux/cpuidle_haltpoll.h > +++ b/include/linux/cpuidle_haltpoll.h > @@ -12,5 +12,10 @@ static inline void arch_haltpoll_enable(unsigned int cpu) > static inline void arch_haltpoll_disable(unsigned int cpu) > { > } > + > +static inline bool arch_haltpoll_want(void) > +{ > + return false; > +} > #endif > #endif > -- > 1.8.3.1 >
diff --git a/arch/x86/include/asm/cpuidle_haltpoll.h b/arch/x86/include/asm/cpuidle_haltpoll.h index c8b39c6716ff..2c5a53ce266f 100644 --- a/arch/x86/include/asm/cpuidle_haltpoll.h +++ b/arch/x86/include/asm/cpuidle_haltpoll.h @@ -4,5 +4,6 @@ void arch_haltpoll_enable(unsigned int cpu); void arch_haltpoll_disable(unsigned int cpu); +bool arch_haltpoll_want(void); #endif diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index 1cceac5984da..75a24f107b2a 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c @@ -1151,4 +1151,14 @@ void arch_haltpoll_disable(unsigned int cpu) smp_call_function_single(cpu, kvm_enable_host_haltpoll, NULL, 1); } EXPORT_SYMBOL_GPL(arch_haltpoll_disable); + +bool arch_haltpoll_want(void) +{ + /* Do not load haltpoll if idle= is passed */ + if (boot_option_idle_override != IDLE_NO_OVERRIDE) + return false; + + return kvm_para_has_hint(KVM_HINTS_REALTIME); +} +EXPORT_SYMBOL_GPL(arch_haltpoll_want); #endif diff --git a/drivers/cpuidle/cpuidle-haltpoll.c b/drivers/cpuidle/cpuidle-haltpoll.c index e66df22f9695..72f9c84990c5 100644 --- a/drivers/cpuidle/cpuidle-haltpoll.c +++ b/drivers/cpuidle/cpuidle-haltpoll.c @@ -96,7 +96,7 @@ static void haltpoll_uninit(void) static bool haltpoll_want(void) { - return kvm_para_has_hint(KVM_HINTS_REALTIME) || force; + return (kvm_para_available() && arch_haltpoll_want()) || force; } static int __init haltpoll_init(void) @@ -104,11 +104,7 @@ static int __init haltpoll_init(void) int ret; struct cpuidle_driver *drv = &haltpoll_driver; - /* Do not load haltpoll if idle= is passed */ - if (boot_option_idle_override != IDLE_NO_OVERRIDE) - return -ENODEV; - - if (!kvm_para_available() || !haltpoll_want()) + if (!haltpoll_want()) return -ENODEV; cpuidle_poll_state_init(drv); diff --git a/include/linux/cpuidle_haltpoll.h b/include/linux/cpuidle_haltpoll.h index d50c1e0411a2..bae68a6603e3 100644 --- a/include/linux/cpuidle_haltpoll.h +++ b/include/linux/cpuidle_haltpoll.h @@ -12,5 +12,10 @@ static inline void arch_haltpoll_enable(unsigned int cpu) static inline void arch_haltpoll_disable(unsigned int cpu) { } + +static inline bool arch_haltpoll_want(void) +{ + return false; +} #endif #endif