diff options
author | Mark McLoughlin <markmc@redhat.com> | 2009-02-05 13:23:46 -0500 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2009-02-14 19:47:39 -0500 |
commit | 682edb4c01e690c7c7cd772dbd6f4e0fd74dc572 (patch) | |
tree | 21e41d8f67f3fc81df9744e91350e76b1787ec3b /virt/kvm/kvm_main.c | |
parent | b682b814e3cc340f905c14dff87ce8bdba7c5eba (diff) |
KVM: Fix assigned devices circular locking dependency
kvm->slots_lock is outer to kvm->lock, so take slots_lock
in kvm_vm_ioctl_assign_device() before taking kvm->lock,
rather than taking it in kvm_iommu_map_memslots().
Cc: stable@kernel.org
Signed-off-by: Mark McLoughlin <markmc@redhat.com>
Acked-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'virt/kvm/kvm_main.c')
-rw-r--r-- | virt/kvm/kvm_main.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index d9bbb20f230f..29a667ce35b0 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
@@ -466,6 +466,7 @@ static int kvm_vm_ioctl_assign_device(struct kvm *kvm, | |||
466 | struct kvm_assigned_dev_kernel *match; | 466 | struct kvm_assigned_dev_kernel *match; |
467 | struct pci_dev *dev; | 467 | struct pci_dev *dev; |
468 | 468 | ||
469 | down_read(&kvm->slots_lock); | ||
469 | mutex_lock(&kvm->lock); | 470 | mutex_lock(&kvm->lock); |
470 | 471 | ||
471 | match = kvm_find_assigned_dev(&kvm->arch.assigned_dev_head, | 472 | match = kvm_find_assigned_dev(&kvm->arch.assigned_dev_head, |
@@ -527,6 +528,7 @@ static int kvm_vm_ioctl_assign_device(struct kvm *kvm, | |||
527 | 528 | ||
528 | out: | 529 | out: |
529 | mutex_unlock(&kvm->lock); | 530 | mutex_unlock(&kvm->lock); |
531 | up_read(&kvm->slots_lock); | ||
530 | return r; | 532 | return r; |
531 | out_list_del: | 533 | out_list_del: |
532 | list_del(&match->list); | 534 | list_del(&match->list); |
@@ -538,6 +540,7 @@ out_put: | |||
538 | out_free: | 540 | out_free: |
539 | kfree(match); | 541 | kfree(match); |
540 | mutex_unlock(&kvm->lock); | 542 | mutex_unlock(&kvm->lock); |
543 | up_read(&kvm->slots_lock); | ||
541 | return r; | 544 | return r; |
542 | } | 545 | } |
543 | #endif | 546 | #endif |