]>
Commit | Line | Data |
---|---|---|
35bcfbe9 GKH |
1 | From 711702b57cc3c50b84bd648de0f1ca0a378805be Mon Sep 17 00:00:00 2001 |
2 | From: Andre Przywara <andre.przywara@arm.com> | |
3 | Date: Fri, 11 May 2018 15:20:15 +0100 | |
4 | Subject: KVM: arm/arm64: VGIC/ITS save/restore: protect kvm_read_guest() calls | |
5 | ||
6 | From: Andre Przywara <andre.przywara@arm.com> | |
7 | ||
8 | commit 711702b57cc3c50b84bd648de0f1ca0a378805be upstream. | |
9 | ||
10 | kvm_read_guest() will eventually look up in kvm_memslots(), which requires | |
11 | either to hold the kvm->slots_lock or to be inside a kvm->srcu critical | |
12 | section. | |
13 | In contrast to x86 and s390 we don't take the SRCU lock on every guest | |
14 | exit, so we have to do it individually for each kvm_read_guest() call. | |
15 | Use the newly introduced wrapper for that. | |
16 | ||
17 | Cc: Stable <stable@vger.kernel.org> # 4.12+ | |
18 | Reported-by: Jan Glauber <jan.glauber@caviumnetworks.com> | |
19 | Signed-off-by: Andre Przywara <andre.przywara@arm.com> | |
20 | Acked-by: Christoffer Dall <christoffer.dall@arm.com> | |
21 | Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> | |
22 | Signed-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; |