diff options
Diffstat (limited to 'drivers/iommu/intel/iommu.c')
| -rw-r--r-- | drivers/iommu/intel/iommu.c | 20 | 
1 files changed, 10 insertions, 10 deletions
diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c index 2e9811bf2a4e..fd11a080380c 100644 --- a/drivers/iommu/intel/iommu.c +++ b/drivers/iommu/intel/iommu.c @@ -2114,12 +2114,6 @@ static int dmar_domain_attach_device(struct dmar_domain *domain,  	if (ret)  		return ret; -	ret = cache_tag_assign_domain(domain, dev, IOMMU_NO_PASID); -	if (ret) { -		domain_detach_iommu(domain, iommu); -		return ret; -	} -  	info->domain = domain;  	spin_lock_irqsave(&domain->lock, flags);  	list_add(&info->link, &domain->devices); @@ -2137,15 +2131,21 @@ static int dmar_domain_attach_device(struct dmar_domain *domain,  	else  		ret = intel_pasid_setup_second_level(iommu, domain, dev, IOMMU_NO_PASID); -	if (ret) { -		device_block_translation(dev); -		return ret; -	} +	if (ret) +		goto out_block_translation;  	if (sm_supported(info->iommu) || !domain_type_is_si(info->domain))  		iommu_enable_pci_caps(info); +	ret = cache_tag_assign_domain(domain, dev, IOMMU_NO_PASID); +	if (ret) +		goto out_block_translation; +  	return 0; + +out_block_translation: +	device_block_translation(dev); +	return ret;  }  /**  |