On Tue, Sep 15, 2015 at 9:27 AM, Paolo Bonzini <pbonzini@xxxxxxxxxx> wrote: > This new statistic can help diagnosing VCPUs that, for any reason, > trigger bad behavior of halt_poll_ns autotuning. > > For example, say halt_poll_ns = 480000, and wakeups are spaced exactly > like 479us, 481us, 479us, 481us. Then KVM always fails polling and wastes > 10+20+40+80+160+320+480 = 1110 microseconds out of every > 479+481+479+481+479+481+479 = 3359 microseconds. The VCPU then > is consuming about 30% more CPU than it would use without > polling. This would show as an abnormally high number of > attempted polling compared to the successful polls. Reviewed-by: David Matlack <dmatlack@xxxxxxxxxx> > > Cc: Christian Borntraeger <borntraeger@xxxxxxxxxx< > Cc: David Matlack <dmatlack@xxxxxxxxxx> > Signed-off-by: Paolo Bonzini <pbonzini@xxxxxxxxxx> > --- > arch/arm/include/asm/kvm_host.h | 1 + > arch/arm64/include/asm/kvm_host.h | 1 + > arch/mips/include/asm/kvm_host.h | 1 + > arch/mips/kvm/mips.c | 1 + > arch/powerpc/include/asm/kvm_host.h | 1 + > arch/powerpc/kvm/book3s.c | 1 + > arch/powerpc/kvm/booke.c | 1 + > arch/s390/include/asm/kvm_host.h | 1 + > arch/s390/kvm/kvm-s390.c | 1 + > arch/x86/include/asm/kvm_host.h | 1 + > arch/x86/kvm/x86.c | 1 + > virt/kvm/kvm_main.c | 1 + > 12 files changed, 12 insertions(+) > > diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm_host.h > index dcba0fa5176e..687ddeba3611 100644 > --- a/arch/arm/include/asm/kvm_host.h > +++ b/arch/arm/include/asm/kvm_host.h > @@ -148,6 +148,7 @@ struct kvm_vm_stat { > > struct kvm_vcpu_stat { > u32 halt_successful_poll; > + u32 halt_attempted_poll; > u32 halt_wakeup; > }; > > diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h > index 415938dc45cf..486594583cc6 100644 > --- a/arch/arm64/include/asm/kvm_host.h > +++ b/arch/arm64/include/asm/kvm_host.h > @@ -195,6 +195,7 @@ struct kvm_vm_stat { > > struct kvm_vcpu_stat { > u32 halt_successful_poll; > + u32 halt_attempted_poll; > u32 halt_wakeup; > }; > > diff --git a/arch/mips/include/asm/kvm_host.h b/arch/mips/include/asm/kvm_host.h > index e8c8d9d0c45f..3a54dbca9f7e 100644 > --- a/arch/mips/include/asm/kvm_host.h > +++ b/arch/mips/include/asm/kvm_host.h > @@ -128,6 +128,7 @@ struct kvm_vcpu_stat { > u32 msa_disabled_exits; > u32 flush_dcache_exits; > u32 halt_successful_poll; > + u32 halt_attempted_poll; > u32 halt_wakeup; > }; > > diff --git a/arch/mips/kvm/mips.c b/arch/mips/kvm/mips.c > index cd4c129ce743..49ff3bfc007e 100644 > --- a/arch/mips/kvm/mips.c > +++ b/arch/mips/kvm/mips.c > @@ -55,6 +55,7 @@ struct kvm_stats_debugfs_item debugfs_entries[] = { > { "msa_disabled", VCPU_STAT(msa_disabled_exits), KVM_STAT_VCPU }, > { "flush_dcache", VCPU_STAT(flush_dcache_exits), KVM_STAT_VCPU }, > { "halt_successful_poll", VCPU_STAT(halt_successful_poll), KVM_STAT_VCPU }, > + { "halt_attempted_poll", VCPU_STAT(halt_attempted_poll), KVM_STAT_VCPU }, > { "halt_wakeup", VCPU_STAT(halt_wakeup), KVM_STAT_VCPU }, > {NULL} > }; > diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h > index 98eebbf66340..195886a583ba 100644 > --- a/arch/powerpc/include/asm/kvm_host.h > +++ b/arch/powerpc/include/asm/kvm_host.h > @@ -108,6 +108,7 @@ struct kvm_vcpu_stat { > u32 dec_exits; > u32 ext_intr_exits; > u32 halt_successful_poll; > + u32 halt_attempted_poll; > u32 halt_wakeup; > u32 dbell_exits; > u32 gdbell_exits; > diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c > index d75bf325f54a..cf009167d208 100644 > --- a/arch/powerpc/kvm/book3s.c > +++ b/arch/powerpc/kvm/book3s.c > @@ -53,6 +53,7 @@ struct kvm_stats_debugfs_item debugfs_entries[] = { > { "ext_intr", VCPU_STAT(ext_intr_exits) }, > { "queue_intr", VCPU_STAT(queue_intr) }, > { "halt_successful_poll", VCPU_STAT(halt_successful_poll), }, > + { "halt_attempted_poll", VCPU_STAT(halt_attempted_poll), }, > { "halt_wakeup", VCPU_STAT(halt_wakeup) }, > { "pf_storage", VCPU_STAT(pf_storage) }, > { "sp_storage", VCPU_STAT(sp_storage) }, > diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c > index ae458f0fd061..fd5875179e5c 100644 > --- a/arch/powerpc/kvm/booke.c > +++ b/arch/powerpc/kvm/booke.c > @@ -63,6 +63,7 @@ struct kvm_stats_debugfs_item debugfs_entries[] = { > { "dec", VCPU_STAT(dec_exits) }, > { "ext_intr", VCPU_STAT(ext_intr_exits) }, > { "halt_successful_poll", VCPU_STAT(halt_successful_poll) }, > + { "halt_attempted_poll", VCPU_STAT(halt_attempted_poll) }, > { "halt_wakeup", VCPU_STAT(halt_wakeup) }, > { "doorbell", VCPU_STAT(dbell_exits) }, > { "guest doorbell", VCPU_STAT(gdbell_exits) }, > diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h > index 3d012e071647..6ce4a0b7e8da 100644 > --- a/arch/s390/include/asm/kvm_host.h > +++ b/arch/s390/include/asm/kvm_host.h > @@ -210,6 +210,7 @@ struct kvm_vcpu_stat { > u32 exit_validity; > u32 exit_instruction; > u32 halt_successful_poll; > + u32 halt_attempted_poll; > u32 halt_wakeup; > u32 instruction_lctl; > u32 instruction_lctlg; > diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c > index c91eb941b444..2f807ab1725e 100644 > --- a/arch/s390/kvm/kvm-s390.c > +++ b/arch/s390/kvm/kvm-s390.c > @@ -63,6 +63,7 @@ struct kvm_stats_debugfs_item debugfs_entries[] = { > { "exit_program_interruption", VCPU_STAT(exit_program_interruption) }, > { "exit_instr_and_program_int", VCPU_STAT(exit_instr_and_program) }, > { "halt_successful_poll", VCPU_STAT(halt_successful_poll) }, > + { "halt_attempted_poll", VCPU_STAT(halt_attempted_poll) }, > { "halt_wakeup", VCPU_STAT(halt_wakeup) }, > { "instruction_lctlg", VCPU_STAT(instruction_lctlg) }, > { "instruction_lctl", VCPU_STAT(instruction_lctl) }, > diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h > index 09acaa64ef8e..5bca6ac91e7c 100644 > --- a/arch/x86/include/asm/kvm_host.h > +++ b/arch/x86/include/asm/kvm_host.h > @@ -718,6 +718,7 @@ struct kvm_vcpu_stat { > u32 nmi_window_exits; > u32 halt_exits; > u32 halt_successful_poll; > + u32 halt_attempted_poll; > u32 halt_wakeup; > u32 request_irq_exits; > u32 irq_exits; > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index 18d59b584dee..96e748c46bee 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -149,6 +149,7 @@ struct kvm_stats_debugfs_item debugfs_entries[] = { > { "nmi_window", VCPU_STAT(nmi_window_exits) }, > { "halt_exits", VCPU_STAT(halt_exits) }, > { "halt_successful_poll", VCPU_STAT(halt_successful_poll) }, > + { "halt_attempted_poll", VCPU_STAT(halt_attempted_poll) }, > { "halt_wakeup", VCPU_STAT(halt_wakeup) }, > { "hypercalls", VCPU_STAT(hypercalls) }, > { "request_irq", VCPU_STAT(request_irq_exits) }, > diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c > index 0b48aadedcee..c5de4ba9b33e 100644 > --- a/virt/kvm/kvm_main.c > +++ b/virt/kvm/kvm_main.c > @@ -2004,6 +2004,7 @@ void kvm_vcpu_block(struct kvm_vcpu *vcpu) > if (vcpu->halt_poll_ns) { > ktime_t stop = ktime_add_ns(ktime_get(), vcpu->halt_poll_ns); > > + ++vcpu->stat.halt_attempted_poll; > do { > /* > * This sets KVM_REQ_UNHALT if an interrupt > -- > 1.8.3.1 > -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html