aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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)) {