From: eric.auger@linaro.org (Eric Auger)
To: linux-arm-kernel@lists.infradead.org
Subject: [RFC 08/17] kvm: arm/arm64: implement kvm_arm_[halt, resume]_guest
Date: Fri, 03 Jul 2015 13:55:52 +0200 [thread overview]
Message-ID: <55967848.5050204@linaro.org> (raw)
In-Reply-To: <1435843047-6327-9-git-send-email-eric.auger@linaro.org>
Christoffer, Marc,
On 07/02/2015 03:17 PM, Eric Auger wrote:
> On halt, the guest is forced to exit and prevented from being
> re-entered. This is synchronous.
>
> Those two operations will be needed for IRQ forwarding setting.
>
> Signed-off-by: Eric Auger <eric.auger@linaro.org>
would you agree to handle this ARM functionality separately from the
forwarding series?
This includes 2 patch files, that one +
https://lkml.org/lkml/2015/7/2/288. This functionality is needed for
forwarding control since when changing the forwarding state we need to
"freeze" the state of the physical/virtual IRQ to undertake proper
actions. Stopping the guest makes sure it won't deactivate the virtual
IRQ while we are doing state change actions.
The forwarding series is quite heterogeneous (VFIO platform driver,
vgic, irq bypass manager) and I think it would simplify the review process.
Please let me know if you agree. If yes, I will post a separate series.
Best Regards
Eric
>
> ---
>
> RFC:
> - rename the function and this latter becomes static
> - remove __KVM_HAVE_ARCH_HALT_GUEST
>
> v4 -> v5: add arm64 support
> - also defines __KVM_HAVE_ARCH_HALT_GUEST for arm64
> - add pause field
> ---
> arch/arm/include/asm/kvm_host.h | 3 +++
> arch/arm/kvm/arm.c | 32 +++++++++++++++++++++++++++++---
> arch/arm64/include/asm/kvm_host.h | 3 +++
> 3 files changed, 35 insertions(+), 3 deletions(-)
>
> diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm_host.h
> index 304004d..899ae27 100644
> --- a/arch/arm/include/asm/kvm_host.h
> +++ b/arch/arm/include/asm/kvm_host.h
> @@ -132,6 +132,9 @@ struct kvm_vcpu_arch {
> /* vcpu power-off state */
> bool power_off;
>
> + /* Don't run the guest */
> + bool pause;
> +
> /* IO related fields */
> struct kvm_decode mmio_decode;
>
> diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
> index 7537e68..4be6715 100644
> --- a/arch/arm/kvm/arm.c
> +++ b/arch/arm/kvm/arm.c
> @@ -471,11 +471,36 @@ bool kvm_arch_intc_initialized(struct kvm *kvm)
> return vgic_initialized(kvm);
> }
>
> +static void kvm_arm_halt_guest(struct kvm *kvm)
> +{
> + int i;
> + struct kvm_vcpu *vcpu;
> +
> + kvm_for_each_vcpu(i, vcpu, kvm)
> + vcpu->arch.pause = true;
> + force_vm_exit(cpu_all_mask);
> +}
> +
> +static void kvm_arm_resume_guest(struct kvm *kvm)
> +{
> + int i;
> + struct kvm_vcpu *vcpu;
> +
> + kvm_for_each_vcpu(i, vcpu, kvm) {
> + wait_queue_head_t *wq = kvm_arch_vcpu_wq(vcpu);
> +
> + vcpu->arch.pause = false;
> + wake_up_interruptible(wq);
> + }
> +}
> +
> +
> static void vcpu_pause(struct kvm_vcpu *vcpu)
> {
> wait_queue_head_t *wq = kvm_arch_vcpu_wq(vcpu);
>
> - wait_event_interruptible(*wq, !vcpu->arch.power_off);
> + wait_event_interruptible(*wq, ((!vcpu->arch.power_off) &&
> + (!vcpu->arch.pause)));
> }
>
> static int kvm_vcpu_initialized(struct kvm_vcpu *vcpu)
> @@ -525,7 +550,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
>
> update_vttbr(vcpu->kvm);
>
> - if (vcpu->arch.power_off)
> + if (vcpu->arch.power_off || vcpu->arch.pause)
> vcpu_pause(vcpu);
>
> /*
> @@ -551,7 +576,8 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
> run->exit_reason = KVM_EXIT_INTR;
> }
>
> - if (ret <= 0 || need_new_vmid_gen(vcpu->kvm)) {
> + if (ret <= 0 || need_new_vmid_gen(vcpu->kvm) ||
> + vcpu->arch.pause) {
> local_irq_enable();
> preempt_enable();
> kvm_vgic_sync_hwstate(vcpu);
> diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h
> index 009da6b..69e3785 100644
> --- a/arch/arm64/include/asm/kvm_host.h
> +++ b/arch/arm64/include/asm/kvm_host.h
> @@ -125,6 +125,9 @@ struct kvm_vcpu_arch {
> /* vcpu power-off state */
> bool power_off;
>
> + /* Don't run the guest */
> + bool pause;
> +
> /* IO related fields */
> struct kvm_decode mmio_decode;
>
>
next prev parent reply other threads:[~2015-07-03 11:55 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-02 13:17 [RFC 00/17] ARM IRQ forward control based on IRQ bypass manager Eric Auger
2015-07-02 13:17 ` [RFC 01/17] VFIO: platform: test forwarded state when selecting IRQ handler Eric Auger
2015-07-02 13:17 ` [RFC 02/17] VFIO: platform: single handler using function pointer Eric Auger
2015-07-02 13:17 ` [RFC 03/17] VFIO: Introduce vfio_device_external_ops Eric Auger
2015-07-02 13:17 ` [RFC 04/17] VFIO: pci: initialize vfio_device_external_ops Eric Auger
2015-07-02 13:17 ` [RFC 05/17] VFIO: platform: implement vfio_device_external_ops callbacks Eric Auger
2015-07-02 13:17 ` [RFC 06/17] VFIO: add vfio_external_{mask|is_active|set_automasked} Eric Auger
2015-07-02 13:17 ` [RFC 07/17] KVM: arm: rename pause into power_off Eric Auger
2015-07-02 13:17 ` [RFC 08/17] kvm: arm/arm64: implement kvm_arm_[halt,resume]_guest Eric Auger
2015-07-03 11:55 ` Eric Auger [this message]
2015-07-03 12:14 ` [RFC 08/17] kvm: arm/arm64: implement kvm_arm_[halt, resume]_guest Marc Zyngier
2015-07-02 13:17 ` [RFC 09/17] bypass: IRQ bypass manager proto by Alex Eric Auger
2015-07-03 2:16 ` Wu, Feng
2015-07-03 5:32 ` Eric Auger
2015-07-02 13:17 ` [RFC 10/17] KVM: arm: select IRQ_BYPASS_MANAGER Eric Auger
2015-07-02 13:17 ` [RFC 11/17] VFIO: platform: " Eric Auger
2015-07-02 13:17 ` [RFC 12/17] irq: bypass: Extend skeleton for ARM forwarding control Eric Auger
2015-07-02 13:40 ` Paolo Bonzini
2015-07-03 2:19 ` Wu, Feng
2015-07-03 2:24 ` Wu, Feng
2015-07-03 6:54 ` Eric Auger
2015-07-03 7:02 ` Paolo Bonzini
2015-07-03 13:12 ` Eric Auger
2015-07-03 17:20 ` Paolo Bonzini
2015-07-03 17:23 ` Eric Auger
2015-07-03 2:43 ` Wu, Feng
2015-07-03 6:52 ` Paolo Bonzini
2015-07-03 7:00 ` Wu, Feng
2015-07-03 7:06 ` Paolo Bonzini
2015-07-03 7:16 ` Wu, Feng
2015-07-03 7:08 ` Paolo Bonzini
2015-07-02 13:17 ` [RFC 13/17] KVM: introduce kvm_arch functions for IRQ bypass Eric Auger
2015-07-02 13:41 ` Paolo Bonzini
2015-07-02 13:17 ` [RFC 14/17] KVM: arm/arm64: vgic: forwarding control Eric Auger
2015-07-02 13:17 ` [RFC 15/17] KVM: arm/arm64: implement IRQ bypass consumer functions Eric Auger
2015-07-02 13:17 ` [RFC 16/17] KVM: eventfd: add irq bypass consumer management Eric Auger
2015-07-02 13:42 ` Paolo Bonzini
2015-07-02 13:53 ` Eric Auger
2015-07-06 7:55 ` Wu, Feng
2015-07-06 11:19 ` Eric Auger
2015-07-06 12:17 ` Wu, Feng
2015-07-02 13:17 ` [RFC 17/17] VFIO: platform: add irq bypass producer management Eric Auger
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=55967848.5050204@linaro.org \
--to=eric.auger@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).