Skip to content

Commit 0361bdf

Browse files
Wanpeng Libonzini
authored andcommitted
x86/kvm: Preserve BSP MSR_KVM_POLL_CONTROL across suspend/resume
MSR_KVM_POLL_CONTROL is cleared on reset, thus reverting guests to host-side polling after suspend/resume. Non-bootstrap CPUs are restored correctly by the haltpoll driver because they are hot-unplugged during suspend and hot-plugged during resume; however, the BSP is not hotpluggable and remains in host-sde polling mode after the guest resume. The makes the guest pay for the cost of vmexits every time the guest enters idle. Fix it by recording BSP's haltpoll state and resuming it during guest resume. Cc: Marcelo Tosatti <mtosatti@redhat.com> Signed-off-by: Wanpeng Li <wanpengli@tencent.com> Message-Id: <1650267752-46796-1-git-send-email-wanpengli@tencent.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
1 parent a413a62 commit 0361bdf

1 file changed

Lines changed: 13 additions & 0 deletions

File tree

arch/x86/kernel/kvm.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ static DEFINE_PER_CPU_DECRYPTED(struct kvm_vcpu_pv_apf_data, apf_reason) __align
6969
DEFINE_PER_CPU_DECRYPTED(struct kvm_steal_time, steal_time) __aligned(64) __visible;
7070
static int has_steal_clock = 0;
7171

72+
static int has_guest_poll = 0;
7273
/*
7374
* No need for any "IO delay" on KVM
7475
*/
@@ -706,14 +707,26 @@ static int kvm_cpu_down_prepare(unsigned int cpu)
706707

707708
static int kvm_suspend(void)
708709
{
710+
u64 val = 0;
711+
709712
kvm_guest_cpu_offline(false);
710713

714+
#ifdef CONFIG_ARCH_CPUIDLE_HALTPOLL
715+
if (kvm_para_has_feature(KVM_FEATURE_POLL_CONTROL))
716+
rdmsrl(MSR_KVM_POLL_CONTROL, val);
717+
has_guest_poll = !(val & 1);
718+
#endif
711719
return 0;
712720
}
713721

714722
static void kvm_resume(void)
715723
{
716724
kvm_cpu_online(raw_smp_processor_id());
725+
726+
#ifdef CONFIG_ARCH_CPUIDLE_HALTPOLL
727+
if (kvm_para_has_feature(KVM_FEATURE_POLL_CONTROL) && has_guest_poll)
728+
wrmsrl(MSR_KVM_POLL_CONTROL, 0);
729+
#endif
717730
}
718731

719732
static struct syscore_ops kvm_syscore_ops = {

0 commit comments

Comments
 (0)