All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christoffer Dall <cdall@linaro.org>
To: Andrew Jones <drjones@redhat.com>
Cc: kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org,
	marc.zyngier@arm.com, pbonzini@redhat.com, rkrcmar@redhat.com
Subject: Re: [PATCH v5 04/11] KVM: arm/arm64: properly use vcpu requests
Date: Sun, 4 Jun 2017 16:51:33 +0200	[thread overview]
Message-ID: <20170604145133.GD9464@cbox> (raw)
In-Reply-To: <20170604124401.24902-5-drjones@redhat.com>

On Sun, Jun 04, 2017 at 02:43:54PM +0200, Andrew Jones wrote:
> arm/arm64 already has one VCPU request used when setting pause,
> but it doesn't properly check requests in VCPU RUN. Check it
> and also make sure we set vcpu->mode at the appropriate time
> (before the check) and with the appropriate barriers. See
> Documentation/virtual/kvm/vcpu-requests.rst. Also make sure we
> don't leave any vcpu requests we don't intend to handle later
> set in the request bitmap. If we don't clear them, then
> kvm_request_pending() may return true when it shouldn't.
> 
> Using VCPU requests properly fixes a small race where pause
> could get set just as a VCPU was entering guest mode.

Whoops, i forgot to say that I reviewed this:

Reviewed-by: Christoffer Dall <cdall@linaro.org>

> 
> Signed-off-by: Andrew Jones <drjones@redhat.com>
> ---
>  arch/arm/kvm/handle_exit.c   |  1 +
>  arch/arm64/kvm/handle_exit.c |  1 +
>  virt/kvm/arm/arm.c           | 14 ++++++++++++--
>  virt/kvm/arm/psci.c          |  1 +
>  4 files changed, 15 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/arm/kvm/handle_exit.c b/arch/arm/kvm/handle_exit.c
> index 5fd7968cdae9..a2b4f7b82356 100644
> --- a/arch/arm/kvm/handle_exit.c
> +++ b/arch/arm/kvm/handle_exit.c
> @@ -72,6 +72,7 @@ static int kvm_handle_wfx(struct kvm_vcpu *vcpu, struct kvm_run *run)
>  		trace_kvm_wfx(*vcpu_pc(vcpu), false);
>  		vcpu->stat.wfi_exit_stat++;
>  		kvm_vcpu_block(vcpu);
> +		kvm_clear_request(KVM_REQ_UNHALT, vcpu);
>  	}
>  
>  	kvm_skip_instr(vcpu, kvm_vcpu_trap_il_is32bit(vcpu));
> diff --git a/arch/arm64/kvm/handle_exit.c b/arch/arm64/kvm/handle_exit.c
> index fa1b18e364fc..17d8a1677a0b 100644
> --- a/arch/arm64/kvm/handle_exit.c
> +++ b/arch/arm64/kvm/handle_exit.c
> @@ -89,6 +89,7 @@ static int kvm_handle_wfx(struct kvm_vcpu *vcpu, struct kvm_run *run)
>  		trace_kvm_wfx_arm64(*vcpu_pc(vcpu), false);
>  		vcpu->stat.wfi_exit_stat++;
>  		kvm_vcpu_block(vcpu);
> +		kvm_clear_request(KVM_REQ_UNHALT, vcpu);
>  	}
>  
>  	kvm_skip_instr(vcpu, kvm_vcpu_trap_il_is32bit(vcpu));
> diff --git a/virt/kvm/arm/arm.c b/virt/kvm/arm/arm.c
> index 3c387fdc4a9e..138212605ad9 100644
> --- a/virt/kvm/arm/arm.c
> +++ b/virt/kvm/arm/arm.c
> @@ -546,6 +546,7 @@ void kvm_arm_resume_guest(struct kvm *kvm)
>  
>  	kvm_for_each_vcpu(i, vcpu, kvm) {
>  		vcpu->arch.pause = false;
> +		kvm_clear_request(KVM_REQ_VCPU_EXIT, vcpu);
>  		swake_up(kvm_arch_vcpu_wq(vcpu));
>  	}
>  }
> @@ -638,8 +639,18 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
>  			run->exit_reason = KVM_EXIT_INTR;
>  		}
>  
> +		/*
> +		 * Ensure we set mode to IN_GUEST_MODE after we disable
> +		 * interrupts and before the final VCPU requests check.
> +		 * See the comment in kvm_vcpu_exiting_guest_mode() and
> +		 * Documentation/virtual/kvm/vcpu-requests.rst
> +		 */
> +		smp_store_mb(vcpu->mode, IN_GUEST_MODE);
> +
>  		if (ret <= 0 || need_new_vmid_gen(vcpu->kvm) ||
> -			vcpu->arch.power_off || vcpu->arch.pause) {
> +		    kvm_request_pending(vcpu) ||
> +		    vcpu->arch.power_off || vcpu->arch.pause) {
> +			vcpu->mode = OUTSIDE_GUEST_MODE;
>  			local_irq_enable();
>  			kvm_pmu_sync_hwstate(vcpu);
>  			kvm_timer_sync_hwstate(vcpu);
> @@ -655,7 +666,6 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
>  		 */
>  		trace_kvm_entry(*vcpu_pc(vcpu));
>  		guest_enter_irqoff();
> -		vcpu->mode = IN_GUEST_MODE;
>  
>  		ret = kvm_call_hyp(__kvm_vcpu_run, vcpu);
>  
> diff --git a/virt/kvm/arm/psci.c b/virt/kvm/arm/psci.c
> index a08d7a93aebb..f68be2cc6256 100644
> --- a/virt/kvm/arm/psci.c
> +++ b/virt/kvm/arm/psci.c
> @@ -57,6 +57,7 @@ static unsigned long kvm_psci_vcpu_suspend(struct kvm_vcpu *vcpu)
>  	 * for KVM will preserve the register state.
>  	 */
>  	kvm_vcpu_block(vcpu);
> +	kvm_clear_request(KVM_REQ_UNHALT, vcpu);
>  
>  	return PSCI_RET_SUCCESS;
>  }
> -- 
> 2.9.4
> 

  reply	other threads:[~2017-06-04 14:51 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-06-04 12:43 [PATCH v5 00/11] KVM: arm/arm64: race fixes and vcpu requests Andrew Jones
2017-06-04 12:43 ` [PATCH v5 01/11] KVM: improve arch vcpu request defining Andrew Jones
2017-06-04 12:43 ` [PATCH v5 02/11] KVM: add kvm_request_pending Andrew Jones
2017-06-04 12:43 ` [PATCH v5 03/11] KVM: Add documentation for VCPU requests Andrew Jones
2017-06-04 12:43 ` [PATCH v5 04/11] KVM: arm/arm64: properly use vcpu requests Andrew Jones
2017-06-04 14:51   ` Christoffer Dall [this message]
2017-06-04 12:43 ` [PATCH v5 05/11] KVM: arm/arm64: replace pause checks with vcpu request checks Andrew Jones
2017-06-04 12:43 ` [PATCH v5 06/11] KVM: arm/arm64: use vcpu requests for power_off Andrew Jones
2017-06-04 12:43 ` [PATCH v5 07/11] KVM: arm/arm64: optimize VCPU RUN Andrew Jones
2017-06-04 12:43 ` [PATCH v5 08/11] KVM: arm/arm64: change exit request to sleep request Andrew Jones
2017-06-04 12:43 ` [PATCH v5 09/11] KVM: arm/arm64: use vcpu requests for irq injection Andrew Jones
2017-06-04 12:44 ` [PATCH v5 10/11] KVM: arm/arm64: PMU: remove request-less vcpu kick Andrew Jones
2017-06-04 12:44 ` [PATCH v5 11/11] KVM: arm/arm64: timer: " Andrew Jones
2017-06-04 14:52   ` Christoffer Dall
2017-06-04 14:56 ` [PATCH v5 00/11] KVM: arm/arm64: race fixes and vcpu requests Christoffer Dall

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170604145133.GD9464@cbox \
    --to=cdall@linaro.org \
    --cc=drjones@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=kvmarm@lists.cs.columbia.edu \
    --cc=marc.zyngier@arm.com \
    --cc=pbonzini@redhat.com \
    --cc=rkrcmar@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.