On Wed, Apr 26, 2017 at 10:32:26PM +0200, Radim Krčmář wrote:
> No need to kick a VCPU that we have just woken up.
> 
> Signed-off-by: Radim Krčmář <[email protected]>
> ---
>  include/linux/kvm_host.h |  2 +-
>  virt/kvm/kvm_main.c      | 12 ++++++++----
>  2 files changed, 9 insertions(+), 5 deletions(-)
> 
> diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
> index 955debd82cf2..38cfe372918c 100644
> --- a/include/linux/kvm_host.h
> +++ b/include/linux/kvm_host.h
> @@ -698,7 +698,7 @@ void kvm_vcpu_mark_page_dirty(struct kvm_vcpu *vcpu, 
> gfn_t gfn);
>  void kvm_vcpu_block(struct kvm_vcpu *vcpu);
>  void kvm_arch_vcpu_blocking(struct kvm_vcpu *vcpu);
>  void kvm_arch_vcpu_unblocking(struct kvm_vcpu *vcpu);
> -void kvm_vcpu_wake_up(struct kvm_vcpu *vcpu);
> +bool kvm_vcpu_wake_up(struct kvm_vcpu *vcpu);
>  void kvm_vcpu_kick(struct kvm_vcpu *vcpu);
>  int kvm_vcpu_yield_to(struct kvm_vcpu *target);
>  void kvm_vcpu_on_spin(struct kvm_vcpu *vcpu);
> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> index 1efb07643035..632f7b3e198c 100644
> --- a/virt/kvm/kvm_main.c
> +++ b/virt/kvm/kvm_main.c
> @@ -183,8 +183,8 @@ bool kvm_make_all_cpus_request(struct kvm *kvm, unsigned 
> int req)
>               kvm_make_request(req, vcpu);
>               cpu = vcpu->cpu;
>  
> -             if (!(req & KVM_REQUEST_NO_WAKEUP))
> -                     kvm_vcpu_wake_up(vcpu);
> +             if (!(req & KVM_REQUEST_NO_WAKEUP) && kvm_vcpu_wake_up(vcpu))
> +                     continue;
>  
>               if (cpus != NULL && cpu != -1 && cpu != me &&
>                     kvm_vcpu_exiting_guest_mode(vcpu) != OUTSIDE_GUEST_MODE)
> @@ -2195,7 +2195,7 @@ void kvm_vcpu_block(struct kvm_vcpu *vcpu)
>  }
>  EXPORT_SYMBOL_GPL(kvm_vcpu_block);
>  
> -void kvm_vcpu_wake_up(struct kvm_vcpu *vcpu)
> +bool kvm_vcpu_wake_up(struct kvm_vcpu *vcpu)
>  {
>       struct swait_queue_head *wqp;
>  
> @@ -2203,8 +2203,10 @@ void kvm_vcpu_wake_up(struct kvm_vcpu *vcpu)
>       if (swait_active(wqp)) {
>               swake_up(wqp);
>               ++vcpu->stat.halt_wakeup;
> +             return true;
>       }
>  
> +     return false;
>  }
>  EXPORT_SYMBOL_GPL(kvm_vcpu_wake_up);
>  
> @@ -2216,7 +2218,9 @@ void kvm_vcpu_kick(struct kvm_vcpu *vcpu)
>       int me;
>       int cpu = vcpu->cpu;
>  
> -     kvm_vcpu_wake_up(vcpu);
> +     if (kvm_vcpu_wake_up(vcpu))
> +             return;
> +
>       me = get_cpu();
>       if (cpu != me && (unsigned)cpu < nr_cpu_ids && cpu_online(cpu))
>               if (kvm_arch_vcpu_should_kick(vcpu))
> -- 
> 2.12.2
>

Reviewed-by: Andrew Jones <[email protected]> 

Reply via email to