]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/4.14.43/kvm-arm-arm64-vgic-its-save-restore-protect-kvm_read_guest-calls.patch
Linux 4.14.119
[thirdparty/kernel/stable-queue.git] / releases / 4.14.43 / kvm-arm-arm64-vgic-its-save-restore-protect-kvm_read_guest-calls.patch
CommitLineData
35bcfbe9
GKH
1From 711702b57cc3c50b84bd648de0f1ca0a378805be Mon Sep 17 00:00:00 2001
2From: Andre Przywara <andre.przywara@arm.com>
3Date: Fri, 11 May 2018 15:20:15 +0100
4Subject: KVM: arm/arm64: VGIC/ITS save/restore: protect kvm_read_guest() calls
5
6From: Andre Przywara <andre.przywara@arm.com>
7
8commit 711702b57cc3c50b84bd648de0f1ca0a378805be upstream.
9
10kvm_read_guest() will eventually look up in kvm_memslots(), which requires
11either to hold the kvm->slots_lock or to be inside a kvm->srcu critical
12section.
13In contrast to x86 and s390 we don't take the SRCU lock on every guest
14exit, so we have to do it individually for each kvm_read_guest() call.
15Use the newly introduced wrapper for that.
16
17Cc: Stable <stable@vger.kernel.org> # 4.12+
18Reported-by: Jan Glauber <jan.glauber@caviumnetworks.com>
19Signed-off-by: Andre Przywara <andre.przywara@arm.com>
20Acked-by: Christoffer Dall <christoffer.dall@arm.com>
21Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
22Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
23
24---
25 virt/kvm/arm/vgic/vgic-its.c | 4 ++--
26 virt/kvm/arm/vgic/vgic-v3.c | 4 ++--
27 2 files changed, 4 insertions(+), 4 deletions(-)
28
29--- a/virt/kvm/arm/vgic/vgic-its.c
30+++ b/virt/kvm/arm/vgic/vgic-its.c
31@@ -1830,7 +1830,7 @@ static int scan_its_table(struct vgic_it
32 int next_offset;
33 size_t byte_offset;
34
35- ret = kvm_read_guest(kvm, gpa, entry, esz);
36+ ret = kvm_read_guest_lock(kvm, gpa, entry, esz);
37 if (ret)
38 return ret;
39
40@@ -2191,7 +2191,7 @@ static int vgic_its_restore_cte(struct v
41 int ret;
42
43 BUG_ON(esz > sizeof(val));
44- ret = kvm_read_guest(kvm, gpa, &val, esz);
45+ ret = kvm_read_guest_lock(kvm, gpa, &val, esz);
46 if (ret)
47 return ret;
48 val = le64_to_cpu(val);
49--- a/virt/kvm/arm/vgic/vgic-v3.c
50+++ b/virt/kvm/arm/vgic/vgic-v3.c
51@@ -297,7 +297,7 @@ retry:
52 bit_nr = irq->intid % BITS_PER_BYTE;
53 ptr = pendbase + byte_offset;
54
55- ret = kvm_read_guest(kvm, ptr, &val, 1);
56+ ret = kvm_read_guest_lock(kvm, ptr, &val, 1);
57 if (ret)
58 return ret;
59
60@@ -350,7 +350,7 @@ int vgic_v3_save_pending_tables(struct k
61 ptr = pendbase + byte_offset;
62
63 if (byte_offset != last_byte_offset) {
64- ret = kvm_read_guest(kvm, ptr, &val, 1);
65+ ret = kvm_read_guest_lock(kvm, ptr, &val, 1);
66 if (ret)
67 return ret;
68 last_byte_offset = byte_offset;