On Mon, Nov 20, 2023 at 4:15 PM Mihai Carabas <mihai.carabas@xxxxxxxxxx> wrote: > > From: Joao Martins <joao.m.martins@xxxxxxxxxx> > > 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@xxxxxxxxxx> > Signed-off-by: Ankur Arora <ankur.a.arora@xxxxxxxxxx> > Signed-off-by: Mihai Carabas <mihai.carabas@xxxxxxxxxx> >From the cpuidle side: Acked-by: Rafael J. Wysocki <rafael@xxxxxxxxxx> > --- > 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 >