iommu/arm-smmu-v3: Remove arm_smmu_domain_finalise() during attach

Domains are now always finalized during allocation because the core code
no longer permits a NULL dev argument to domain_alloc_paging/_flags().

Remove the late finalize during attach that supported domains that were
not fully initialized.

Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/1-v1-0bb8d5313a27+27b-smmuv3_paging_flags_jgg@nvidia.com
Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
Jason Gunthorpe 2024-12-05 11:43:27 -04:00 committed by Will Deacon
parent 6e192214c6
commit 48e7b8e284
2 changed files with 9 additions and 29 deletions

View File

@ -2460,7 +2460,6 @@ struct arm_smmu_domain *arm_smmu_domain_alloc(void)
if (!smmu_domain) if (!smmu_domain)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
mutex_init(&smmu_domain->init_mutex);
INIT_LIST_HEAD(&smmu_domain->devices); INIT_LIST_HEAD(&smmu_domain->devices);
spin_lock_init(&smmu_domain->devices_lock); spin_lock_init(&smmu_domain->devices_lock);
@ -2469,7 +2468,9 @@ struct arm_smmu_domain *arm_smmu_domain_alloc(void)
static struct iommu_domain *arm_smmu_domain_alloc_paging(struct device *dev) static struct iommu_domain *arm_smmu_domain_alloc_paging(struct device *dev)
{ {
struct arm_smmu_master *master = dev_iommu_priv_get(dev);
struct arm_smmu_domain *smmu_domain; struct arm_smmu_domain *smmu_domain;
int ret;
/* /*
* Allocate the domain and initialise some of its data structures. * Allocate the domain and initialise some of its data structures.
@ -2480,16 +2481,11 @@ static struct iommu_domain *arm_smmu_domain_alloc_paging(struct device *dev)
if (IS_ERR(smmu_domain)) if (IS_ERR(smmu_domain))
return ERR_CAST(smmu_domain); return ERR_CAST(smmu_domain);
if (dev) {
struct arm_smmu_master *master = dev_iommu_priv_get(dev);
int ret;
ret = arm_smmu_domain_finalise(smmu_domain, master->smmu, 0); ret = arm_smmu_domain_finalise(smmu_domain, master->smmu, 0);
if (ret) { if (ret) {
kfree(smmu_domain); kfree(smmu_domain);
return ERR_PTR(ret); return ERR_PTR(ret);
} }
}
return &smmu_domain->domain; return &smmu_domain->domain;
} }
@ -2965,15 +2961,7 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev)
state.master = master = dev_iommu_priv_get(dev); state.master = master = dev_iommu_priv_get(dev);
smmu = master->smmu; smmu = master->smmu;
mutex_lock(&smmu_domain->init_mutex); if (smmu_domain->smmu != smmu)
if (!smmu_domain->smmu) {
ret = arm_smmu_domain_finalise(smmu_domain, smmu, 0);
} else if (smmu_domain->smmu != smmu)
ret = -EINVAL;
mutex_unlock(&smmu_domain->init_mutex);
if (ret)
return ret; return ret;
if (smmu_domain->stage == ARM_SMMU_DOMAIN_S1) { if (smmu_domain->stage == ARM_SMMU_DOMAIN_S1) {
@ -3030,16 +3018,9 @@ static int arm_smmu_s1_set_dev_pasid(struct iommu_domain *domain,
struct arm_smmu_master *master = dev_iommu_priv_get(dev); struct arm_smmu_master *master = dev_iommu_priv_get(dev);
struct arm_smmu_device *smmu = master->smmu; struct arm_smmu_device *smmu = master->smmu;
struct arm_smmu_cd target_cd; struct arm_smmu_cd target_cd;
int ret = 0;
mutex_lock(&smmu_domain->init_mutex); if (smmu_domain->smmu != smmu)
if (!smmu_domain->smmu) return -EINVAL;
ret = arm_smmu_domain_finalise(smmu_domain, smmu, 0);
else if (smmu_domain->smmu != smmu)
ret = -EINVAL;
mutex_unlock(&smmu_domain->init_mutex);
if (ret)
return ret;
if (smmu_domain->stage != ARM_SMMU_DOMAIN_S1) if (smmu_domain->stage != ARM_SMMU_DOMAIN_S1)
return -EINVAL; return -EINVAL;

View File

@ -843,7 +843,6 @@ enum arm_smmu_domain_stage {
struct arm_smmu_domain { struct arm_smmu_domain {
struct arm_smmu_device *smmu; struct arm_smmu_device *smmu;
struct mutex init_mutex; /* Protects smmu pointer */
struct io_pgtable_ops *pgtbl_ops; struct io_pgtable_ops *pgtbl_ops;
atomic_t nr_ats_masters; atomic_t nr_ats_masters;