On 05.03.2019 12:03, Cornelia Huck wrote: > On Tue, 5 Mar 2019 05:30:01 -0500 > Christian Borntraeger <borntraeger@xxxxxxxxxx> wrote: > >> There are cases where halt polling is unwanted. For example when running >> KVM on an over committed LPAR we rather want to give back the CPU to >> neighbour LPARs instead of polling. Let us provide a callback that >> allows architectures to disable polling. >> >> Signed-off-by: Christian Borntraeger <borntraeger@xxxxxxxxxx> >> --- >> include/linux/kvm_host.h | 10 ++++++++++ >> virt/kvm/Kconfig | 3 +++ >> virt/kvm/kvm_main.c | 2 +- >> 3 files changed, 14 insertions(+), 1 deletion(-) >> >> diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h >> index c38cc5eb7e73..5d2bbcf0b1de 100644 >> --- a/include/linux/kvm_host.h >> +++ b/include/linux/kvm_host.h >> @@ -1283,6 +1283,16 @@ static inline bool vcpu_valid_wakeup(struct kvm_vcpu *vcpu) >> } >> #endif /* CONFIG_HAVE_KVM_INVALID_WAKEUPS */ >> >> +#ifdef CONFIG_HAVE_KVM_NO_POLL >> +/* Callback that tells if we must not poll */ >> +bool kvm_arch_no_poll(void); >> +#else >> +static inline bool kvm_arch_no_poll(void) >> +{ >> + return false; >> +} >> +#endif /* CONFIG_HAVE_KVM_NO_POLL */ >> + >> #ifdef CONFIG_HAVE_KVM_VCPU_ASYNC_IOCTL >> long kvm_arch_vcpu_async_ioctl(struct file *filp, >> unsigned int ioctl, unsigned long arg); >> diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig >> index ea434ddc8499..aad9284c043a 100644 >> --- a/virt/kvm/Kconfig >> +++ b/virt/kvm/Kconfig >> @@ -57,3 +57,6 @@ config HAVE_KVM_VCPU_ASYNC_IOCTL >> >> config HAVE_KVM_VCPU_RUN_PID_CHANGE >> bool >> + >> +config HAVE_KVM_NO_POLL >> + bool >> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c >> index 076bc38963bf..c76d83532e14 100644 >> --- a/virt/kvm/kvm_main.c >> +++ b/virt/kvm/kvm_main.c >> @@ -2248,7 +2248,7 @@ void kvm_vcpu_block(struct kvm_vcpu *vcpu) >> u64 block_ns; >> >> start = cur = ktime_get(); >> - if (vcpu->halt_poll_ns) { >> + if (vcpu->halt_poll_ns && !kvm_arch_no_poll()) { >> ktime_t stop = ktime_add_ns(ktime_get(), vcpu->halt_poll_ns); >> >> ++vcpu->stat.halt_attempted_poll; > > What this gives us is a way to check whether we want to disable halt > polling right now (e.g. because we have a high steal time right now). > Both the drawback and the point in favour is that we check this every > time we enter kvm_vcpu_block(). > > Are there (known) scenarios where we might want to disable halt polling > for some period of time? E.g., when we know via some event that it will > be counterproductive for some time or until we get an event that tells > us it might make sense again? For these cases we probably want to have a userspace tool that sets/unsets /sys/module/kvm/parameters/halt_poll_ns?