From: christoffer.dall@linaro.org (Christoffer Dall)
To: linux-arm-kernel@lists.infradead.org
Subject: [GIT PULL 11/12] arm/arm64: KVM: Initialize the vgic on-demand when injecting IRQs
Date: Mon, 15 Dec 2014 12:41:58 +0100 [thread overview]
Message-ID: <1418643719-25966-12-git-send-email-christoffer.dall@linaro.org> (raw)
In-Reply-To: <1418643719-25966-1-git-send-email-christoffer.dall@linaro.org>
Userspace assumes that it can wire up IRQ injections after having
created all VCPUs and after having created the VGIC, but potentially
before starting the first VCPU. This can currently lead to lost IRQs
because the state of that IRQ injection is not stored anywhere and we
don't return an error to userspace.
We haven't seen this problem manifest itself yet, presumably because
guests reset the devices on boot, but this could cause issues with
migration and other non-standard startup configurations.
Reviewed-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
---
virt/kvm/arm/vgic.c | 22 ++++++++++++++++------
1 file changed, 16 insertions(+), 6 deletions(-)
diff --git a/virt/kvm/arm/vgic.c b/virt/kvm/arm/vgic.c
index d862ea5..e373b76 100644
--- a/virt/kvm/arm/vgic.c
+++ b/virt/kvm/arm/vgic.c
@@ -1694,16 +1694,26 @@ out:
int kvm_vgic_inject_irq(struct kvm *kvm, int cpuid, unsigned int irq_num,
bool level)
{
+ int ret = 0;
int vcpu_id;
- if (likely(vgic_ready(kvm))) {
- vcpu_id = vgic_update_irq_pending(kvm, cpuid, irq_num, level);
- if (vcpu_id >= 0)
- /* kick the specified vcpu */
- kvm_vcpu_kick(kvm_get_vcpu(kvm, vcpu_id));
+ if (unlikely(!vgic_initialized(kvm))) {
+ mutex_lock(&kvm->lock);
+ ret = vgic_init(kvm);
+ mutex_unlock(&kvm->lock);
+
+ if (ret)
+ goto out;
}
- return 0;
+ vcpu_id = vgic_update_irq_pending(kvm, cpuid, irq_num, level);
+ if (vcpu_id >= 0) {
+ /* kick the specified vcpu */
+ kvm_vcpu_kick(kvm_get_vcpu(kvm, vcpu_id));
+ }
+
+out:
+ return ret;
}
static irqreturn_t vgic_maintenance_handler(int irq, void *data)
--
2.1.2.330.g565301e.dirty
next prev parent reply other threads:[~2014-12-15 11:41 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-15 11:41 [GIT PULL 00/12] KVM/ARM Changes for v3.19 - Take 2 Christoffer Dall
2014-12-15 11:41 ` [GIT PULL 01/12] arm/arm64: KVM: Don't clear the VCPU_POWER_OFF flag Christoffer Dall
2014-12-15 11:41 ` [GIT PULL 02/12] arm/arm64: KVM: Correct KVM_ARM_VCPU_INIT power off option Christoffer Dall
2014-12-15 11:41 ` [GIT PULL 03/12] arm/arm64: KVM: Reset the HCR on each vcpu when resetting the vcpu Christoffer Dall
2014-12-15 11:41 ` [GIT PULL 04/12] arm/arm64: KVM: Clarify KVM_ARM_VCPU_INIT ABI Christoffer Dall
2014-12-15 11:41 ` [GIT PULL 05/12] arm/arm64: KVM: Turn off vcpus on PSCI shutdown/reboot Christoffer Dall
2014-12-15 11:41 ` [GIT PULL 06/12] arm/arm64: KVM: Introduce stage2_unmap_vm Christoffer Dall
2014-12-15 11:41 ` [GIT PULL 07/12] arm/arm64: KVM: vgic: move reset initialization into vgic_init_maps() Christoffer Dall
2014-12-15 11:41 ` [GIT PULL 08/12] arm/arm64: KVM: Rename vgic_initialized to vgic_ready Christoffer Dall
2014-12-15 11:41 ` [GIT PULL 09/12] arm/arm64: KVM: Add (new) vgic_initialized macro Christoffer Dall
2014-12-15 11:41 ` [GIT PULL 10/12] arm/arm64: KVM: Don't allow creating VCPUs after vgic_initialized Christoffer Dall
2014-12-15 11:41 ` Christoffer Dall [this message]
2014-12-15 11:41 ` [GIT PULL 12/12] arm/arm64: KVM: Require in-kernel vgic for the arch timers Christoffer Dall
2014-12-15 12:08 ` [GIT PULL 00/12] KVM/ARM Changes for v3.19 - Take 2 Paolo Bonzini
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=1418643719-25966-12-git-send-email-christoffer.dall@linaro.org \
--to=christoffer.dall@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).