diff options
| -rw-r--r-- | Documentation/virtual/kvm/api.txt | 3 | ||||
| -rw-r--r-- | virt/kvm/assigned-dev.c | 18 | 
2 files changed, 12 insertions, 9 deletions
diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt index 7945b0bd35e..ee2c96b3ba5 100644 --- a/Documentation/virtual/kvm/api.txt +++ b/Documentation/virtual/kvm/api.txt @@ -1151,6 +1151,9 @@ following flags are specified:  /* Depends on KVM_CAP_IOMMU */  #define KVM_DEV_ASSIGN_ENABLE_IOMMU	(1 << 0) +The KVM_DEV_ASSIGN_ENABLE_IOMMU flag is a mandatory option to ensure +isolation of the device.  Usages not specifying this flag are deprecated. +  4.49 KVM_DEASSIGN_PCI_DEVICE  Capability: KVM_CAP_DEVICE_DEASSIGNMENT diff --git a/virt/kvm/assigned-dev.c b/virt/kvm/assigned-dev.c index 3ad0925d23a..a251a28f79c 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,  	struct kvm_assigned_dev_kernel *match;  	struct pci_dev *dev; +	if (!(assigned_dev->flags & KVM_DEV_ASSIGN_ENABLE_IOMMU)) +		return -EINVAL; +  	mutex_lock(&kvm->lock);  	idx = srcu_read_lock(&kvm->srcu); @@ -544,16 +547,14 @@ static int kvm_vm_ioctl_assign_device(struct kvm *kvm,  	list_add(&match->list, &kvm->arch.assigned_dev_head); -	if (assigned_dev->flags & KVM_DEV_ASSIGN_ENABLE_IOMMU) { -		if (!kvm->arch.iommu_domain) { -			r = kvm_iommu_map_guest(kvm); -			if (r) -				goto out_list_del; -		} -		r = kvm_assign_device(kvm, match); +	if (!kvm->arch.iommu_domain) { +		r = kvm_iommu_map_guest(kvm);  		if (r)  			goto out_list_del;  	} +	r = kvm_assign_device(kvm, match); +	if (r) +		goto out_list_del;  out:  	srcu_read_unlock(&kvm->srcu, idx); @@ -593,8 +594,7 @@ static int kvm_vm_ioctl_deassign_device(struct kvm *kvm,  		goto out;  	} -	if (match->flags & KVM_DEV_ASSIGN_ENABLE_IOMMU) -		kvm_deassign_device(kvm, match); +	kvm_deassign_device(kvm, match);  	kvm_free_assigned_device(kvm, match);  |