Commit 95c87e2b4460a488ec7ce42f273893e410ab385a
Committed by
Avi Kivity
1 parent
fef093bec0
KVM: Fix IOMMU memslot reference warning
This patch fixes the following warning. =================================================== [ INFO: suspicious rcu_dereference_check() usage. ] --------------------------------------------------- include/linux/kvm_host.h:259 invoked rcu_dereference_check() without protection! other info that might help us debug this: rcu_scheduler_active = 1, debug_locks = 0 no locks held by qemu-system-x86/29679. stack backtrace: Pid: 29679, comm: qemu-system-x86 Not tainted 2.6.35-rc3+ #200 Call Trace: [<ffffffff810a224e>] lockdep_rcu_dereference+0xa8/0xb1 [<ffffffffa018a06f>] kvm_iommu_unmap_memslots+0xc9/0xde [kvm] [<ffffffffa018a0c4>] kvm_iommu_unmap_guest+0x40/0x4e [kvm] [<ffffffffa018f772>] kvm_arch_destroy_vm+0x1a/0x186 [kvm] [<ffffffffa01800d0>] kvm_put_kvm+0x110/0x167 [kvm] [<ffffffffa0180ecc>] kvm_vcpu_release+0x18/0x1c [kvm] [<ffffffff81156f5d>] fput+0x22a/0x3a0 [<ffffffff81152288>] filp_close+0xb4/0xcd [<ffffffff8106599f>] put_files_struct+0x1b7/0x36b [<ffffffff81065830>] ? put_files_struct+0x48/0x36b [<ffffffff8131ee59>] ? do_raw_spin_unlock+0x118/0x160 [<ffffffff81065bc0>] exit_files+0x6d/0x75 [<ffffffff81068348>] do_exit+0x47d/0xc60 [<ffffffff8177e7b5>] ? _raw_spin_unlock_irq+0x30/0x36 [<ffffffff81068bfa>] do_group_exit+0xcf/0x134 [<ffffffff81080790>] get_signal_to_deliver+0x732/0x81d [<ffffffff81095996>] ? cpu_clock+0x4e/0x60 [<ffffffff81002082>] do_notify_resume+0x117/0xc43 [<ffffffff810a2fa3>] ? trace_hardirqs_on+0xd/0xf [<ffffffff81080d79>] ? sys_rt_sigtimedwait+0x2b5/0x3bf [<ffffffff8177d9f2>] ? trace_hardirqs_off_thunk+0x3a/0x3c [<ffffffff81003221>] ? sysret_signal+0x5/0x3d [<ffffffff8100343b>] int_signal+0x12/0x17 Signed-off-by: Sheng Yang <sheng@linux.intel.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Showing 1 changed file with 6 additions and 2 deletions Side-by-side Diff
virt/kvm/iommu.c
... | ... | @@ -126,9 +126,10 @@ |
126 | 126 | |
127 | 127 | static int kvm_iommu_map_memslots(struct kvm *kvm) |
128 | 128 | { |
129 | - int i, r = 0; | |
129 | + int i, idx, r = 0; | |
130 | 130 | struct kvm_memslots *slots; |
131 | 131 | |
132 | + idx = srcu_read_lock(&kvm->srcu); | |
132 | 133 | slots = kvm_memslots(kvm); |
133 | 134 | |
134 | 135 | for (i = 0; i < slots->nmemslots; i++) { |
... | ... | @@ -136,6 +137,7 @@ |
136 | 137 | if (r) |
137 | 138 | break; |
138 | 139 | } |
140 | + srcu_read_unlock(&kvm->srcu, idx); | |
139 | 141 | |
140 | 142 | return r; |
141 | 143 | } |
142 | 144 | |
143 | 145 | |
... | ... | @@ -285,15 +287,17 @@ |
285 | 287 | |
286 | 288 | static int kvm_iommu_unmap_memslots(struct kvm *kvm) |
287 | 289 | { |
288 | - int i; | |
290 | + int i, idx; | |
289 | 291 | struct kvm_memslots *slots; |
290 | 292 | |
293 | + idx = srcu_read_lock(&kvm->srcu); | |
291 | 294 | slots = kvm_memslots(kvm); |
292 | 295 | |
293 | 296 | for (i = 0; i < slots->nmemslots; i++) { |
294 | 297 | kvm_iommu_put_pages(kvm, slots->memslots[i].base_gfn, |
295 | 298 | slots->memslots[i].npages); |
296 | 299 | } |
300 | + srcu_read_unlock(&kvm->srcu, idx); | |
297 | 301 | |
298 | 302 | return 0; |
299 | 303 | } |