diff options
| -rw-r--r-- | arch/arm/include/asm/kvm_mmu.h | 11 | ||||
| -rw-r--r-- | arch/arm64/include/asm/kvm_mmu.h | 11 | ||||
| -rw-r--r-- | virt/kvm/arm/vgic/vgic-its.c | 8 | ||||
| -rw-r--r-- | virt/kvm/arm/vgic/vgic-v3.c | 4 |
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 | ||
| 384 | static 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 | |||
| 384 | static inline void *kvm_get_hyp_vector(void) | 395 | static 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 | ||
| 448 | static 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 | ||
| 2252 | static int vgic_its_restore_cte(struct vgic_its *its, gpa_t gpa, int esz) | 2252 | static 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 | } |
