aboutsummaryrefslogtreecommitdiff
path: root/virt/kvm
diff options
context:
space:
mode:
authorSean Christopherson2021-10-08 19:11:59 -0700
committerPaolo Bonzini2021-12-08 04:24:47 -0500
commit29e72893cec3b0268e19e7857d10bf79843f94dc (patch)
treec2fe06dba28b79d71a52ab8861b9645a67721878 /virt/kvm
parent8df6a61c04038fa481a717fc86af38304aa600a3 (diff)
KVM: Refactor and document halt-polling stats update helper
Add a comment to document that halt-polling is considered successful even if the polling loop itself didn't detect a wake event, i.e. if a wake event was detect in the final kvm_vcpu_check_block(). Invert the param to update helper so that the helper is a dumb function that is "told" whether or not polling was successful, as opposed to determining success based on blocking behavior. Opportunistically tweak the params to the update helper to reduce the line length for the call site so that it fits on a single line, and so that the prototype conforms to the more traditional kernel style. No functional change intended. Reviewed-by: David Matlack <dmatlack@google.com> Signed-off-by: Sean Christopherson <seanjc@google.com> Message-Id: <20211009021236.4122790-7-seanjc@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'virt/kvm')
-rw-r--r--virt/kvm/kvm_main.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 1a15043ceecb..a7f9c313d642 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -3272,13 +3272,15 @@ out:
return ret;
}
-static inline void
-update_halt_poll_stats(struct kvm_vcpu *vcpu, u64 poll_ns, bool waited)
+static inline void update_halt_poll_stats(struct kvm_vcpu *vcpu, ktime_t start,
+ ktime_t end, bool success)
{
- if (waited)
- vcpu->stat.generic.halt_poll_fail_ns += poll_ns;
- else
+ u64 poll_ns = ktime_to_ns(ktime_sub(end, start));
+
+ if (success)
vcpu->stat.generic.halt_poll_success_ns += poll_ns;
+ else
+ vcpu->stat.generic.halt_poll_fail_ns += poll_ns;
}
/*
@@ -3348,9 +3350,13 @@ out:
kvm_arch_vcpu_unblocking(vcpu);
block_ns = ktime_to_ns(cur) - ktime_to_ns(start);
+ /*
+ * Note, halt-polling is considered successful so long as the vCPU was
+ * never actually scheduled out, i.e. even if the wake event arrived
+ * after of the halt-polling loop itself, but before the full wait.
+ */
if (do_halt_poll)
- update_halt_poll_stats(
- vcpu, ktime_to_ns(ktime_sub(poll_end, start)), waited);
+ update_halt_poll_stats(vcpu, start, poll_end, !waited);
if (halt_poll_allowed) {
if (!vcpu_valid_wakeup(vcpu)) {