aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/include/asm/kvm_mmu.h11
-rw-r--r--arch/arm64/include/asm/kvm_mmu.h11
-rw-r--r--virt/kvm/arm/vgic/vgic-its.c8
-rw-r--r--virt/kvm/arm/vgic/vgic-v3.c4
4 files changed, 28 insertions, 6 deletions
diff --git a/arch/arm/include/asm/kvm_mmu.h b/arch/arm/include/asm/kvm_mmu.h
index 2de96a180166..31de4ab93005 100644
--- a/arch/arm/include/asm/kvm_mmu.h
+++ b/arch/arm/include/asm/kvm_mmu.h
@@ -381,6 +381,17 @@ static inline int kvm_read_guest_lock(struct kvm *kvm,
381 return ret; 381 return ret;
382} 382}
383 383
384static inline int kvm_write_guest_lock(struct kvm *kvm, gpa_t gpa,
385 const void *data, unsigned long len)
386{
387 int srcu_idx = srcu_read_lock(&kvm->srcu);
388 int ret = kvm_write_guest(kvm, gpa, data, len);
389
390 srcu_read_unlock(&kvm->srcu, srcu_idx);
391
392 return ret;
393}
394
384static inline void *kvm_get_hyp_vector(void) 395static inline void *kvm_get_hyp_vector(void)
385{ 396{
386 switch(read_cpuid_part()) { 397 switch(read_cpuid_part()) {
diff --git a/arch/arm64/include/asm/kvm_mmu.h b/arch/arm64/include/asm/kvm_mmu.h
index b0742a16c6c9..ebeefcf835e8 100644
--- a/arch/arm64/include/asm/kvm_mmu.h
+++ b/arch/arm64/include/asm/kvm_mmu.h
@@ -445,6 +445,17 @@ static inline int kvm_read_guest_lock(struct kvm *kvm,
445 return ret; 445 return ret;
446} 446}
447 447
448static inline int kvm_write_guest_lock(struct kvm *kvm, gpa_t gpa,
449 const void *data, unsigned long len)
450{
451 int srcu_idx = srcu_read_lock(&kvm->srcu);
452 int ret = kvm_write_guest(kvm, gpa, data, len);
453
454 srcu_read_unlock(&kvm->srcu, srcu_idx);
455
456 return ret;
457}
458
448#ifdef CONFIG_KVM_INDIRECT_VECTORS 459#ifdef CONFIG_KVM_INDIRECT_VECTORS
449/* 460/*
450 * EL2 vectors can be mapped and rerouted in a number of ways, 461 * EL2 vectors can be mapped and rerouted in a number of ways,
diff --git a/virt/kvm/arm/vgic/vgic-its.c b/virt/kvm/arm/vgic/vgic-its.c
index ab3f47745d9c..c41e11fd841c 100644
--- a/virt/kvm/arm/vgic/vgic-its.c
+++ b/virt/kvm/arm/vgic/vgic-its.c
@@ -1919,7 +1919,7 @@ static int vgic_its_save_ite(struct vgic_its *its, struct its_device *dev,
1919 ((u64)ite->irq->intid << KVM_ITS_ITE_PINTID_SHIFT) | 1919 ((u64)ite->irq->intid << KVM_ITS_ITE_PINTID_SHIFT) |
1920 ite->collection->collection_id; 1920 ite->collection->collection_id;
1921 val = cpu_to_le64(val); 1921 val = cpu_to_le64(val);
1922 return kvm_write_guest(kvm, gpa, &val, ite_esz); 1922 return kvm_write_guest_lock(kvm, gpa, &val, ite_esz);
1923} 1923}
1924 1924
1925/** 1925/**
@@ -2066,7 +2066,7 @@ static int vgic_its_save_dte(struct vgic_its *its, struct its_device *dev,
2066 (itt_addr_field << KVM_ITS_DTE_ITTADDR_SHIFT) | 2066 (itt_addr_field << KVM_ITS_DTE_ITTADDR_SHIFT) |
2067 (dev->num_eventid_bits - 1)); 2067 (dev->num_eventid_bits - 1));
2068 val = cpu_to_le64(val); 2068 val = cpu_to_le64(val);
2069 return kvm_write_guest(kvm, ptr, &val, dte_esz); 2069 return kvm_write_guest_lock(kvm, ptr, &val, dte_esz);
2070} 2070}
2071 2071
2072/** 2072/**
@@ -2246,7 +2246,7 @@ static int vgic_its_save_cte(struct vgic_its *its,
2246 ((u64)collection->target_addr << KVM_ITS_CTE_RDBASE_SHIFT) | 2246 ((u64)collection->target_addr << KVM_ITS_CTE_RDBASE_SHIFT) |
2247 collection->collection_id); 2247 collection->collection_id);
2248 val = cpu_to_le64(val); 2248 val = cpu_to_le64(val);
2249 return kvm_write_guest(its->dev->kvm, gpa, &val, esz); 2249 return kvm_write_guest_lock(its->dev->kvm, gpa, &val, esz);
2250} 2250}
2251 2251
2252static int vgic_its_restore_cte(struct vgic_its *its, gpa_t gpa, int esz) 2252static int vgic_its_restore_cte(struct vgic_its *its, gpa_t gpa, int esz)
@@ -2317,7 +2317,7 @@ static int vgic_its_save_collection_table(struct vgic_its *its)
2317 */ 2317 */
2318 val = 0; 2318 val = 0;
2319 BUG_ON(cte_esz > sizeof(val)); 2319 BUG_ON(cte_esz > sizeof(val));
2320 ret = kvm_write_guest(its->dev->kvm, gpa, &val, cte_esz); 2320 ret = kvm_write_guest_lock(its->dev->kvm, gpa, &val, cte_esz);
2321 return ret; 2321 return ret;
2322} 2322}
2323 2323
diff --git a/virt/kvm/arm/vgic/vgic-v3.c b/virt/kvm/arm/vgic/vgic-v3.c
index 408a78eb6a97..9f87e58dbd4a 100644
--- a/virt/kvm/arm/vgic/vgic-v3.c
+++ b/virt/kvm/arm/vgic/vgic-v3.c
@@ -358,7 +358,7 @@ retry:
358 if (status) { 358 if (status) {
359 /* clear consumed data */ 359 /* clear consumed data */
360 val &= ~(1 << bit_nr); 360 val &= ~(1 << bit_nr);
361 ret = kvm_write_guest(kvm, ptr, &val, 1); 361 ret = kvm_write_guest_lock(kvm, ptr, &val, 1);
362 if (ret) 362 if (ret)
363 return ret; 363 return ret;
364 } 364 }
@@ -409,7 +409,7 @@ int vgic_v3_save_pending_tables(struct kvm *kvm)
409 else 409 else
410 val &= ~(1 << bit_nr); 410 val &= ~(1 << bit_nr);
411 411
412 ret = kvm_write_guest(kvm, ptr, &val, 1); 412 ret = kvm_write_guest_lock(kvm, ptr, &val, 1);
413 if (ret) 413 if (ret)
414 return ret; 414 return ret;
415 } 415 }