iommu/vt-d: Acquiring lock in domain ID allocation helpers
The iommu->lock is used to protect the per-IOMMU domain ID resource. Moving the lock into the ID alloc/free helpers makes the code more compact. At the same time, the device_domain_lock is irrelevant to the domain ID resource, remove its assertion as well. Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com> Reviewed-by: Kevin Tian <kevin.tian@intel.com> Link: https://lore.kernel.org/r/20220706025524.2904370-7-baolu.lu@linux.intel.com Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
parent
ffd5869d93
commit
2c3262f9e8
|
@ -1779,16 +1779,13 @@ static struct dmar_domain *alloc_domain(unsigned int type)
|
|||
return domain;
|
||||
}
|
||||
|
||||
/* Must be called with iommu->lock */
|
||||
static int domain_attach_iommu(struct dmar_domain *domain,
|
||||
struct intel_iommu *iommu)
|
||||
{
|
||||
unsigned long ndomains;
|
||||
int num;
|
||||
|
||||
assert_spin_locked(&device_domain_lock);
|
||||
assert_spin_locked(&iommu->lock);
|
||||
int num, ret = 0;
|
||||
|
||||
spin_lock(&iommu->lock);
|
||||
domain->iommu_refcnt[iommu->seq_id] += 1;
|
||||
if (domain->iommu_refcnt[iommu->seq_id] == 1) {
|
||||
ndomains = cap_ndoms(iommu->cap);
|
||||
|
@ -1797,7 +1794,8 @@ static int domain_attach_iommu(struct dmar_domain *domain,
|
|||
if (num >= ndomains) {
|
||||
pr_err("%s: No free domain ids\n", iommu->name);
|
||||
domain->iommu_refcnt[iommu->seq_id] -= 1;
|
||||
return -ENOSPC;
|
||||
ret = -ENOSPC;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
set_bit(num, iommu->domain_ids);
|
||||
|
@ -1806,7 +1804,9 @@ static int domain_attach_iommu(struct dmar_domain *domain,
|
|||
domain_update_iommu_cap(domain);
|
||||
}
|
||||
|
||||
return 0;
|
||||
out_unlock:
|
||||
spin_unlock(&iommu->lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void domain_detach_iommu(struct dmar_domain *domain,
|
||||
|
@ -1814,9 +1814,7 @@ static void domain_detach_iommu(struct dmar_domain *domain,
|
|||
{
|
||||
int num;
|
||||
|
||||
assert_spin_locked(&device_domain_lock);
|
||||
assert_spin_locked(&iommu->lock);
|
||||
|
||||
spin_lock(&iommu->lock);
|
||||
domain->iommu_refcnt[iommu->seq_id] -= 1;
|
||||
if (domain->iommu_refcnt[iommu->seq_id] == 0) {
|
||||
num = domain->iommu_did[iommu->seq_id];
|
||||
|
@ -1824,6 +1822,7 @@ static void domain_detach_iommu(struct dmar_domain *domain,
|
|||
domain_update_iommu_cap(domain);
|
||||
domain->iommu_did[iommu->seq_id] = 0;
|
||||
}
|
||||
spin_unlock(&iommu->lock);
|
||||
}
|
||||
|
||||
static inline int guestwidth_to_adjustwidth(int gaw)
|
||||
|
@ -2472,9 +2471,7 @@ static int domain_add_dev_info(struct dmar_domain *domain, struct device *dev)
|
|||
|
||||
spin_lock(&device_domain_lock);
|
||||
info->domain = domain;
|
||||
spin_lock(&iommu->lock);
|
||||
ret = domain_attach_iommu(domain, iommu);
|
||||
spin_unlock(&iommu->lock);
|
||||
if (ret) {
|
||||
spin_unlock(&device_domain_lock);
|
||||
return ret;
|
||||
|
@ -4178,10 +4175,7 @@ static void __dmar_remove_one_dev_info(struct device_domain_info *info)
|
|||
}
|
||||
|
||||
list_del(&info->link);
|
||||
|
||||
spin_lock(&iommu->lock);
|
||||
domain_detach_iommu(domain, iommu);
|
||||
spin_unlock(&iommu->lock);
|
||||
}
|
||||
|
||||
static void dmar_remove_one_dev_info(struct device *dev)
|
||||
|
|
Loading…
Reference in New Issue