diff mbox series

KVM: Don't shrink/grow vCPU halt_poll_ns if host side polling is disabled

Message ID 1569572822-28942-1-git-send-email-wanpengli@tencent.com (mailing list archive)
State New, archived
Headers show
Series KVM: Don't shrink/grow vCPU halt_poll_ns if host side polling is disabled | expand

Commit Message

Wanpeng Li Sept. 27, 2019, 8:27 a.m. UTC
From: Wanpeng Li <wanpengli@tencent.com>

Don't waste cycles to shrink/grow vCPU halt_poll_ns if host 
side polling is disabled.

Cc: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Wanpeng Li <wanpengli@tencent.com>
---
 virt/kvm/kvm_main.c | 28 +++++++++++++++-------------
 1 file changed, 15 insertions(+), 13 deletions(-)

Comments

Sean Christopherson Sept. 27, 2019, 2:42 p.m. UTC | #1
On Fri, Sep 27, 2019 at 04:27:02PM +0800, Wanpeng Li wrote:
> From: Wanpeng Li <wanpengli@tencent.com>
> 
> Don't waste cycles to shrink/grow vCPU halt_poll_ns if host 
> side polling is disabled.
> 
> Cc: Marcelo Tosatti <mtosatti@redhat.com>
> Signed-off-by: Wanpeng Li <wanpengli@tencent.com>
> ---
>  virt/kvm/kvm_main.c | 28 +++++++++++++++-------------
>  1 file changed, 15 insertions(+), 13 deletions(-)
> 
> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> index e6de315..b368be4 100644
> --- a/virt/kvm/kvm_main.c
> +++ b/virt/kvm/kvm_main.c
> @@ -2359,20 +2359,22 @@ void kvm_vcpu_block(struct kvm_vcpu *vcpu)
>  	kvm_arch_vcpu_unblocking(vcpu);
>  	block_ns = ktime_to_ns(cur) - ktime_to_ns(start);
>  
> -	if (!vcpu_valid_wakeup(vcpu))
> -		shrink_halt_poll_ns(vcpu);
> -	else if (halt_poll_ns) {
> -		if (block_ns <= vcpu->halt_poll_ns)
> -			;
> -		/* we had a long block, shrink polling */
> -		else if (vcpu->halt_poll_ns && block_ns > halt_poll_ns)
> +	if (!kvm_arch_no_poll(vcpu)) {

Can vcpu->halt_poll_ns be cached and used both here and in the similar
check above?  E.g.:

	unsigned int vcpu_halt_poll_ns;

	vcpu_halt_poll_ns = kvm_arch_no_poll(vcpu) ? 0 : vcpu->halt_poll_ns;

	if (vcpu_halt_poll_ns) {
		...
	}

> +		if (!vcpu_valid_wakeup(vcpu))
>  			shrink_halt_poll_ns(vcpu);
> -		/* we had a short halt and our poll time is too small */
> -		else if (vcpu->halt_poll_ns < halt_poll_ns &&
> -			block_ns < halt_poll_ns)
> -			grow_halt_poll_ns(vcpu);
> -	} else
> -		vcpu->halt_poll_ns = 0;
> +		else if (halt_poll_ns) {
> +			if (block_ns <= vcpu->halt_poll_ns)
> +				;
> +			/* we had a long block, shrink polling */
> +			else if (vcpu->halt_poll_ns && block_ns > halt_poll_ns)
> +				shrink_halt_poll_ns(vcpu);
> +			/* we had a short halt and our poll time is too small */
> +			else if (vcpu->halt_poll_ns < halt_poll_ns &&
> +				block_ns < halt_poll_ns)
> +				grow_halt_poll_ns(vcpu);
> +		} else
> +			vcpu->halt_poll_ns = 0;


Not your code, but it'd be a good time to add braces to the 'if' and
'else'.  Per Documentation/process/coding-style.rst:

  Do not unnecessarily use braces where a single statement will do.

  ...

  This does not apply if only one branch of a conditional statement is a single
  statement; in the latter case use braces in both branches:

        if (condition) {
                do_this();
                do_that();
        } else {
                otherwise();
        }


> +	}
>  
>  	trace_kvm_vcpu_wakeup(block_ns, waited, vcpu_valid_wakeup(vcpu));
>  	kvm_arch_vcpu_block_finish(vcpu);
> -- 
> 2.7.4
>
Marcelo Tosatti Sept. 27, 2019, 3:50 p.m. UTC | #2
On Fri, Sep 27, 2019 at 04:27:02PM +0800, Wanpeng Li wrote:
> From: Wanpeng Li <wanpengli@tencent.com>
> 
> Don't waste cycles to shrink/grow vCPU halt_poll_ns if host 
> side polling is disabled.
> 
> Cc: Marcelo Tosatti <mtosatti@redhat.com>
> Signed-off-by: Wanpeng Li <wanpengli@tencent.com>
> ---
>  virt/kvm/kvm_main.c | 28 +++++++++++++++-------------
>  1 file changed, 15 insertions(+), 13 deletions(-)
> 
> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> index e6de315..b368be4 100644
> --- a/virt/kvm/kvm_main.c
> +++ b/virt/kvm/kvm_main.c
> @@ -2359,20 +2359,22 @@ void kvm_vcpu_block(struct kvm_vcpu *vcpu)
>  	kvm_arch_vcpu_unblocking(vcpu);
>  	block_ns = ktime_to_ns(cur) - ktime_to_ns(start);
>  
> -	if (!vcpu_valid_wakeup(vcpu))
> -		shrink_halt_poll_ns(vcpu);
> -	else if (halt_poll_ns) {
> -		if (block_ns <= vcpu->halt_poll_ns)
> -			;
> -		/* we had a long block, shrink polling */
> -		else if (vcpu->halt_poll_ns && block_ns > halt_poll_ns)
> +	if (!kvm_arch_no_poll(vcpu)) {
> +		if (!vcpu_valid_wakeup(vcpu))
>  			shrink_halt_poll_ns(vcpu);
> -		/* we had a short halt and our poll time is too small */
> -		else if (vcpu->halt_poll_ns < halt_poll_ns &&
> -			block_ns < halt_poll_ns)
> -			grow_halt_poll_ns(vcpu);
> -	} else
> -		vcpu->halt_poll_ns = 0;
> +		else if (halt_poll_ns) {
> +			if (block_ns <= vcpu->halt_poll_ns)
> +				;
> +			/* we had a long block, shrink polling */
> +			else if (vcpu->halt_poll_ns && block_ns > halt_poll_ns)
> +				shrink_halt_poll_ns(vcpu);
> +			/* we had a short halt and our poll time is too small */
> +			else if (vcpu->halt_poll_ns < halt_poll_ns &&
> +				block_ns < halt_poll_ns)
> +				grow_halt_poll_ns(vcpu);
> +		} else
> +			vcpu->halt_poll_ns = 0;
> +	}
>  
>  	trace_kvm_vcpu_wakeup(block_ns, waited, vcpu_valid_wakeup(vcpu));
>  	kvm_arch_vcpu_block_finish(vcpu);
> -- 
> 2.7.4

Looks good.
Wanpeng Li Sept. 29, 2019, 12:57 a.m. UTC | #3
On Fri, 27 Sep 2019 at 22:42, Sean Christopherson
<sean.j.christopherson@intel.com> wrote:
>
> On Fri, Sep 27, 2019 at 04:27:02PM +0800, Wanpeng Li wrote:
> > From: Wanpeng Li <wanpengli@tencent.com>
> >
> > Don't waste cycles to shrink/grow vCPU halt_poll_ns if host
> > side polling is disabled.
> >
> > Cc: Marcelo Tosatti <mtosatti@redhat.com>
> > Signed-off-by: Wanpeng Li <wanpengli@tencent.com>
> > ---
> >  virt/kvm/kvm_main.c | 28 +++++++++++++++-------------
> >  1 file changed, 15 insertions(+), 13 deletions(-)
> >
> > diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> > index e6de315..b368be4 100644
> > --- a/virt/kvm/kvm_main.c
> > +++ b/virt/kvm/kvm_main.c
> > @@ -2359,20 +2359,22 @@ void kvm_vcpu_block(struct kvm_vcpu *vcpu)
> >       kvm_arch_vcpu_unblocking(vcpu);
> >       block_ns = ktime_to_ns(cur) - ktime_to_ns(start);
> >
> > -     if (!vcpu_valid_wakeup(vcpu))
> > -             shrink_halt_poll_ns(vcpu);
> > -     else if (halt_poll_ns) {
> > -             if (block_ns <= vcpu->halt_poll_ns)
> > -                     ;
> > -             /* we had a long block, shrink polling */
> > -             else if (vcpu->halt_poll_ns && block_ns > halt_poll_ns)
> > +     if (!kvm_arch_no_poll(vcpu)) {
>
> Can vcpu->halt_poll_ns be cached and used both here and in the similar
> check above?  E.g.:
>
>         unsigned int vcpu_halt_poll_ns;
>
>         vcpu_halt_poll_ns = kvm_arch_no_poll(vcpu) ? 0 : vcpu->halt_poll_ns;
>
>         if (vcpu_halt_poll_ns) {
>                 ...
>         }

This is not correct, !kvm_arch_no_poll(vcpu) && vcpu->halt_poll_ns ==
0, you will stop grow.

>
> > +             if (!vcpu_valid_wakeup(vcpu))
> >                       shrink_halt_poll_ns(vcpu);
> > -             /* we had a short halt and our poll time is too small */
> > -             else if (vcpu->halt_poll_ns < halt_poll_ns &&
> > -                     block_ns < halt_poll_ns)
> > -                     grow_halt_poll_ns(vcpu);
> > -     } else
> > -             vcpu->halt_poll_ns = 0;
> > +             else if (halt_poll_ns) {
> > +                     if (block_ns <= vcpu->halt_poll_ns)
> > +                             ;
> > +                     /* we had a long block, shrink polling */
> > +                     else if (vcpu->halt_poll_ns && block_ns > halt_poll_ns)
> > +                             shrink_halt_poll_ns(vcpu);
> > +                     /* we had a short halt and our poll time is too small */
> > +                     else if (vcpu->halt_poll_ns < halt_poll_ns &&
> > +                             block_ns < halt_poll_ns)
> > +                             grow_halt_poll_ns(vcpu);
> > +             } else
> > +                     vcpu->halt_poll_ns = 0;
>
>
> Not your code,

Not the truth. :)

>but it'd be a good time to add braces to the 'if' and
> 'else'.  Per Documentation/process/coding-style.rst:
>
>   Do not unnecessarily use braces where a single statement will do.
>
>   ...
>
>   This does not apply if only one branch of a conditional statement is a single
>   statement; in the latter case use braces in both branches:
>
>         if (condition) {
>                 do_this();
>                 do_that();
>         } else {
>                 otherwise();
>         }

Will do in v2.

    Wanpeng
Wanpeng Li Sept. 29, 2019, 1:03 a.m. UTC | #4
On Sat, 28 Sep 2019 at 01:24, Marcelo Tosatti <mtosatti@redhat.com> wrote:
>
> On Fri, Sep 27, 2019 at 04:27:02PM +0800, Wanpeng Li wrote:
> > From: Wanpeng Li <wanpengli@tencent.com>
> >
> > Don't waste cycles to shrink/grow vCPU halt_poll_ns if host
> > side polling is disabled.
> >
> > Cc: Marcelo Tosatti <mtosatti@redhat.com>
> > Signed-off-by: Wanpeng Li <wanpengli@tencent.com>
> > ---
> >  virt/kvm/kvm_main.c | 28 +++++++++++++++-------------
> >  1 file changed, 15 insertions(+), 13 deletions(-)
> >
> > diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> > index e6de315..b368be4 100644
> > --- a/virt/kvm/kvm_main.c
> > +++ b/virt/kvm/kvm_main.c
> > @@ -2359,20 +2359,22 @@ void kvm_vcpu_block(struct kvm_vcpu *vcpu)
> >       kvm_arch_vcpu_unblocking(vcpu);
> >       block_ns = ktime_to_ns(cur) - ktime_to_ns(start);
> >
> > -     if (!vcpu_valid_wakeup(vcpu))
> > -             shrink_halt_poll_ns(vcpu);
> > -     else if (halt_poll_ns) {
> > -             if (block_ns <= vcpu->halt_poll_ns)
> > -                     ;
> > -             /* we had a long block, shrink polling */
> > -             else if (vcpu->halt_poll_ns && block_ns > halt_poll_ns)
> > +     if (!kvm_arch_no_poll(vcpu)) {
> > +             if (!vcpu_valid_wakeup(vcpu))
> >                       shrink_halt_poll_ns(vcpu);
> > -             /* we had a short halt and our poll time is too small */
> > -             else if (vcpu->halt_poll_ns < halt_poll_ns &&
> > -                     block_ns < halt_poll_ns)
> > -                     grow_halt_poll_ns(vcpu);
> > -     } else
> > -             vcpu->halt_poll_ns = 0;
> > +             else if (halt_poll_ns) {
> > +                     if (block_ns <= vcpu->halt_poll_ns)
> > +                             ;
> > +                     /* we had a long block, shrink polling */
> > +                     else if (vcpu->halt_poll_ns && block_ns > halt_poll_ns)
> > +                             shrink_halt_poll_ns(vcpu);
> > +                     /* we had a short halt and our poll time is too small */
> > +                     else if (vcpu->halt_poll_ns < halt_poll_ns &&
> > +                             block_ns < halt_poll_ns)
> > +                             grow_halt_poll_ns(vcpu);
> > +             } else
> > +                     vcpu->halt_poll_ns = 0;
> > +     }
> >
> >       trace_kvm_vcpu_wakeup(block_ns, waited, vcpu_valid_wakeup(vcpu));
> >       kvm_arch_vcpu_block_finish(vcpu);
> > --
> > 2.7.4
>
> Looks good.

I will add your ACK in v2.

    Wanpeng
diff mbox series

Patch

diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index e6de315..b368be4 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -2359,20 +2359,22 @@  void kvm_vcpu_block(struct kvm_vcpu *vcpu)
 	kvm_arch_vcpu_unblocking(vcpu);
 	block_ns = ktime_to_ns(cur) - ktime_to_ns(start);
 
-	if (!vcpu_valid_wakeup(vcpu))
-		shrink_halt_poll_ns(vcpu);
-	else if (halt_poll_ns) {
-		if (block_ns <= vcpu->halt_poll_ns)
-			;
-		/* we had a long block, shrink polling */
-		else if (vcpu->halt_poll_ns && block_ns > halt_poll_ns)
+	if (!kvm_arch_no_poll(vcpu)) {
+		if (!vcpu_valid_wakeup(vcpu))
 			shrink_halt_poll_ns(vcpu);
-		/* we had a short halt and our poll time is too small */
-		else if (vcpu->halt_poll_ns < halt_poll_ns &&
-			block_ns < halt_poll_ns)
-			grow_halt_poll_ns(vcpu);
-	} else
-		vcpu->halt_poll_ns = 0;
+		else if (halt_poll_ns) {
+			if (block_ns <= vcpu->halt_poll_ns)
+				;
+			/* we had a long block, shrink polling */
+			else if (vcpu->halt_poll_ns && block_ns > halt_poll_ns)
+				shrink_halt_poll_ns(vcpu);
+			/* we had a short halt and our poll time is too small */
+			else if (vcpu->halt_poll_ns < halt_poll_ns &&
+				block_ns < halt_poll_ns)
+				grow_halt_poll_ns(vcpu);
+		} else
+			vcpu->halt_poll_ns = 0;
+	}
 
 	trace_kvm_vcpu_wakeup(block_ns, waited, vcpu_valid_wakeup(vcpu));
 	kvm_arch_vcpu_block_finish(vcpu);