Message ID | 20190416180158.112309-3-borntraeger@de.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | disabling halt polling for nested virtualization | expand |
FWiw, this patch need 5.1-rc3 or later. On 16.04.19 20:01, Christian Borntraeger wrote: > We do track the current steal time of the host CPUs. Let us use > this value to disable halt polling if the steal time goes beyond > a configured value. > > Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> > Acked-by: Paolo Bonzini <pbonzini@redhat.com> > --- > arch/s390/include/asm/kvm_host.h | 1 + > arch/s390/kvm/Kconfig | 1 + > arch/s390/kvm/kvm-s390.c | 17 +++++++++++++++++ > 3 files changed, 19 insertions(+) > > diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h > index e70f6ce14267..dbe254847e0d 100644 > --- a/arch/s390/include/asm/kvm_host.h > +++ b/arch/s390/include/asm/kvm_host.h > @@ -313,6 +313,7 @@ struct kvm_vcpu_stat { > u64 halt_successful_poll; > u64 halt_attempted_poll; > u64 halt_poll_invalid; > + u64 halt_no_poll_steal; > u64 halt_wakeup; > u64 instruction_lctl; > u64 instruction_lctlg; > diff --git a/arch/s390/kvm/Kconfig b/arch/s390/kvm/Kconfig > index 767453faacfc..e987e73738b5 100644 > --- a/arch/s390/kvm/Kconfig > +++ b/arch/s390/kvm/Kconfig > @@ -31,6 +31,7 @@ config KVM > select HAVE_KVM_IRQFD > select HAVE_KVM_IRQ_ROUTING > select HAVE_KVM_INVALID_WAKEUPS > + select HAVE_KVM_NO_POLL > select SRCU > select KVM_VFIO > ---help--- > diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c > index d7423fdf5f68..8d0e2416f905 100644 > --- a/arch/s390/kvm/kvm-s390.c > +++ b/arch/s390/kvm/kvm-s390.c > @@ -75,6 +75,7 @@ struct kvm_stats_debugfs_item debugfs_entries[] = { > { "halt_successful_poll", VCPU_STAT(halt_successful_poll) }, > { "halt_attempted_poll", VCPU_STAT(halt_attempted_poll) }, > { "halt_poll_invalid", VCPU_STAT(halt_poll_invalid) }, > + { "halt_no_poll_steal", VCPU_STAT(halt_no_poll_steal) }, > { "halt_wakeup", VCPU_STAT(halt_wakeup) }, > { "instruction_lctlg", VCPU_STAT(instruction_lctlg) }, > { "instruction_lctl", VCPU_STAT(instruction_lctl) }, > @@ -182,6 +183,11 @@ static int hpage; > module_param(hpage, int, 0444); > MODULE_PARM_DESC(hpage, "1m huge page backing support"); > > +/* maximum percentage of steal time for polling */ > +static u8 halt_poll_max_steal = 10; > +module_param(halt_poll_max_steal, byte, 0644); > +MODULE_PARM_DESC(hpage, "Maximum percentage of steal time to allow pollinh"); > + > /* > * For now we handle at most 16 double words as this is what the s390 base > * kernel handles and stores in the prefix page. If we ever need to go beyond > @@ -3150,6 +3156,17 @@ static void kvm_gmap_notifier(struct gmap *gmap, unsigned long start, > } > } > > +bool kvm_arch_no_poll(struct kvm_vcpu *vcpu) > +{ > + /* do not poll with more than halt_poll_max_steal percent of steal time */ > + if (S390_lowcore.avg_steal_timer * 100 / (TICK_USEC << 12) >= > + halt_poll_max_steal) { > + vcpu->stat.halt_no_poll_steal++; > + return true; > + } > + return false; > +} > + > int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu) > { > /* kvm common code refers to this, but never calls it */ >
On Tue, 16 Apr 2019 20:01:58 +0200 Christian Borntraeger <borntraeger@de.ibm.com> wrote: > We do track the current steal time of the host CPUs. Let us use > this value to disable halt polling if the steal time goes beyond > a configured value. > > Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> > Acked-by: Paolo Bonzini <pbonzini@redhat.com> > --- > arch/s390/include/asm/kvm_host.h | 1 + > arch/s390/kvm/Kconfig | 1 + > arch/s390/kvm/kvm-s390.c | 17 +++++++++++++++++ > 3 files changed, 19 insertions(+) > > @@ -182,6 +183,11 @@ static int hpage; > module_param(hpage, int, 0444); > MODULE_PARM_DESC(hpage, "1m huge page backing support"); > > +/* maximum percentage of steal time for polling */ > +static u8 halt_poll_max_steal = 10; > +module_param(halt_poll_max_steal, byte, 0644); > +MODULE_PARM_DESC(hpage, "Maximum percentage of steal time to allow pollinh"); s/pollinh/polling/ > + > /* > * For now we handle at most 16 double words as this is what the s390 base > * kernel handles and stores in the prefix page. If we ever need to go beyond Reviewed-by: Cornelia Huck <cohuck@redhat.com>
diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h index e70f6ce14267..dbe254847e0d 100644 --- a/arch/s390/include/asm/kvm_host.h +++ b/arch/s390/include/asm/kvm_host.h @@ -313,6 +313,7 @@ struct kvm_vcpu_stat { u64 halt_successful_poll; u64 halt_attempted_poll; u64 halt_poll_invalid; + u64 halt_no_poll_steal; u64 halt_wakeup; u64 instruction_lctl; u64 instruction_lctlg; diff --git a/arch/s390/kvm/Kconfig b/arch/s390/kvm/Kconfig index 767453faacfc..e987e73738b5 100644 --- a/arch/s390/kvm/Kconfig +++ b/arch/s390/kvm/Kconfig @@ -31,6 +31,7 @@ config KVM select HAVE_KVM_IRQFD select HAVE_KVM_IRQ_ROUTING select HAVE_KVM_INVALID_WAKEUPS + select HAVE_KVM_NO_POLL select SRCU select KVM_VFIO ---help--- diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index d7423fdf5f68..8d0e2416f905 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c @@ -75,6 +75,7 @@ struct kvm_stats_debugfs_item debugfs_entries[] = { { "halt_successful_poll", VCPU_STAT(halt_successful_poll) }, { "halt_attempted_poll", VCPU_STAT(halt_attempted_poll) }, { "halt_poll_invalid", VCPU_STAT(halt_poll_invalid) }, + { "halt_no_poll_steal", VCPU_STAT(halt_no_poll_steal) }, { "halt_wakeup", VCPU_STAT(halt_wakeup) }, { "instruction_lctlg", VCPU_STAT(instruction_lctlg) }, { "instruction_lctl", VCPU_STAT(instruction_lctl) }, @@ -182,6 +183,11 @@ static int hpage; module_param(hpage, int, 0444); MODULE_PARM_DESC(hpage, "1m huge page backing support"); +/* maximum percentage of steal time for polling */ +static u8 halt_poll_max_steal = 10; +module_param(halt_poll_max_steal, byte, 0644); +MODULE_PARM_DESC(hpage, "Maximum percentage of steal time to allow pollinh"); + /* * For now we handle at most 16 double words as this is what the s390 base * kernel handles and stores in the prefix page. If we ever need to go beyond @@ -3150,6 +3156,17 @@ static void kvm_gmap_notifier(struct gmap *gmap, unsigned long start, } } +bool kvm_arch_no_poll(struct kvm_vcpu *vcpu) +{ + /* do not poll with more than halt_poll_max_steal percent of steal time */ + if (S390_lowcore.avg_steal_timer * 100 / (TICK_USEC << 12) >= + halt_poll_max_steal) { + vcpu->stat.halt_no_poll_steal++; + return true; + } + return false; +} + int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu) { /* kvm common code refers to this, but never calls it */