diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h
index 5c52a9f..c0e16d4 100644
--- a/arch/powerpc/include/asm/kvm_host.h
+++ b/arch/powerpc/include/asm/kvm_host.h
@@ -114,8 +114,11 @@ struct kvm_vcpu_stat {
u64 emulated_inst_exits;
u64 dec_exits;
u64 ext_intr_exits;
+ u64 halt_block_time_successful_poll;
+ u64 halt_block_time_waited;
u64 halt_successful_poll;
u64 halt_attempted_poll;
+ u64 halt_successful_wait;
u64 halt_poll_invalid;
u64 halt_wakeup;
u64 dbell_exits;diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c
index 47018fc..0c1295b 100644
--- a/arch/powerpc/kvm/book3s.c
+++ b/arch/powerpc/kvm/book3s.c
@@ -52,8 +52,13 @@ struct kvm_stats_debugfs_item debugfs_entries[] = {
{ "dec", VCPU_STAT(dec_exits) },
{ "ext_intr", VCPU_STAT(ext_intr_exits) },
{ "queue_intr", VCPU_STAT(queue_intr) },
+ { "halt_block_time_successful_poll_ns",
+ VCPU_STAT(halt_block_time_successful_poll) },
+ { "halt_block_time_waited_ns",
+ VCPU_STAT(halt_block_time_waited) },
{ "halt_successful_poll", VCPU_STAT(halt_successful_poll), },
{ "halt_attempted_poll", VCPU_STAT(halt_attempted_poll), },
+ { "halt_successful_wait", VCPU_STAT(halt_successful_wait) },
{ "halt_poll_invalid", VCPU_STAT(halt_poll_invalid) },
{ "halt_wakeup", VCPU_STAT(halt_wakeup) },
{ "pf_storage", VCPU_STAT(pf_storage) },diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c
index 0d8ce14..975a757 100644
--- a/arch/powerpc/kvm/book3s_hv.c
+++ b/arch/powerpc/kvm/book3s_hv.c
@@ -2679,8 +2679,8 @@ static int kvmppc_vcore_check_block(struct kvmppc_vcore *vc)
*/
static void kvmppc_vcore_blocked(struct kvmppc_vcore *vc)
{
- int do_sleep = 1;
ktime_t cur, start;
+ int do_sleep = 1;
u64 block_ns;
DECLARE_SWAITQUEUE(wait);
@@ -2688,6 +2688,7 @@ static void kvmppc_vcore_blocked(struct kvmppc_vcore *vc)
cur = start = ktime_get();
if (vc->halt_poll_ns) {
ktime_t stop = ktime_add_ns(start, vc->halt_poll_ns);
+ ++vc->runner->stat.halt_attempted_poll;
vc->vcore_state = VCORE_POLLING;
spin_unlock(&vc->lock);@@ -2703,8 +2704,10 @@ static void kvmppc_vcore_blocked(struct kvmppc_vcore *vc)
spin_lock(&vc->lock);
vc->vcore_state = VCORE_INACTIVE;
- if (!do_sleep)
+ if (!do_sleep) {
+ ++vc->runner->stat.halt_successful_poll;
goto out;
+ }
}
prepare_to_swait(&vc->wq, &wait, TASK_INTERRUPTIBLE);@@ -2712,6 +2715,9 @@ static void kvmppc_vcore_blocked(struct kvmppc_vcore *vc)
if (kvmppc_vcore_check_block(vc)) {
finish_swait(&vc->wq, &wait);
do_sleep = 0;
+ /* If we polled, count this as a successful poll */
+ if (vc->halt_poll_ns)
+ ++vc->runner->stat.halt_successful_poll;
goto out;
}
@@ -2723,12 +2729,18 @@ static void kvmppc_vcore_blocked(struct kvmppc_vcore *vc)
spin_lock(&vc->lock);
vc->vcore_state = VCORE_INACTIVE;
trace_kvmppc_vcore_blocked(vc, 1);
+ ++vc->runner->stat.halt_successful_wait;
cur = ktime_get();
out:
block_ns = ktime_to_ns(cur) - ktime_to_ns(start);
+ if (do_sleep)
+ vc->runner->stat.halt_block_time_waited += block_ns;
+ else if (vc->halt_poll_ns)
+ vc->runner->stat.halt_block_time_successful_poll += block_ns;
+
if (halt_poll_max_ns) {
if (block_ns <= vc->halt_poll_ns)
;--
2.5.5