[v2,2/2] KVM: s390: provide kvm_arch_no_poll function
diff mbox series

Message ID 20190416180158.112309-3-borntraeger@de.ibm.com
State New
Headers show
Series
  • disabling halt polling for nested virtualization
Related show

Commit Message

Christian Borntraeger April 16, 2019, 6:01 p.m. UTC
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(+)

Comments

Christian Borntraeger April 16, 2019, 6:02 p.m. UTC | #1
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 */
>
Cornelia Huck April 18, 2019, 2:46 p.m. UTC | #2
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>

Patch
diff mbox series

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 */