aboutsummaryrefslogtreecommitdiffstats
path: root/virt/kvm/assigned-dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'virt/kvm/assigned-dev.c')
-rw-r--r--virt/kvm/assigned-dev.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/virt/kvm/assigned-dev.c b/virt/kvm/assigned-dev.c
index 3ad0925d23a9..a251a28f79c7 100644
--- a/virt/kvm/assigned-dev.c
+++ b/virt/kvm/assigned-dev.c
@@ -487,6 +487,9 @@ static int kvm_vm_ioctl_assign_device(struct kvm *kvm,
487 struct kvm_assigned_dev_kernel *match; 487 struct kvm_assigned_dev_kernel *match;
488 struct pci_dev *dev; 488 struct pci_dev *dev;
489 489
490 if (!(assigned_dev->flags & KVM_DEV_ASSIGN_ENABLE_IOMMU))
491 return -EINVAL;
492
490 mutex_lock(&kvm->lock); 493 mutex_lock(&kvm->lock);
491 idx = srcu_read_lock(&kvm->srcu); 494 idx = srcu_read_lock(&kvm->srcu);
492 495
@@ -544,16 +547,14 @@ static int kvm_vm_ioctl_assign_device(struct kvm *kvm,
544 547
545 list_add(&match->list, &kvm->arch.assigned_dev_head); 548 list_add(&match->list, &kvm->arch.assigned_dev_head);
546 549
547 if (assigned_dev->flags & KVM_DEV_ASSIGN_ENABLE_IOMMU) { 550 if (!kvm->arch.iommu_domain) {
548 if (!kvm->arch.iommu_domain) { 551 r = kvm_iommu_map_guest(kvm);
549 r = kvm_iommu_map_guest(kvm);
550 if (r)
551 goto out_list_del;
552 }
553 r = kvm_assign_device(kvm, match);
554 if (r) 552 if (r)
555 goto out_list_del; 553 goto out_list_del;
556 } 554 }
555 r = kvm_assign_device(kvm, match);
556 if (r)
557 goto out_list_del;
557 558
558out: 559out:
559 srcu_read_unlock(&kvm->srcu, idx); 560 srcu_read_unlock(&kvm->srcu, idx);
@@ -593,8 +594,7 @@ static int kvm_vm_ioctl_deassign_device(struct kvm *kvm,
593 goto out; 594 goto out;
594 } 595 }
595 596
596 if (match->flags & KVM_DEV_ASSIGN_ENABLE_IOMMU) 597 kvm_deassign_device(kvm, match);
597 kvm_deassign_device(kvm, match);
598 598
599 kvm_free_assigned_device(kvm, match); 599 kvm_free_assigned_device(kvm, match);
600 600