diff options
Diffstat (limited to 'virt')
-rw-r--r-- | virt/kvm/assigned-dev.c | 18 |
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 | ||
558 | out: | 559 | out: |
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 | ||