diff options
author | Li RongQing <lirongqing@baidu.com> | 2021-07-27 19:12:47 +0800 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2021-07-27 16:59:01 -0400 |
commit | 74775654332b2682a5580d6f954e5a9ac81e7477 (patch) | |
tree | 36e5a720e26b554856d3db47524f2369c8bd2d6a /virt/kvm | |
parent | 5868b8225ecef4ba3f5b17e65984d60bc5fd6254 (diff) | |
download | linux-74775654332b2682a5580d6f954e5a9ac81e7477.tar.gz linux-74775654332b2682a5580d6f954e5a9ac81e7477.tar.bz2 linux-74775654332b2682a5580d6f954e5a9ac81e7477.zip |
KVM: use cpu_relax when halt polling
SMT siblings share caches and other hardware, and busy halt polling
will degrade its sibling performance if its sibling is working
Sean Christopherson suggested as below:
"Rather than disallowing halt-polling entirely, on x86 it should be
sufficient to simply have the hardware thread yield to its sibling(s)
via PAUSE. It probably won't get back all performance, but I would
expect it to be close.
This compiles on all KVM architectures, and AFAICT the intended usage
of cpu_relax() is identical for all architectures."
Suggested-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Li RongQing <lirongqing@baidu.com>
Message-Id: <20210727111247.55510-1-lirongqing@baidu.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'virt/kvm')
-rw-r--r-- | virt/kvm/kvm_main.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 986959833d70..0d732813fa80 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -3110,6 +3110,7 @@ void kvm_vcpu_block(struct kvm_vcpu *vcpu) ++vcpu->stat.generic.halt_poll_invalid; goto out; } + cpu_relax(); poll_end = cur = ktime_get(); } while (kvm_vcpu_can_poll(cur, stop)); } |