linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: marc.zyngier@arm.com (Marc Zyngier)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 03/15] ARM: KVM: Allow creating the VGIC after VCPUs
Date: Sat, 28 Dec 2013 11:15:35 +0000	[thread overview]
Message-ID: <1388229347-24185-4-git-send-email-marc.zyngier@arm.com> (raw)
In-Reply-To: <1388229347-24185-1-git-send-email-marc.zyngier@arm.com>

From: Christoffer Dall <christoffer.dall@linaro.org>

Rework the VGIC initialization slightly to allow initialization of the
vgic cpu-specific state even if the irqchip (the VGIC) hasn't been
created by user space yet.  This is safe, because the vgic data
structures are already allocated when the CPU is allocated if VGIC
support is compiled into the kernel.  Further, the init process does not
depend on any other information and the sacrifice is a slight
performance degradation for creating VMs in the no-VGIC case.

The reason is that the new device control API doesn't mandate creating
the VGIC before creating the VCPU and it is unreasonable to require user
space to create the VGIC before creating the VCPUs.

At the same time move the irqchip_in_kernel check out of
kvm_vcpu_first_run_init and into the init function to make the per-vcpu
and global init functions symmetric and add comments on the exported
functions making it a bit easier to understand the init flow by only
looking at vgic.c.

Acked-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
---
 arch/arm/kvm/arm.c  |  7 ++++---
 virt/kvm/arm/vgic.c | 22 +++++++++++++++++++---
 2 files changed, 23 insertions(+), 6 deletions(-)

diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
index 13205bd..c9fe9d7 100644
--- a/arch/arm/kvm/arm.c
+++ b/arch/arm/kvm/arm.c
@@ -464,6 +464,8 @@ static void update_vttbr(struct kvm *kvm)
 
 static int kvm_vcpu_first_run_init(struct kvm_vcpu *vcpu)
 {
+	int ret;
+
 	if (likely(vcpu->arch.has_run_once))
 		return 0;
 
@@ -473,9 +475,8 @@ static int kvm_vcpu_first_run_init(struct kvm_vcpu *vcpu)
 	 * Initialize the VGIC before running a vcpu the first time on
 	 * this VM.
 	 */
-	if (irqchip_in_kernel(vcpu->kvm) &&
-	    unlikely(!vgic_initialized(vcpu->kvm))) {
-		int ret = kvm_vgic_init(vcpu->kvm);
+	if (unlikely(!vgic_initialized(vcpu->kvm))) {
+		ret = kvm_vgic_init(vcpu->kvm);
 		if (ret)
 			return ret;
 	}
diff --git a/virt/kvm/arm/vgic.c b/virt/kvm/arm/vgic.c
index 81e9481..5e9df47 100644
--- a/virt/kvm/arm/vgic.c
+++ b/virt/kvm/arm/vgic.c
@@ -1243,15 +1243,19 @@ static irqreturn_t vgic_maintenance_handler(int irq, void *data)
 	return IRQ_HANDLED;
 }
 
+/**
+ * kvm_vgic_vcpu_init - Initialize per-vcpu VGIC state
+ * @vcpu: pointer to the vcpu struct
+ *
+ * Initialize the vgic_cpu struct and vgic_dist struct fields pertaining to
+ * this vcpu and enable the VGIC for this VCPU
+ */
 int kvm_vgic_vcpu_init(struct kvm_vcpu *vcpu)
 {
 	struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu;
 	struct vgic_dist *dist = &vcpu->kvm->arch.vgic;
 	int i;
 
-	if (!irqchip_in_kernel(vcpu->kvm))
-		return 0;
-
 	if (vcpu->vcpu_id >= VGIC_MAX_CPUS)
 		return -EBUSY;
 
@@ -1383,10 +1387,22 @@ out:
 	return ret;
 }
 
+/**
+ * kvm_vgic_init - Initialize global VGIC state before running any VCPUs
+ * @kvm: pointer to the kvm struct
+ *
+ * Map the virtual CPU interface into the VM before running any VCPUs.  We
+ * can't do this at creation time, because user space must first set the
+ * virtual CPU interface address in the guest physical address space.  Also
+ * initialize the ITARGETSRn regs to 0 on the emulated distributor.
+ */
 int kvm_vgic_init(struct kvm *kvm)
 {
 	int ret = 0, i;
 
+	if (!irqchip_in_kernel(kvm))
+		return 0;
+
 	mutex_lock(&kvm->lock);
 
 	if (vgic_initialized(kvm))
-- 
1.8.5.1

  parent reply	other threads:[~2013-12-28 11:15 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-12-28 11:15 [PULL 00/15] KVM/{arm,arm64} updates for 3.14 Marc Zyngier
2013-12-28 11:15 ` [PATCH 01/15] arm/arm64: KVM: arch_timer: Initialize cntvoff at kvm_init Marc Zyngier
2013-12-28 11:15 ` [PATCH 02/15] ARM/KVM: save and restore generic timer registers Marc Zyngier
2013-12-28 11:15 ` Marc Zyngier [this message]
2013-12-28 11:15 ` [PATCH 04/15] KVM: arm-vgic: Support KVM_CREATE_DEVICE for VGIC Marc Zyngier
2013-12-28 11:15 ` [PATCH 05/15] KVM: arm-vgic: Set base addr through device API Marc Zyngier
2013-12-28 11:15 ` [PATCH 06/15] irqchip: arm-gic: Define additional MMIO offsets and masks Marc Zyngier
2013-12-28 11:15 ` [PATCH 07/15] KVM: arm-vgic: Make vgic mmio functions more generic Marc Zyngier
2013-12-28 11:15 ` [PATCH 08/15] arm/arm64: kvm: Set vcpu->cpu to -1 on vcpu_put Marc Zyngier
2013-12-28 11:15 ` [PATCH 09/15] KVM: arm-vgic: Add vgic reg access from dev attr Marc Zyngier
2013-12-28 11:15 ` [PATCH 10/15] KVM: arm-vgic: Support unqueueing of LRs to the dist Marc Zyngier
2013-12-28 11:15 ` [PATCH 11/15] KVM: arm-vgic: Add GICD_SPENDSGIR and GICD_CPENDSGIR handlers Marc Zyngier
2013-12-28 11:15 ` [PATCH 12/15] KVM: arm-vgic: Support CPU interface reg access Marc Zyngier
2013-12-28 11:15 ` [PATCH 13/15] arm64: KVM: Add Kconfig option for max VCPUs per-Guest Marc Zyngier
2013-12-28 11:15 ` [PATCH 14/15] arm64: KVM: Support X-Gene guest VCPU on APM X-Gene host Marc Zyngier
2013-12-28 11:15 ` [PATCH 15/15] arm64: KVM: Force undefined exception for Guest SMC intructions Marc Zyngier
2013-12-31 19:25 ` [PULL 00/15] KVM/{arm,arm64} updates for 3.14 Marcelo Tosatti

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=1388229347-24185-4-git-send-email-marc.zyngier@arm.com \
    --to=marc.zyngier@arm.com \
    --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).