Skip to content

Commit

Permalink
KVM: arm/arm64: VGIC/ITS save/restore: protect kvm_read_guest() calls
Browse files Browse the repository at this point in the history
kvm_read_guest() will eventually look up in kvm_memslots(), which requires
either to hold the kvm->slots_lock or to be inside a kvm->srcu critical
section.
In contrast to x86 and s390 we don't take the SRCU lock on every guest
exit, so we have to do it individually for each kvm_read_guest() call.
Use the newly introduced wrapper for that.

Cc: Stable <[email protected]> # 4.12+
Reported-by: Jan Glauber <[email protected]>
Signed-off-by: Andre Przywara <[email protected]>
Acked-by: Christoffer Dall <[email protected]>
Signed-off-by: Paolo Bonzini <[email protected]>
  • Loading branch information
Andre-ARM authored and bonzini committed May 15, 2018
1 parent bf30824 commit 711702b
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 4 deletions.
4 changes: 2 additions & 2 deletions virt/kvm/arm/vgic/vgic-its.c
Original file line number Diff line number Diff line change
Expand Up @@ -1897,7 +1897,7 @@ static int scan_its_table(struct vgic_its *its, gpa_t base, int size, int esz,
int next_offset;
size_t byte_offset;

ret = kvm_read_guest(kvm, gpa, entry, esz);
ret = kvm_read_guest_lock(kvm, gpa, entry, esz);
if (ret)
return ret;

Expand Down Expand Up @@ -2267,7 +2267,7 @@ static int vgic_its_restore_cte(struct vgic_its *its, gpa_t gpa, int esz)
int ret;

BUG_ON(esz > sizeof(val));
ret = kvm_read_guest(kvm, gpa, &val, esz);
ret = kvm_read_guest_lock(kvm, gpa, &val, esz);
if (ret)
return ret;
val = le64_to_cpu(val);
Expand Down
4 changes: 2 additions & 2 deletions virt/kvm/arm/vgic/vgic-v3.c
Original file line number Diff line number Diff line change
Expand Up @@ -344,7 +344,7 @@ int vgic_v3_lpi_sync_pending_status(struct kvm *kvm, struct vgic_irq *irq)
bit_nr = irq->intid % BITS_PER_BYTE;
ptr = pendbase + byte_offset;

ret = kvm_read_guest(kvm, ptr, &val, 1);
ret = kvm_read_guest_lock(kvm, ptr, &val, 1);
if (ret)
return ret;

Expand Down Expand Up @@ -397,7 +397,7 @@ int vgic_v3_save_pending_tables(struct kvm *kvm)
ptr = pendbase + byte_offset;

if (byte_offset != last_byte_offset) {
ret = kvm_read_guest(kvm, ptr, &val, 1);
ret = kvm_read_guest_lock(kvm, ptr, &val, 1);
if (ret)
return ret;
last_byte_offset = byte_offset;
Expand Down

0 comments on commit 711702b

Please sign in to comment.