diff options
| -rw-r--r-- | drivers/iommu/intel/iommu.c | 20 | 
1 files changed, 12 insertions, 8 deletions
| diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c index 996a8b5ee5ee..6b8a24f68da8 100644 --- a/drivers/iommu/intel/iommu.c +++ b/drivers/iommu/intel/iommu.c @@ -2475,13 +2475,6 @@ static int domain_add_dev_info(struct dmar_domain *domain, struct device *dev)  	/* PASID table is mandatory for a PCI device in scalable mode. */  	if (sm_supported(iommu) && !dev_is_real_dma_subdevice(dev)) { -		ret = intel_pasid_alloc_table(dev); -		if (ret) { -			dev_err(dev, "PASID table allocation failed\n"); -			dmar_remove_one_dev_info(dev); -			return ret; -		} -  		/* Setup the PASID entry for requests without PASID: */  		if (hw_pass_through && domain_type_is_si(domain))  			ret = intel_pasid_setup_pass_through(iommu, domain, @@ -4106,7 +4099,6 @@ static void dmar_remove_one_dev_info(struct device *dev)  		iommu_disable_dev_iotlb(info);  		domain_context_clear(info); -		intel_pasid_free_table(info->dev);  	}  	spin_lock_irqsave(&domain->lock, flags); @@ -4466,6 +4458,7 @@ static struct iommu_device *intel_iommu_probe_device(struct device *dev)  	struct device_domain_info *info;  	struct intel_iommu *iommu;  	u8 bus, devfn; +	int ret;  	iommu = device_to_iommu(dev, &bus, &devfn);  	if (!iommu || !iommu->iommu.ops) @@ -4509,6 +4502,16 @@ static struct iommu_device *intel_iommu_probe_device(struct device *dev)  	dev_iommu_priv_set(dev, info); +	if (sm_supported(iommu) && !dev_is_real_dma_subdevice(dev)) { +		ret = intel_pasid_alloc_table(dev); +		if (ret) { +			dev_err(dev, "PASID table allocation failed\n"); +			dev_iommu_priv_set(dev, NULL); +			kfree(info); +			return ERR_PTR(ret); +		} +	} +  	return &iommu->iommu;  } @@ -4517,6 +4520,7 @@ static void intel_iommu_release_device(struct device *dev)  	struct device_domain_info *info = dev_iommu_priv_get(dev);  	dmar_remove_one_dev_info(dev); +	intel_pasid_free_table(dev);  	dev_iommu_priv_set(dev, NULL);  	kfree(info);  	set_dma_ops(dev, NULL); | 
