All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marc Zyngier <marc.zyngier@arm.com>
To: linux-arm-kernel@lists.infradead.org,
	kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org
Cc: Andre Przywara <andre.przywara@arm.com>,
	Christoffer Dall <christoffer.dall@arm.com>,
	Dave Martin <Dave.Martin@arm.com>,
	Jintack Lim <jintack@cs.columbia.edu>,
	Julien Thierry <julien.thierry@arm.com>,
	James Morse <james.morse@arm.com>,
	Suzuki K Poulose <suzuki.poulose@arm.com>
Subject: [PATCH 39/59] KVM: arm64: nv: Move last_vcpu_ran to be per s2 mmu
Date: Fri, 21 Jun 2019 10:38:23 +0100	[thread overview]
Message-ID: <20190621093843.220980-40-marc.zyngier@arm.com> (raw)
In-Reply-To: <20190621093843.220980-1-marc.zyngier@arm.com>

last_vcpu_ran has to be per s2 mmu now that we can have multiple S2
per VM. Let's take this opportunity to perform some cleanup.

Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
---
 arch/arm/include/asm/kvm_host.h   |  6 +++---
 arch/arm/include/asm/kvm_mmu.h    |  2 +-
 arch/arm64/include/asm/kvm_host.h |  6 +++---
 arch/arm64/include/asm/kvm_mmu.h  |  2 +-
 arch/arm64/kvm/nested.c           | 13 ++++++-------
 virt/kvm/arm/arm.c                | 22 ++++------------------
 virt/kvm/arm/mmu.c                | 26 ++++++++++++++++++++------
 7 files changed, 38 insertions(+), 39 deletions(-)

diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm_host.h
index b821eb2383ad..cc761610e41e 100644
--- a/arch/arm/include/asm/kvm_host.h
+++ b/arch/arm/include/asm/kvm_host.h
@@ -63,15 +63,15 @@ struct kvm_s2_mmu {
 	pgd_t *pgd;
 	phys_addr_t pgd_phys;
 
+	/* The last vcpu id that ran on each physical CPU */
+	int __percpu *last_vcpu_ran;
+
 	struct kvm *kvm;
 };
 
 struct kvm_arch {
 	struct kvm_s2_mmu mmu;
 
-	/* The last vcpu id that ran on each physical CPU */
-	int __percpu *last_vcpu_ran;
-
 	/* Stage-2 page table */
 	pgd_t *pgd;
 	phys_addr_t pgd_phys;
diff --git a/arch/arm/include/asm/kvm_mmu.h b/arch/arm/include/asm/kvm_mmu.h
index afabf1fd1d17..7a6e9008ed45 100644
--- a/arch/arm/include/asm/kvm_mmu.h
+++ b/arch/arm/include/asm/kvm_mmu.h
@@ -52,7 +52,7 @@ int create_hyp_exec_mappings(phys_addr_t phys_addr, size_t size,
 void free_hyp_pgds(void);
 
 void stage2_unmap_vm(struct kvm *kvm);
-int kvm_alloc_stage2_pgd(struct kvm_s2_mmu *mmu);
+int kvm_init_stage2_mmu(struct kvm *kvm, struct kvm_s2_mmu *mmu);
 void kvm_free_stage2_pgd(struct kvm_s2_mmu *mmu);
 int kvm_phys_addr_ioremap(struct kvm *kvm, phys_addr_t guest_ipa,
 			  phys_addr_t pa, unsigned long size, bool writable);
diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h
index cc238de170d2..b71a7a237f95 100644
--- a/arch/arm64/include/asm/kvm_host.h
+++ b/arch/arm64/include/asm/kvm_host.h
@@ -104,6 +104,9 @@ struct kvm_s2_mmu {
 	 * >0: Somebody is actively using this.
 	 */
 	atomic_t refcnt;
+
+	/* The last vcpu id that ran on each physical CPU */
+	int __percpu *last_vcpu_ran;
 };
 
 static inline bool kvm_s2_mmu_valid(struct kvm_s2_mmu *mmu)
@@ -124,9 +127,6 @@ struct kvm_arch {
 	/* VTCR_EL2 value for this VM */
 	u64    vtcr;
 
-	/* The last vcpu id that ran on each physical CPU */
-	int __percpu *last_vcpu_ran;
-
 	/* The maximum number of vCPUs depends on the used GIC model */
 	int max_vcpus;
 
diff --git a/arch/arm64/include/asm/kvm_mmu.h b/arch/arm64/include/asm/kvm_mmu.h
index f4c5ac5eb95f..53103607065a 100644
--- a/arch/arm64/include/asm/kvm_mmu.h
+++ b/arch/arm64/include/asm/kvm_mmu.h
@@ -169,7 +169,7 @@ void free_hyp_pgds(void);
 
 void kvm_unmap_stage2_range(struct kvm_s2_mmu *mmu, phys_addr_t start, u64 size);
 void stage2_unmap_vm(struct kvm *kvm);
-int kvm_alloc_stage2_pgd(struct kvm_s2_mmu *mmu);
+int kvm_init_stage2_mmu(struct kvm *kvm, struct kvm_s2_mmu *mmu);
 void kvm_free_stage2_pgd(struct kvm_s2_mmu *mmu);
 int kvm_phys_addr_ioremap(struct kvm *kvm, phys_addr_t guest_ipa,
 			  phys_addr_t pa, unsigned long size, bool writable);
diff --git a/arch/arm64/kvm/nested.c b/arch/arm64/kvm/nested.c
index 8880033fb6e0..09afafbdc8fe 100644
--- a/arch/arm64/kvm/nested.c
+++ b/arch/arm64/kvm/nested.c
@@ -52,18 +52,17 @@ int kvm_vcpu_init_nested(struct kvm_vcpu *vcpu)
 			 GFP_KERNEL | __GFP_ZERO);
 
 	if (tmp) {
-		if (tmp != kvm->arch.nested_mmus)
+		if (tmp != kvm->arch.nested_mmus) {
 			kfree(kvm->arch.nested_mmus);
+			kvm->arch.nested_mmus = NULL;
+			kvm->arch.nested_mmus_size = 0;
+		}
 
-		tmp[num_mmus - 1].kvm = kvm;
-		atomic_set(&tmp[num_mmus - 1].refcnt, 0);
-		ret = kvm_alloc_stage2_pgd(&tmp[num_mmus - 1]);
+		ret = kvm_init_stage2_mmu(kvm, &tmp[num_mmus - 1]);
 		if (ret)
 			goto out;
 
-		tmp[num_mmus - 2].kvm = kvm;
-		atomic_set(&tmp[num_mmus - 2].refcnt, 0);
-		ret = kvm_alloc_stage2_pgd(&tmp[num_mmus - 2]);
+		ret = kvm_init_stage2_mmu(kvm, &tmp[num_mmus - 2]);
 		if (ret) {
 			kvm_free_stage2_pgd(&tmp[num_mmus - 1]);
 			goto out;
diff --git a/virt/kvm/arm/arm.c b/virt/kvm/arm/arm.c
index bcca27d5c481..e8b584b79847 100644
--- a/virt/kvm/arm/arm.c
+++ b/virt/kvm/arm/arm.c
@@ -99,29 +99,21 @@ void kvm_arch_check_processor_compat(void *rtn)
 	*(int *)rtn = 0;
 }
 
-
 /**
  * kvm_arch_init_vm - initializes a VM data structure
  * @kvm:	pointer to the KVM struct
  */
 int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
 {
-	int ret, cpu;
+	int ret;
 
 	ret = kvm_arm_setup_stage2(kvm, type);
 	if (ret)
 		return ret;
 
-	kvm->arch.last_vcpu_ran = alloc_percpu(typeof(*kvm->arch.last_vcpu_ran));
-	if (!kvm->arch.last_vcpu_ran)
-		return -ENOMEM;
-
-	for_each_possible_cpu(cpu)
-		*per_cpu_ptr(kvm->arch.last_vcpu_ran, cpu) = -1;
-
-	ret = kvm_alloc_stage2_pgd(&kvm->arch.mmu);
+	ret = kvm_init_stage2_mmu(kvm, &kvm->arch.mmu);
 	if (ret)
-		goto out_fail_alloc;
+		return ret;
 
 	/* Mark the initial VMID generation invalid */
 	kvm->arch.mmu.vmid.vmid_gen = 0;
@@ -142,9 +134,6 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
 	return ret;
 out_free_stage2_pgd:
 	kvm_free_stage2_pgd(&kvm->arch.mmu);
-out_fail_alloc:
-	free_percpu(kvm->arch.last_vcpu_ran);
-	kvm->arch.last_vcpu_ran = NULL;
 	return ret;
 }
 
@@ -174,9 +163,6 @@ void kvm_arch_destroy_vm(struct kvm *kvm)
 
 	kvm_vgic_destroy(kvm);
 
-	free_percpu(kvm->arch.last_vcpu_ran);
-	kvm->arch.last_vcpu_ran = NULL;
-
 	for (i = 0; i < KVM_MAX_VCPUS; ++i) {
 		if (kvm->vcpus[i]) {
 			kvm_arch_vcpu_free(kvm->vcpus[i]);
@@ -359,7 +345,7 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
 	if (nested_virt_in_use(vcpu))
 		kvm_vcpu_load_hw_mmu(vcpu);
 
-	last_ran = this_cpu_ptr(vcpu->kvm->arch.last_vcpu_ran);
+	last_ran = this_cpu_ptr(vcpu->arch.hw_mmu->last_vcpu_ran);
 	cpu_data = this_cpu_ptr(&kvm_host_data);
 
 	/*
diff --git a/virt/kvm/arm/mmu.c b/virt/kvm/arm/mmu.c
index 94d400e7af57..6a7cba077bce 100644
--- a/virt/kvm/arm/mmu.c
+++ b/virt/kvm/arm/mmu.c
@@ -903,8 +903,9 @@ int create_hyp_exec_mappings(phys_addr_t phys_addr, size_t size,
 }
 
 /**
- * kvm_alloc_stage2_pgd - allocate level-1 table for stage-2 translation.
- * @mmu:	The stage 2 mmu struct pointer
+ * kvm_init_stage2_mmu - Initialise a S2 MMU strucrure
+ * @kvm:	The pointer to the KVM structure
+ * @mmu:	The pointer to the s2 MMU structure
  *
  * Allocates only the stage-2 HW PGD level table(s) of size defined by
  * stage2_pgd_size(mmu->kvm).
@@ -912,10 +913,11 @@ int create_hyp_exec_mappings(phys_addr_t phys_addr, size_t size,
  * Note we don't need locking here as this is only called when the VM is
  * created, which can only be done once.
  */
-int kvm_alloc_stage2_pgd(struct kvm_s2_mmu *mmu)
+int kvm_init_stage2_mmu(struct kvm *kvm, struct kvm_s2_mmu *mmu)
 {
 	phys_addr_t pgd_phys;
 	pgd_t *pgd;
+	int cpu;
 
 	if (mmu->pgd != NULL) {
 		kvm_err("kvm_arch already initialized?\n");
@@ -923,18 +925,28 @@ int kvm_alloc_stage2_pgd(struct kvm_s2_mmu *mmu)
 	}
 
 	/* Allocate the HW PGD, making sure that each page gets its own refcount */
-	pgd = alloc_pages_exact(stage2_pgd_size(mmu->kvm), GFP_KERNEL | __GFP_ZERO);
+	pgd = alloc_pages_exact(stage2_pgd_size(kvm), GFP_KERNEL | __GFP_ZERO);
 	if (!pgd)
 		return -ENOMEM;
 
 	pgd_phys = virt_to_phys(pgd);
-	if (WARN_ON(pgd_phys & ~kvm_vttbr_baddr_mask(mmu->kvm)))
+	if (WARN_ON(pgd_phys & ~kvm_vttbr_baddr_mask(kvm)))
 		return -EINVAL;
 
+	mmu->last_vcpu_ran = alloc_percpu(typeof(*mmu->last_vcpu_ran));
+	if (!mmu->last_vcpu_ran) {
+		free_pages_exact(pgd, stage2_pgd_size(kvm));
+		return -ENOMEM;
+	}
+
+	mmu->kvm = kvm;
 	mmu->pgd = pgd;
 	mmu->pgd_phys = pgd_phys;
 	mmu->vmid.vmid_gen = 0;
 
+	for_each_possible_cpu(cpu)
+		*per_cpu_ptr(mmu->last_vcpu_ran, cpu) = -1;
+
 	kvm_init_s2_mmu(mmu);
 
 	return 0;
@@ -1021,8 +1033,10 @@ void kvm_free_stage2_pgd(struct kvm_s2_mmu *mmu)
 	spin_unlock(&kvm->mmu_lock);
 
 	/* Free the HW pgd, one page at a time */
-	if (pgd)
+	if (pgd) {
 		free_pages_exact(pgd, stage2_pgd_size(kvm));
+		free_percpu(mmu->last_vcpu_ran);
+	}
 }
 
 static pud_t *stage2_get_pud(struct kvm_s2_mmu *mmu, struct kvm_mmu_memory_cache *cache,
-- 
2.20.1


WARNING: multiple messages have this Message-ID (diff)
From: Marc Zyngier <marc.zyngier@arm.com>
To: linux-arm-kernel@lists.infradead.org,
	kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org
Cc: Andre Przywara <andre.przywara@arm.com>,
	Dave Martin <Dave.Martin@arm.com>
Subject: [PATCH 39/59] KVM: arm64: nv: Move last_vcpu_ran to be per s2 mmu
Date: Fri, 21 Jun 2019 10:38:23 +0100	[thread overview]
Message-ID: <20190621093843.220980-40-marc.zyngier@arm.com> (raw)
In-Reply-To: <20190621093843.220980-1-marc.zyngier@arm.com>

last_vcpu_ran has to be per s2 mmu now that we can have multiple S2
per VM. Let's take this opportunity to perform some cleanup.

Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
---
 arch/arm/include/asm/kvm_host.h   |  6 +++---
 arch/arm/include/asm/kvm_mmu.h    |  2 +-
 arch/arm64/include/asm/kvm_host.h |  6 +++---
 arch/arm64/include/asm/kvm_mmu.h  |  2 +-
 arch/arm64/kvm/nested.c           | 13 ++++++-------
 virt/kvm/arm/arm.c                | 22 ++++------------------
 virt/kvm/arm/mmu.c                | 26 ++++++++++++++++++++------
 7 files changed, 38 insertions(+), 39 deletions(-)

diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm_host.h
index b821eb2383ad..cc761610e41e 100644
--- a/arch/arm/include/asm/kvm_host.h
+++ b/arch/arm/include/asm/kvm_host.h
@@ -63,15 +63,15 @@ struct kvm_s2_mmu {
 	pgd_t *pgd;
 	phys_addr_t pgd_phys;
 
+	/* The last vcpu id that ran on each physical CPU */
+	int __percpu *last_vcpu_ran;
+
 	struct kvm *kvm;
 };
 
 struct kvm_arch {
 	struct kvm_s2_mmu mmu;
 
-	/* The last vcpu id that ran on each physical CPU */
-	int __percpu *last_vcpu_ran;
-
 	/* Stage-2 page table */
 	pgd_t *pgd;
 	phys_addr_t pgd_phys;
diff --git a/arch/arm/include/asm/kvm_mmu.h b/arch/arm/include/asm/kvm_mmu.h
index afabf1fd1d17..7a6e9008ed45 100644
--- a/arch/arm/include/asm/kvm_mmu.h
+++ b/arch/arm/include/asm/kvm_mmu.h
@@ -52,7 +52,7 @@ int create_hyp_exec_mappings(phys_addr_t phys_addr, size_t size,
 void free_hyp_pgds(void);
 
 void stage2_unmap_vm(struct kvm *kvm);
-int kvm_alloc_stage2_pgd(struct kvm_s2_mmu *mmu);
+int kvm_init_stage2_mmu(struct kvm *kvm, struct kvm_s2_mmu *mmu);
 void kvm_free_stage2_pgd(struct kvm_s2_mmu *mmu);
 int kvm_phys_addr_ioremap(struct kvm *kvm, phys_addr_t guest_ipa,
 			  phys_addr_t pa, unsigned long size, bool writable);
diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h
index cc238de170d2..b71a7a237f95 100644
--- a/arch/arm64/include/asm/kvm_host.h
+++ b/arch/arm64/include/asm/kvm_host.h
@@ -104,6 +104,9 @@ struct kvm_s2_mmu {
 	 * >0: Somebody is actively using this.
 	 */
 	atomic_t refcnt;
+
+	/* The last vcpu id that ran on each physical CPU */
+	int __percpu *last_vcpu_ran;
 };
 
 static inline bool kvm_s2_mmu_valid(struct kvm_s2_mmu *mmu)
@@ -124,9 +127,6 @@ struct kvm_arch {
 	/* VTCR_EL2 value for this VM */
 	u64    vtcr;
 
-	/* The last vcpu id that ran on each physical CPU */
-	int __percpu *last_vcpu_ran;
-
 	/* The maximum number of vCPUs depends on the used GIC model */
 	int max_vcpus;
 
diff --git a/arch/arm64/include/asm/kvm_mmu.h b/arch/arm64/include/asm/kvm_mmu.h
index f4c5ac5eb95f..53103607065a 100644
--- a/arch/arm64/include/asm/kvm_mmu.h
+++ b/arch/arm64/include/asm/kvm_mmu.h
@@ -169,7 +169,7 @@ void free_hyp_pgds(void);
 
 void kvm_unmap_stage2_range(struct kvm_s2_mmu *mmu, phys_addr_t start, u64 size);
 void stage2_unmap_vm(struct kvm *kvm);
-int kvm_alloc_stage2_pgd(struct kvm_s2_mmu *mmu);
+int kvm_init_stage2_mmu(struct kvm *kvm, struct kvm_s2_mmu *mmu);
 void kvm_free_stage2_pgd(struct kvm_s2_mmu *mmu);
 int kvm_phys_addr_ioremap(struct kvm *kvm, phys_addr_t guest_ipa,
 			  phys_addr_t pa, unsigned long size, bool writable);
diff --git a/arch/arm64/kvm/nested.c b/arch/arm64/kvm/nested.c
index 8880033fb6e0..09afafbdc8fe 100644
--- a/arch/arm64/kvm/nested.c
+++ b/arch/arm64/kvm/nested.c
@@ -52,18 +52,17 @@ int kvm_vcpu_init_nested(struct kvm_vcpu *vcpu)
 			 GFP_KERNEL | __GFP_ZERO);
 
 	if (tmp) {
-		if (tmp != kvm->arch.nested_mmus)
+		if (tmp != kvm->arch.nested_mmus) {
 			kfree(kvm->arch.nested_mmus);
+			kvm->arch.nested_mmus = NULL;
+			kvm->arch.nested_mmus_size = 0;
+		}
 
-		tmp[num_mmus - 1].kvm = kvm;
-		atomic_set(&tmp[num_mmus - 1].refcnt, 0);
-		ret = kvm_alloc_stage2_pgd(&tmp[num_mmus - 1]);
+		ret = kvm_init_stage2_mmu(kvm, &tmp[num_mmus - 1]);
 		if (ret)
 			goto out;
 
-		tmp[num_mmus - 2].kvm = kvm;
-		atomic_set(&tmp[num_mmus - 2].refcnt, 0);
-		ret = kvm_alloc_stage2_pgd(&tmp[num_mmus - 2]);
+		ret = kvm_init_stage2_mmu(kvm, &tmp[num_mmus - 2]);
 		if (ret) {
 			kvm_free_stage2_pgd(&tmp[num_mmus - 1]);
 			goto out;
diff --git a/virt/kvm/arm/arm.c b/virt/kvm/arm/arm.c
index bcca27d5c481..e8b584b79847 100644
--- a/virt/kvm/arm/arm.c
+++ b/virt/kvm/arm/arm.c
@@ -99,29 +99,21 @@ void kvm_arch_check_processor_compat(void *rtn)
 	*(int *)rtn = 0;
 }
 
-
 /**
  * kvm_arch_init_vm - initializes a VM data structure
  * @kvm:	pointer to the KVM struct
  */
 int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
 {
-	int ret, cpu;
+	int ret;
 
 	ret = kvm_arm_setup_stage2(kvm, type);
 	if (ret)
 		return ret;
 
-	kvm->arch.last_vcpu_ran = alloc_percpu(typeof(*kvm->arch.last_vcpu_ran));
-	if (!kvm->arch.last_vcpu_ran)
-		return -ENOMEM;
-
-	for_each_possible_cpu(cpu)
-		*per_cpu_ptr(kvm->arch.last_vcpu_ran, cpu) = -1;
-
-	ret = kvm_alloc_stage2_pgd(&kvm->arch.mmu);
+	ret = kvm_init_stage2_mmu(kvm, &kvm->arch.mmu);
 	if (ret)
-		goto out_fail_alloc;
+		return ret;
 
 	/* Mark the initial VMID generation invalid */
 	kvm->arch.mmu.vmid.vmid_gen = 0;
@@ -142,9 +134,6 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
 	return ret;
 out_free_stage2_pgd:
 	kvm_free_stage2_pgd(&kvm->arch.mmu);
-out_fail_alloc:
-	free_percpu(kvm->arch.last_vcpu_ran);
-	kvm->arch.last_vcpu_ran = NULL;
 	return ret;
 }
 
@@ -174,9 +163,6 @@ void kvm_arch_destroy_vm(struct kvm *kvm)
 
 	kvm_vgic_destroy(kvm);
 
-	free_percpu(kvm->arch.last_vcpu_ran);
-	kvm->arch.last_vcpu_ran = NULL;
-
 	for (i = 0; i < KVM_MAX_VCPUS; ++i) {
 		if (kvm->vcpus[i]) {
 			kvm_arch_vcpu_free(kvm->vcpus[i]);
@@ -359,7 +345,7 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
 	if (nested_virt_in_use(vcpu))
 		kvm_vcpu_load_hw_mmu(vcpu);
 
-	last_ran = this_cpu_ptr(vcpu->kvm->arch.last_vcpu_ran);
+	last_ran = this_cpu_ptr(vcpu->arch.hw_mmu->last_vcpu_ran);
 	cpu_data = this_cpu_ptr(&kvm_host_data);
 
 	/*
diff --git a/virt/kvm/arm/mmu.c b/virt/kvm/arm/mmu.c
index 94d400e7af57..6a7cba077bce 100644
--- a/virt/kvm/arm/mmu.c
+++ b/virt/kvm/arm/mmu.c
@@ -903,8 +903,9 @@ int create_hyp_exec_mappings(phys_addr_t phys_addr, size_t size,
 }
 
 /**
- * kvm_alloc_stage2_pgd - allocate level-1 table for stage-2 translation.
- * @mmu:	The stage 2 mmu struct pointer
+ * kvm_init_stage2_mmu - Initialise a S2 MMU strucrure
+ * @kvm:	The pointer to the KVM structure
+ * @mmu:	The pointer to the s2 MMU structure
  *
  * Allocates only the stage-2 HW PGD level table(s) of size defined by
  * stage2_pgd_size(mmu->kvm).
@@ -912,10 +913,11 @@ int create_hyp_exec_mappings(phys_addr_t phys_addr, size_t size,
  * Note we don't need locking here as this is only called when the VM is
  * created, which can only be done once.
  */
-int kvm_alloc_stage2_pgd(struct kvm_s2_mmu *mmu)
+int kvm_init_stage2_mmu(struct kvm *kvm, struct kvm_s2_mmu *mmu)
 {
 	phys_addr_t pgd_phys;
 	pgd_t *pgd;
+	int cpu;
 
 	if (mmu->pgd != NULL) {
 		kvm_err("kvm_arch already initialized?\n");
@@ -923,18 +925,28 @@ int kvm_alloc_stage2_pgd(struct kvm_s2_mmu *mmu)
 	}
 
 	/* Allocate the HW PGD, making sure that each page gets its own refcount */
-	pgd = alloc_pages_exact(stage2_pgd_size(mmu->kvm), GFP_KERNEL | __GFP_ZERO);
+	pgd = alloc_pages_exact(stage2_pgd_size(kvm), GFP_KERNEL | __GFP_ZERO);
 	if (!pgd)
 		return -ENOMEM;
 
 	pgd_phys = virt_to_phys(pgd);
-	if (WARN_ON(pgd_phys & ~kvm_vttbr_baddr_mask(mmu->kvm)))
+	if (WARN_ON(pgd_phys & ~kvm_vttbr_baddr_mask(kvm)))
 		return -EINVAL;
 
+	mmu->last_vcpu_ran = alloc_percpu(typeof(*mmu->last_vcpu_ran));
+	if (!mmu->last_vcpu_ran) {
+		free_pages_exact(pgd, stage2_pgd_size(kvm));
+		return -ENOMEM;
+	}
+
+	mmu->kvm = kvm;
 	mmu->pgd = pgd;
 	mmu->pgd_phys = pgd_phys;
 	mmu->vmid.vmid_gen = 0;
 
+	for_each_possible_cpu(cpu)
+		*per_cpu_ptr(mmu->last_vcpu_ran, cpu) = -1;
+
 	kvm_init_s2_mmu(mmu);
 
 	return 0;
@@ -1021,8 +1033,10 @@ void kvm_free_stage2_pgd(struct kvm_s2_mmu *mmu)
 	spin_unlock(&kvm->mmu_lock);
 
 	/* Free the HW pgd, one page at a time */
-	if (pgd)
+	if (pgd) {
 		free_pages_exact(pgd, stage2_pgd_size(kvm));
+		free_percpu(mmu->last_vcpu_ran);
+	}
 }
 
 static pud_t *stage2_get_pud(struct kvm_s2_mmu *mmu, struct kvm_mmu_memory_cache *cache,
-- 
2.20.1

_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

WARNING: multiple messages have this Message-ID (diff)
From: Marc Zyngier <marc.zyngier@arm.com>
To: linux-arm-kernel@lists.infradead.org,
	kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org
Cc: Julien Thierry <julien.thierry@arm.com>,
	Andre Przywara <andre.przywara@arm.com>,
	Suzuki K Poulose <suzuki.poulose@arm.com>,
	Christoffer Dall <christoffer.dall@arm.com>,
	Dave Martin <Dave.Martin@arm.com>,
	James Morse <james.morse@arm.com>,
	Jintack Lim <jintack@cs.columbia.edu>
Subject: [PATCH 39/59] KVM: arm64: nv: Move last_vcpu_ran to be per s2 mmu
Date: Fri, 21 Jun 2019 10:38:23 +0100	[thread overview]
Message-ID: <20190621093843.220980-40-marc.zyngier@arm.com> (raw)
In-Reply-To: <20190621093843.220980-1-marc.zyngier@arm.com>

last_vcpu_ran has to be per s2 mmu now that we can have multiple S2
per VM. Let's take this opportunity to perform some cleanup.

Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
---
 arch/arm/include/asm/kvm_host.h   |  6 +++---
 arch/arm/include/asm/kvm_mmu.h    |  2 +-
 arch/arm64/include/asm/kvm_host.h |  6 +++---
 arch/arm64/include/asm/kvm_mmu.h  |  2 +-
 arch/arm64/kvm/nested.c           | 13 ++++++-------
 virt/kvm/arm/arm.c                | 22 ++++------------------
 virt/kvm/arm/mmu.c                | 26 ++++++++++++++++++++------
 7 files changed, 38 insertions(+), 39 deletions(-)

diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm_host.h
index b821eb2383ad..cc761610e41e 100644
--- a/arch/arm/include/asm/kvm_host.h
+++ b/arch/arm/include/asm/kvm_host.h
@@ -63,15 +63,15 @@ struct kvm_s2_mmu {
 	pgd_t *pgd;
 	phys_addr_t pgd_phys;
 
+	/* The last vcpu id that ran on each physical CPU */
+	int __percpu *last_vcpu_ran;
+
 	struct kvm *kvm;
 };
 
 struct kvm_arch {
 	struct kvm_s2_mmu mmu;
 
-	/* The last vcpu id that ran on each physical CPU */
-	int __percpu *last_vcpu_ran;
-
 	/* Stage-2 page table */
 	pgd_t *pgd;
 	phys_addr_t pgd_phys;
diff --git a/arch/arm/include/asm/kvm_mmu.h b/arch/arm/include/asm/kvm_mmu.h
index afabf1fd1d17..7a6e9008ed45 100644
--- a/arch/arm/include/asm/kvm_mmu.h
+++ b/arch/arm/include/asm/kvm_mmu.h
@@ -52,7 +52,7 @@ int create_hyp_exec_mappings(phys_addr_t phys_addr, size_t size,
 void free_hyp_pgds(void);
 
 void stage2_unmap_vm(struct kvm *kvm);
-int kvm_alloc_stage2_pgd(struct kvm_s2_mmu *mmu);
+int kvm_init_stage2_mmu(struct kvm *kvm, struct kvm_s2_mmu *mmu);
 void kvm_free_stage2_pgd(struct kvm_s2_mmu *mmu);
 int kvm_phys_addr_ioremap(struct kvm *kvm, phys_addr_t guest_ipa,
 			  phys_addr_t pa, unsigned long size, bool writable);
diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h
index cc238de170d2..b71a7a237f95 100644
--- a/arch/arm64/include/asm/kvm_host.h
+++ b/arch/arm64/include/asm/kvm_host.h
@@ -104,6 +104,9 @@ struct kvm_s2_mmu {
 	 * >0: Somebody is actively using this.
 	 */
 	atomic_t refcnt;
+
+	/* The last vcpu id that ran on each physical CPU */
+	int __percpu *last_vcpu_ran;
 };
 
 static inline bool kvm_s2_mmu_valid(struct kvm_s2_mmu *mmu)
@@ -124,9 +127,6 @@ struct kvm_arch {
 	/* VTCR_EL2 value for this VM */
 	u64    vtcr;
 
-	/* The last vcpu id that ran on each physical CPU */
-	int __percpu *last_vcpu_ran;
-
 	/* The maximum number of vCPUs depends on the used GIC model */
 	int max_vcpus;
 
diff --git a/arch/arm64/include/asm/kvm_mmu.h b/arch/arm64/include/asm/kvm_mmu.h
index f4c5ac5eb95f..53103607065a 100644
--- a/arch/arm64/include/asm/kvm_mmu.h
+++ b/arch/arm64/include/asm/kvm_mmu.h
@@ -169,7 +169,7 @@ void free_hyp_pgds(void);
 
 void kvm_unmap_stage2_range(struct kvm_s2_mmu *mmu, phys_addr_t start, u64 size);
 void stage2_unmap_vm(struct kvm *kvm);
-int kvm_alloc_stage2_pgd(struct kvm_s2_mmu *mmu);
+int kvm_init_stage2_mmu(struct kvm *kvm, struct kvm_s2_mmu *mmu);
 void kvm_free_stage2_pgd(struct kvm_s2_mmu *mmu);
 int kvm_phys_addr_ioremap(struct kvm *kvm, phys_addr_t guest_ipa,
 			  phys_addr_t pa, unsigned long size, bool writable);
diff --git a/arch/arm64/kvm/nested.c b/arch/arm64/kvm/nested.c
index 8880033fb6e0..09afafbdc8fe 100644
--- a/arch/arm64/kvm/nested.c
+++ b/arch/arm64/kvm/nested.c
@@ -52,18 +52,17 @@ int kvm_vcpu_init_nested(struct kvm_vcpu *vcpu)
 			 GFP_KERNEL | __GFP_ZERO);
 
 	if (tmp) {
-		if (tmp != kvm->arch.nested_mmus)
+		if (tmp != kvm->arch.nested_mmus) {
 			kfree(kvm->arch.nested_mmus);
+			kvm->arch.nested_mmus = NULL;
+			kvm->arch.nested_mmus_size = 0;
+		}
 
-		tmp[num_mmus - 1].kvm = kvm;
-		atomic_set(&tmp[num_mmus - 1].refcnt, 0);
-		ret = kvm_alloc_stage2_pgd(&tmp[num_mmus - 1]);
+		ret = kvm_init_stage2_mmu(kvm, &tmp[num_mmus - 1]);
 		if (ret)
 			goto out;
 
-		tmp[num_mmus - 2].kvm = kvm;
-		atomic_set(&tmp[num_mmus - 2].refcnt, 0);
-		ret = kvm_alloc_stage2_pgd(&tmp[num_mmus - 2]);
+		ret = kvm_init_stage2_mmu(kvm, &tmp[num_mmus - 2]);
 		if (ret) {
 			kvm_free_stage2_pgd(&tmp[num_mmus - 1]);
 			goto out;
diff --git a/virt/kvm/arm/arm.c b/virt/kvm/arm/arm.c
index bcca27d5c481..e8b584b79847 100644
--- a/virt/kvm/arm/arm.c
+++ b/virt/kvm/arm/arm.c
@@ -99,29 +99,21 @@ void kvm_arch_check_processor_compat(void *rtn)
 	*(int *)rtn = 0;
 }
 
-
 /**
  * kvm_arch_init_vm - initializes a VM data structure
  * @kvm:	pointer to the KVM struct
  */
 int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
 {
-	int ret, cpu;
+	int ret;
 
 	ret = kvm_arm_setup_stage2(kvm, type);
 	if (ret)
 		return ret;
 
-	kvm->arch.last_vcpu_ran = alloc_percpu(typeof(*kvm->arch.last_vcpu_ran));
-	if (!kvm->arch.last_vcpu_ran)
-		return -ENOMEM;
-
-	for_each_possible_cpu(cpu)
-		*per_cpu_ptr(kvm->arch.last_vcpu_ran, cpu) = -1;
-
-	ret = kvm_alloc_stage2_pgd(&kvm->arch.mmu);
+	ret = kvm_init_stage2_mmu(kvm, &kvm->arch.mmu);
 	if (ret)
-		goto out_fail_alloc;
+		return ret;
 
 	/* Mark the initial VMID generation invalid */
 	kvm->arch.mmu.vmid.vmid_gen = 0;
@@ -142,9 +134,6 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
 	return ret;
 out_free_stage2_pgd:
 	kvm_free_stage2_pgd(&kvm->arch.mmu);
-out_fail_alloc:
-	free_percpu(kvm->arch.last_vcpu_ran);
-	kvm->arch.last_vcpu_ran = NULL;
 	return ret;
 }
 
@@ -174,9 +163,6 @@ void kvm_arch_destroy_vm(struct kvm *kvm)
 
 	kvm_vgic_destroy(kvm);
 
-	free_percpu(kvm->arch.last_vcpu_ran);
-	kvm->arch.last_vcpu_ran = NULL;
-
 	for (i = 0; i < KVM_MAX_VCPUS; ++i) {
 		if (kvm->vcpus[i]) {
 			kvm_arch_vcpu_free(kvm->vcpus[i]);
@@ -359,7 +345,7 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
 	if (nested_virt_in_use(vcpu))
 		kvm_vcpu_load_hw_mmu(vcpu);
 
-	last_ran = this_cpu_ptr(vcpu->kvm->arch.last_vcpu_ran);
+	last_ran = this_cpu_ptr(vcpu->arch.hw_mmu->last_vcpu_ran);
 	cpu_data = this_cpu_ptr(&kvm_host_data);
 
 	/*
diff --git a/virt/kvm/arm/mmu.c b/virt/kvm/arm/mmu.c
index 94d400e7af57..6a7cba077bce 100644
--- a/virt/kvm/arm/mmu.c
+++ b/virt/kvm/arm/mmu.c
@@ -903,8 +903,9 @@ int create_hyp_exec_mappings(phys_addr_t phys_addr, size_t size,
 }
 
 /**
- * kvm_alloc_stage2_pgd - allocate level-1 table for stage-2 translation.
- * @mmu:	The stage 2 mmu struct pointer
+ * kvm_init_stage2_mmu - Initialise a S2 MMU strucrure
+ * @kvm:	The pointer to the KVM structure
+ * @mmu:	The pointer to the s2 MMU structure
  *
  * Allocates only the stage-2 HW PGD level table(s) of size defined by
  * stage2_pgd_size(mmu->kvm).
@@ -912,10 +913,11 @@ int create_hyp_exec_mappings(phys_addr_t phys_addr, size_t size,
  * Note we don't need locking here as this is only called when the VM is
  * created, which can only be done once.
  */
-int kvm_alloc_stage2_pgd(struct kvm_s2_mmu *mmu)
+int kvm_init_stage2_mmu(struct kvm *kvm, struct kvm_s2_mmu *mmu)
 {
 	phys_addr_t pgd_phys;
 	pgd_t *pgd;
+	int cpu;
 
 	if (mmu->pgd != NULL) {
 		kvm_err("kvm_arch already initialized?\n");
@@ -923,18 +925,28 @@ int kvm_alloc_stage2_pgd(struct kvm_s2_mmu *mmu)
 	}
 
 	/* Allocate the HW PGD, making sure that each page gets its own refcount */
-	pgd = alloc_pages_exact(stage2_pgd_size(mmu->kvm), GFP_KERNEL | __GFP_ZERO);
+	pgd = alloc_pages_exact(stage2_pgd_size(kvm), GFP_KERNEL | __GFP_ZERO);
 	if (!pgd)
 		return -ENOMEM;
 
 	pgd_phys = virt_to_phys(pgd);
-	if (WARN_ON(pgd_phys & ~kvm_vttbr_baddr_mask(mmu->kvm)))
+	if (WARN_ON(pgd_phys & ~kvm_vttbr_baddr_mask(kvm)))
 		return -EINVAL;
 
+	mmu->last_vcpu_ran = alloc_percpu(typeof(*mmu->last_vcpu_ran));
+	if (!mmu->last_vcpu_ran) {
+		free_pages_exact(pgd, stage2_pgd_size(kvm));
+		return -ENOMEM;
+	}
+
+	mmu->kvm = kvm;
 	mmu->pgd = pgd;
 	mmu->pgd_phys = pgd_phys;
 	mmu->vmid.vmid_gen = 0;
 
+	for_each_possible_cpu(cpu)
+		*per_cpu_ptr(mmu->last_vcpu_ran, cpu) = -1;
+
 	kvm_init_s2_mmu(mmu);
 
 	return 0;
@@ -1021,8 +1033,10 @@ void kvm_free_stage2_pgd(struct kvm_s2_mmu *mmu)
 	spin_unlock(&kvm->mmu_lock);
 
 	/* Free the HW pgd, one page at a time */
-	if (pgd)
+	if (pgd) {
 		free_pages_exact(pgd, stage2_pgd_size(kvm));
+		free_percpu(mmu->last_vcpu_ran);
+	}
 }
 
 static pud_t *stage2_get_pud(struct kvm_s2_mmu *mmu, struct kvm_mmu_memory_cache *cache,
-- 
2.20.1


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  parent reply	other threads:[~2019-06-21  9:40 UTC|newest]

Thread overview: 531+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-21  9:37 [PATCH 00/59] KVM: arm64: ARMv8.3 Nested Virtualization support Marc Zyngier
2019-06-21  9:37 ` Marc Zyngier
2019-06-21  9:37 ` Marc Zyngier
2019-06-21  9:37 ` [PATCH 01/59] KVM: arm64: Migrate _elx sysreg accessors to msr_s/mrs_s Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-06-24 11:16   ` Dave Martin
2019-06-24 11:16     ` Dave Martin
2019-06-24 11:16     ` Dave Martin
2019-06-24 12:59   ` Alexandru Elisei
2019-06-24 12:59     ` Alexandru Elisei
2019-06-24 12:59     ` Alexandru Elisei
2019-07-03 12:32     ` Marc Zyngier
2019-07-03 12:32       ` Marc Zyngier
2019-07-03 12:32       ` Marc Zyngier
2019-06-21  9:37 ` [PATCH 02/59] KVM: arm64: Move __load_guest_stage2 to kvm_mmu.h Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-06-24 11:19   ` Dave Martin
2019-06-24 11:19     ` Dave Martin
2019-06-24 11:19     ` Dave Martin
2019-07-03  9:30     ` Marc Zyngier
2019-07-03  9:30       ` Marc Zyngier
2019-07-03  9:30       ` Marc Zyngier
2019-07-03 16:13       ` Dave Martin
2019-07-03 16:13         ` Dave Martin
2019-07-03 16:13         ` Dave Martin
2019-06-21  9:37 ` [PATCH 03/59] arm64: Add ARM64_HAS_NESTED_VIRT cpufeature Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-06-21 13:08   ` Julien Thierry
2019-06-21 13:08     ` Julien Thierry
2019-06-21 13:08     ` Julien Thierry
2019-06-21 13:22     ` Marc Zyngier
2019-06-21 13:22       ` Marc Zyngier
2019-06-21 13:22       ` Marc Zyngier
2019-06-21 13:44   ` Suzuki K Poulose
2019-06-21 13:44     ` Suzuki K Poulose
2019-06-21 13:44     ` Suzuki K Poulose
2019-06-24 11:24   ` Dave Martin
2019-06-24 11:24     ` Dave Martin
2019-06-24 11:24     ` Dave Martin
2019-06-21  9:37 ` [PATCH 04/59] KVM: arm64: nv: Introduce nested virtualization VCPU feature Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-06-21 13:08   ` Julien Thierry
2019-06-21 13:08     ` Julien Thierry
2019-06-21 13:08     ` Julien Thierry
2019-06-24 11:28   ` Dave Martin
2019-06-24 11:28     ` Dave Martin
2019-06-24 11:28     ` Dave Martin
2019-07-03 11:53     ` Marc Zyngier
2019-07-03 11:53       ` Marc Zyngier
2019-07-03 11:53       ` Marc Zyngier
2019-07-03 16:27       ` Dave Martin
2019-07-03 16:27         ` Dave Martin
2019-07-03 16:27         ` Dave Martin
2019-06-24 11:43   ` Dave Martin
2019-06-24 11:43     ` Dave Martin
2019-06-24 11:43     ` Dave Martin
2019-07-03 11:56     ` Marc Zyngier
2019-07-03 11:56       ` Marc Zyngier
2019-07-03 11:56       ` Marc Zyngier
2019-07-03 16:24       ` Dave Martin
2019-07-03 16:24         ` Dave Martin
2019-07-03 16:24         ` Dave Martin
2019-06-21  9:37 ` [PATCH 05/59] KVM: arm64: nv: Reset VCPU to EL2 registers if VCPU nested virt is set Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-06-24 10:19   ` Suzuki K Poulose
2019-06-24 10:19     ` Suzuki K Poulose
2019-06-24 10:19     ` Suzuki K Poulose
2019-06-24 11:38   ` Dave Martin
2019-06-24 11:38     ` Dave Martin
2019-06-24 11:38     ` Dave Martin
2019-06-21  9:37 ` [PATCH 06/59] KVM: arm64: nv: Allow userspace to set PSR_MODE_EL2x Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-06-21 13:24   ` Julien Thierry
2019-06-21 13:24     ` Julien Thierry
2019-06-21 13:24     ` Julien Thierry
2019-06-21 13:50     ` Marc Zyngier
2019-06-21 13:50       ` Marc Zyngier
2019-06-21 13:50       ` Marc Zyngier
2019-06-24 12:48       ` Dave Martin
2019-06-24 12:48         ` Dave Martin
2019-06-24 12:48         ` Dave Martin
2019-07-03  9:21         ` Marc Zyngier
2019-07-03  9:21           ` Marc Zyngier
2019-07-03  9:21           ` Marc Zyngier
2019-07-04 10:00           ` Dave Martin
2019-07-04 10:00             ` Dave Martin
2019-07-04 10:00             ` Dave Martin
2019-06-21  9:37 ` [PATCH 07/59] KVM: arm64: nv: Add EL2 system registers to vcpu context Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-06-24 12:54   ` Dave Martin
2019-06-24 12:54     ` Dave Martin
2019-06-24 12:54     ` Dave Martin
2019-07-03 12:20     ` Marc Zyngier
2019-07-03 12:20       ` Marc Zyngier
2019-07-03 12:20       ` Marc Zyngier
2019-07-03 16:31       ` Dave Martin
2019-07-03 16:31         ` Dave Martin
2019-07-03 16:31         ` Dave Martin
2019-06-24 15:47   ` Alexandru Elisei
2019-06-24 15:47     ` Alexandru Elisei
2019-06-24 15:47     ` Alexandru Elisei
2019-07-03 13:20     ` Marc Zyngier
2019-07-03 13:20       ` Marc Zyngier
2019-07-03 13:20       ` Marc Zyngier
2019-07-03 16:01       ` Marc Zyngier
2019-07-03 16:01         ` Marc Zyngier
2019-07-03 16:01         ` Marc Zyngier
2019-07-01 16:36   ` Suzuki K Poulose
2019-07-01 16:36     ` Suzuki K Poulose
2019-07-01 16:36     ` Suzuki K Poulose
2019-06-21  9:37 ` [PATCH 08/59] KVM: arm64: nv: Reset VMPIDR_EL2 and VPIDR_EL2 to sane values Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-06-24 12:59   ` Dave Martin
2019-06-24 12:59     ` Dave Martin
2019-06-24 12:59     ` Dave Martin
2019-06-21  9:37 ` [PATCH 09/59] KVM: arm64: nv: Add nested virt VCPU primitives for vEL2 VCPU state Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-06-24 13:08   ` Dave Martin
2019-06-24 13:08     ` Dave Martin
2019-06-24 13:08     ` Dave Martin
2019-06-21  9:37 ` [PATCH 10/59] KVM: arm64: nv: Support virtual EL2 exceptions Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-07-08 13:56   ` Steven Price
2019-07-08 13:56     ` Steven Price
2019-07-08 13:56     ` Steven Price
2019-06-21  9:37 ` [PATCH 11/59] KVM: arm64: nv: Inject HVC exceptions to the virtual EL2 Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-06-25 13:13   ` Alexandru Elisei
2019-06-25 13:13     ` Alexandru Elisei
2019-06-25 13:13     ` Alexandru Elisei
2019-07-03 14:16     ` Marc Zyngier
2019-07-03 14:16       ` Marc Zyngier
2019-07-03 14:16       ` Marc Zyngier
2019-07-30 14:08     ` Alexandru Elisei
2019-07-30 14:08       ` Alexandru Elisei
2019-07-30 14:08       ` Alexandru Elisei
2019-06-21  9:37 ` [PATCH 12/59] KVM: arm64: nv: Handle trapped ERET from " Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-07-02 12:00   ` Alexandru Elisei
2019-07-02 12:00     ` Alexandru Elisei
2019-07-02 12:00     ` Alexandru Elisei
2019-06-21  9:37 ` [PATCH 13/59] KVM: arm64: nv: Handle virtual EL2 registers in vcpu_read/write_sys_reg() Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-06-24 12:42   ` Julien Thierry
2019-06-24 12:42     ` Julien Thierry
2019-06-24 12:42     ` Julien Thierry
2019-06-25 14:02     ` Alexandru Elisei
2019-06-25 14:02       ` Alexandru Elisei
2019-06-25 14:02       ` Alexandru Elisei
2019-07-03 12:15     ` Marc Zyngier
2019-07-03 12:15       ` Marc Zyngier
2019-07-03 12:15       ` Marc Zyngier
2019-07-03 15:21       ` Julien Thierry
2019-07-03 15:21         ` Julien Thierry
2019-07-03 15:21         ` Julien Thierry
2019-06-25 15:18   ` Alexandru Elisei
2019-06-25 15:18     ` Alexandru Elisei
2019-06-25 15:18     ` Alexandru Elisei
2019-07-01  9:58     ` Alexandru Elisei
2019-07-01  9:58       ` Alexandru Elisei
2019-07-01  9:58       ` Alexandru Elisei
2019-07-03 15:59     ` Marc Zyngier
2019-07-03 15:59       ` Marc Zyngier
2019-07-03 15:59       ` Marc Zyngier
2019-07-03 16:32       ` Alexandru Elisei
2019-07-03 16:32         ` Alexandru Elisei
2019-07-03 16:32         ` Alexandru Elisei
2019-07-04 14:39         ` Marc Zyngier
2019-07-04 14:39           ` Marc Zyngier
2019-07-04 14:39           ` Marc Zyngier
2019-06-26 15:04   ` Alexandru Elisei
2019-06-26 15:04     ` Alexandru Elisei
2019-06-26 15:04     ` Alexandru Elisei
2019-07-04 15:05     ` Marc Zyngier
2019-07-04 15:05       ` Marc Zyngier
2019-07-04 15:05       ` Marc Zyngier
2019-07-01 12:10   ` Alexandru Elisei
2019-07-01 12:10     ` Alexandru Elisei
2019-07-01 12:10     ` Alexandru Elisei
2019-06-21  9:37 ` [PATCH 14/59] KVM: arm64: nv: Handle SPSR_EL2 specially Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-06-21  9:37 ` [PATCH 15/59] KVM: arm64: nv: Refactor vcpu_{read,write}_sys_reg Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-06-21  9:37   ` Marc Zyngier
2019-06-24 15:07   ` Julien Thierry
2019-06-24 15:07     ` Julien Thierry
2019-06-24 15:07     ` Julien Thierry
2019-07-03 13:09     ` Marc Zyngier
2019-07-03 13:09       ` Marc Zyngier
2019-07-03 13:09       ` Marc Zyngier
2019-06-27  9:21   ` Alexandru Elisei
2019-06-27  9:21     ` Alexandru Elisei
2019-06-27  9:21     ` Alexandru Elisei
2019-07-04 15:15     ` Marc Zyngier
2019-07-04 15:15       ` Marc Zyngier
2019-07-04 15:15       ` Marc Zyngier
2019-06-21  9:38 ` [PATCH 16/59] KVM: arm64: nv: Save/Restore vEL2 sysregs Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-25  8:48   ` Julien Thierry
2019-06-25  8:48     ` Julien Thierry
2019-06-25  8:48     ` Julien Thierry
2019-07-03 13:42     ` Marc Zyngier
2019-07-03 13:42       ` Marc Zyngier
2019-07-03 13:42       ` Marc Zyngier
2019-07-01 12:09   ` Alexandru Elisei
2019-07-01 12:09     ` Alexandru Elisei
2019-07-01 12:09     ` Alexandru Elisei
2019-08-21 11:57   ` Alexandru Elisei
2019-08-21 11:57     ` Alexandru Elisei
2019-08-21 11:57     ` Alexandru Elisei
2019-06-21  9:38 ` [PATCH 17/59] KVM: arm64: nv: Emulate PSTATE.M for a guest hypervisor Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38 ` [PATCH 18/59] KVM: arm64: nv: Trap EL1 VM register accesses in virtual EL2 Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-07-01 16:12   ` Alexandru Elisei
2019-07-01 16:12     ` Alexandru Elisei
2019-07-01 16:12     ` Alexandru Elisei
2019-06-21  9:38 ` [PATCH 19/59] KVM: arm64: nv: Trap SPSR_EL1, ELR_EL1 and VBAR_EL1 from " Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38 ` [PATCH 20/59] KVM: arm64: nv: Trap CPACR_EL1 access in " Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-07-01 16:40   ` Alexandru Elisei
2019-07-01 16:40     ` Alexandru Elisei
2019-07-01 16:40     ` Alexandru Elisei
2019-06-21  9:38 ` [PATCH 21/59] KVM: arm64: nv: Set a handler for the system instruction traps Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-25 12:55   ` Julien Thierry
2019-06-25 12:55     ` Julien Thierry
2019-06-25 12:55     ` Julien Thierry
2019-07-03 14:15     ` Marc Zyngier
2019-07-03 14:15       ` Marc Zyngier
2019-07-03 14:15       ` Marc Zyngier
2019-06-21  9:38 ` [PATCH 22/59] KVM: arm64: nv: Handle PSCI call via smc from the guest Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38 ` [PATCH 23/59] KVM: arm64: nv: Respect virtual HCR_EL2.TWX setting Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-25 14:19   ` Julien Thierry
2019-06-25 14:19     ` Julien Thierry
2019-06-25 14:19     ` Julien Thierry
2019-07-02 12:54     ` Alexandru Elisei
2019-07-02 12:54       ` Alexandru Elisei
2019-07-02 12:54       ` Alexandru Elisei
2019-07-03 14:18     ` Marc Zyngier
2019-07-03 14:18       ` Marc Zyngier
2019-07-03 14:18       ` Marc Zyngier
2019-06-21  9:38 ` [PATCH 24/59] KVM: arm64: nv: Respect virtual CPTR_EL2.TFP setting Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38 ` [PATCH 25/59] KVM: arm64: nv: Don't expose SVE to nested guests Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38 ` [PATCH 26/59] KVM: arm64: nv: Respect the virtual HCR_EL2.NV bit setting Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-26  5:31   ` Julien Thierry
2019-06-26  5:31     ` Julien Thierry
2019-06-26  5:31     ` Julien Thierry
2019-07-03 16:31     ` Marc Zyngier
2019-07-03 16:31       ` Marc Zyngier
2019-07-03 16:31       ` Marc Zyngier
2019-06-21  9:38 ` [PATCH 27/59] KVM: arm64: nv: Respect virtual HCR_EL2.TVM and TRVM settings Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-26  6:55   ` Julien Thierry
2019-06-26  6:55     ` Julien Thierry
2019-06-26  6:55     ` Julien Thierry
2019-07-04 14:57     ` Marc Zyngier
2019-07-04 14:57       ` Marc Zyngier
2019-07-04 14:57       ` Marc Zyngier
2019-06-21  9:38 ` [PATCH 28/59] KVM: arm64: nv: Respect the virtual HCR_EL2.NV1 bit setting Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-26  7:23   ` Julien Thierry
2019-06-26  7:23     ` Julien Thierry
2019-06-26  7:23     ` Julien Thierry
2019-07-02 16:32   ` Alexandru Elisei
2019-07-02 16:32     ` Alexandru Elisei
2019-07-02 16:32     ` Alexandru Elisei
2019-07-03  9:10     ` Alexandru Elisei
2019-07-03  9:10       ` Alexandru Elisei
2019-07-03  9:10       ` Alexandru Elisei
2019-06-21  9:38 ` [PATCH 29/59] KVM: arm64: nv: Emulate EL12 register accesses from the virtual EL2 Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-07-03  9:16   ` Alexandru Elisei
2019-07-03  9:16     ` Alexandru Elisei
2019-07-03  9:16     ` Alexandru Elisei
2019-06-21  9:38 ` [PATCH 30/59] KVM: arm64: nv: Configure HCR_EL2 for nested virtualization Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38 ` [PATCH 31/59] KVM: arm64: nv: Only toggle cache for virtual EL2 when SCTLR_EL2 changes Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38 ` [PATCH 32/59] KVM: arm64: nv: Hide RAS from nested guests Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-07-03 13:59   ` Alexandru Elisei
2019-07-03 13:59     ` Alexandru Elisei
2019-07-03 13:59     ` Alexandru Elisei
2019-06-21  9:38 ` [PATCH 33/59] KVM: arm64: nv: Pretend we only support larger-than-host page sizes Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-07-03 14:13   ` Alexandru Elisei
2019-07-03 14:13     ` Alexandru Elisei
2019-07-03 14:13     ` Alexandru Elisei
2019-06-21  9:38 ` [PATCH 34/59] KVM: arm/arm64: nv: Factor out stage 2 page table data from struct kvm Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-07-03 15:52   ` Alexandru Elisei
2019-07-03 15:52     ` Alexandru Elisei
2019-07-03 15:52     ` Alexandru Elisei
2019-06-21  9:38 ` [PATCH 35/59] KVM: arm/arm64: nv: Support multiple nested stage 2 mmu structures Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-25 12:19   ` Alexandru Elisei
2019-06-25 12:19     ` Alexandru Elisei
2019-06-25 12:19     ` Alexandru Elisei
2019-07-03 13:47     ` Marc Zyngier
2019-07-03 13:47       ` Marc Zyngier
2019-07-03 13:47       ` Marc Zyngier
2019-06-27 13:15   ` Julien Thierry
2019-06-27 13:15     ` Julien Thierry
2019-06-27 13:15     ` Julien Thierry
2019-07-04 15:51   ` Alexandru Elisei
2019-07-04 15:51     ` Alexandru Elisei
2019-07-04 15:51     ` Alexandru Elisei
2020-01-05 11:35     ` Marc Zyngier
2020-01-05 11:35       ` Marc Zyngier
2020-01-05 11:35       ` Marc Zyngier
2020-01-06 16:31       ` Alexandru Elisei
2020-01-06 16:31         ` Alexandru Elisei
2020-01-06 16:31         ` Alexandru Elisei
2019-06-21  9:38 ` [PATCH 36/59] KVM: arm64: nv: Implement nested Stage-2 page table walk logic Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38 ` [PATCH 37/59] KVM: arm64: nv: Handle shadow stage 2 page faults Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-07-05 14:28   ` Alexandru Elisei
2019-07-05 14:28     ` Alexandru Elisei
2019-07-05 14:28     ` Alexandru Elisei
2019-06-21  9:38 ` [PATCH 38/59] KVM: arm64: nv: Unmap/flush shadow stage 2 page tables Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-07-01  8:03   ` Julien Thierry
2019-07-01  8:03     ` Julien Thierry
2019-07-01  8:03     ` Julien Thierry
2019-06-21  9:38 ` Marc Zyngier [this message]
2019-06-21  9:38   ` [PATCH 39/59] KVM: arm64: nv: Move last_vcpu_ran to be per s2 mmu Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-07-01  9:10   ` Julien Thierry
2019-07-01  9:10     ` Julien Thierry
2019-07-01  9:10     ` Julien Thierry
2019-07-05 15:28   ` Alexandru Elisei
2019-07-05 15:28     ` Alexandru Elisei
2019-07-05 15:28     ` Alexandru Elisei
2019-06-21  9:38 ` [PATCH 40/59] KVM: arm64: nv: Don't always start an S2 MMU search from the beginning Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-07-09  9:59   ` Alexandru Elisei
2019-07-09  9:59     ` Alexandru Elisei
2019-07-09  9:59     ` Alexandru Elisei
2019-06-21  9:38 ` [PATCH 41/59] KVM: arm64: nv: Introduce sys_reg_desc.forward_trap Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38 ` [PATCH 42/59] KVM: arm64: nv: Rework the system instruction emulation framework Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38 ` [PATCH 43/59] KVM: arm64: nv: Trap and emulate AT instructions from virtual EL2 Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-07-01 15:45   ` Julien Thierry
2019-07-01 15:45     ` Julien Thierry
2019-07-01 15:45     ` Julien Thierry
2019-07-09 13:20   ` Alexandru Elisei
2019-07-09 13:20     ` Alexandru Elisei
2019-07-09 13:20     ` Alexandru Elisei
2019-07-18 12:13     ` Tomasz Nowicki
2019-07-18 12:13       ` Tomasz Nowicki
2019-07-18 12:13       ` Tomasz Nowicki
2019-07-18 12:36       ` Alexandru Elisei
2019-07-18 12:56         ` Alexandru Elisei
2019-07-18 12:59         ` Tomasz Nowicki
2019-07-18 12:59           ` Tomasz Nowicki
2019-07-18 12:59           ` Tomasz Nowicki
2019-07-24 10:25   ` Tomasz Nowicki
2019-07-24 10:25     ` Tomasz Nowicki
2019-07-24 10:25     ` Tomasz Nowicki
2019-07-24 12:39     ` Marc Zyngier
2019-07-24 12:39       ` Marc Zyngier
2019-07-24 12:39       ` Marc Zyngier
2019-07-24 13:56       ` Tomasz Nowicki
2019-07-24 13:56         ` Tomasz Nowicki
2019-07-24 13:56         ` Tomasz Nowicki
2019-06-21  9:38 ` [PATCH 44/59] KVM: arm64: nv: Trap and emulate TLBI " Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-07-02 12:37   ` Julien Thierry
2019-07-02 12:37     ` Julien Thierry
2019-07-02 12:37     ` Julien Thierry
2019-07-10 10:15   ` Alexandru Elisei
2019-07-10 10:15     ` Alexandru Elisei
2019-07-10 10:15     ` Alexandru Elisei
2019-06-21  9:38 ` [PATCH 45/59] KVM: arm64: nv: Handle traps for timer _EL02 and _EL2 sysregs accessors Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38 ` [PATCH 46/59] KVM: arm64: nv: arch_timer: Support hyp timer emulation Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-07-10 16:23   ` Alexandru Elisei
2019-07-10 16:23     ` Alexandru Elisei
2019-07-10 16:23     ` Alexandru Elisei
2019-06-21  9:38 ` [PATCH 47/59] KVM: arm64: nv: Propagate CNTVOFF_EL2 to the virtual EL1 timer Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-08-08  9:34   ` Alexandru Elisei
2019-08-08  9:34     ` Alexandru Elisei
2019-08-08  9:34     ` Alexandru Elisei
2019-06-21  9:38 ` [PATCH 48/59] KVM: arm64: nv: Load timer before the GIC Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-07-11 13:17   ` Alexandru Elisei
2019-07-11 13:17     ` Alexandru Elisei
2019-07-11 13:17     ` Alexandru Elisei
2019-06-21  9:38 ` [PATCH 49/59] KVM: arm64: nv: vgic-v3: Take cpu_if pointer directly instead of vcpu Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38 ` [PATCH 50/59] KVM: arm64: nv: Nested GICv3 Support Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-07-16 11:41   ` Alexandru Elisei
2019-07-16 11:41     ` Alexandru Elisei
2019-07-16 11:41     ` Alexandru Elisei
2019-06-21  9:38 ` [PATCH 51/59] KVM: arm64: nv: vgic: Emulate the HW bit in software Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38 ` [PATCH 52/59] KVM: arm64: nv: vgic: Allow userland to set VGIC maintenance IRQ Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-07-04  7:38   ` Julien Thierry
2019-07-04  7:38     ` Julien Thierry
2019-07-04  7:38     ` Julien Thierry
2019-07-04  9:01     ` Andre Przywara
2019-07-04  9:01       ` Andre Przywara
2019-07-04  9:01       ` Andre Przywara
2019-07-04  9:04       ` Julien Thierry
2019-07-04  9:04         ` Julien Thierry
2019-07-04  9:04         ` Julien Thierry
2019-06-21  9:38 ` [PATCH 53/59] KVM: arm64: nv: Implement maintenance interrupt forwarding Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-07-04  8:06   ` Julien Thierry
2019-07-04  8:06     ` Julien Thierry
2019-07-04  8:06     ` Julien Thierry
2019-07-16 16:35   ` Alexandru Elisei
2019-07-16 16:35     ` Alexandru Elisei
2019-07-16 16:35     ` Alexandru Elisei
2019-06-21  9:38 ` [PATCH 54/59] KVM: arm64: nv: Add nested GICv3 tracepoints Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38 ` [PATCH 55/59] arm64: KVM: nv: Add handling of EL2-specific timer registers Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-07-11 12:35   ` Alexandru Elisei
2019-07-11 12:35     ` Alexandru Elisei
2019-07-11 12:35     ` Alexandru Elisei
2019-07-17 10:19   ` Alexandru Elisei
2019-07-17 10:19     ` Alexandru Elisei
2019-07-17 10:19     ` Alexandru Elisei
2019-06-21  9:38 ` [PATCH 56/59] arm64: KVM: nv: Honor SCTLR_EL2.SPAN on entering vEL2 Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38 ` [PATCH 57/59] arm64: KVM: nv: Handle SCTLR_EL2 RES0/RES1 bits Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38 ` [PATCH 58/59] arm64: KVM: nv: Restrict S2 RD/WR permissions to match the guest's Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38 ` [PATCH 59/59] arm64: KVM: nv: Allow userspace to request KVM_ARM_VCPU_NESTED_VIRT Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:38   ` Marc Zyngier
2019-06-21  9:57 ` [PATCH 00/59] KVM: arm64: ARMv8.3 Nested Virtualization support Itaru Kitayama
2019-06-21 11:21   ` Marc Zyngier
2019-06-21 11:21     ` Marc Zyngier
2019-06-21 11:21     ` Marc Zyngier
2019-08-02 10:11 ` Alexandru Elisei
2019-08-02 10:11   ` Alexandru Elisei
2019-08-02 10:11   ` Alexandru Elisei
2019-08-02 10:30   ` Andrew Jones
2019-08-02 10:30     ` Andrew Jones
2019-08-02 10:30     ` Andrew Jones
2019-08-09 10:01   ` Alexandru Elisei
2019-08-09 10:01     ` Alexandru Elisei
2019-08-09 10:01     ` Alexandru Elisei
2019-08-09 11:44     ` Andrew Jones
2019-08-09 11:44       ` Andrew Jones
2019-08-09 11:44       ` Andrew Jones
2019-08-09 12:00       ` Alexandru Elisei
2019-08-09 12:00         ` Alexandru Elisei
2019-08-09 12:00         ` Alexandru Elisei
2019-08-09 13:00         ` Andrew Jones
2019-08-09 13:00           ` Andrew Jones
2019-08-09 13:00           ` Andrew Jones
2019-08-22 11:57     ` Alexandru Elisei
2019-08-22 11:57       ` Alexandru Elisei
2019-08-22 11:57       ` Alexandru Elisei
2019-08-22 15:32       ` Alexandru Elisei
2019-08-22 15:32         ` Alexandru Elisei
2019-08-22 15:32         ` Alexandru Elisei

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=20190621093843.220980-40-marc.zyngier@arm.com \
    --to=marc.zyngier@arm.com \
    --cc=Dave.Martin@arm.com \
    --cc=andre.przywara@arm.com \
    --cc=christoffer.dall@arm.com \
    --cc=james.morse@arm.com \
    --cc=jintack@cs.columbia.edu \
    --cc=julien.thierry@arm.com \
    --cc=kvm@vger.kernel.org \
    --cc=kvmarm@lists.cs.columbia.edu \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=suzuki.poulose@arm.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.