mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-11 07:11:51 -04:00
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:
committed by
Will Deacon
parent
6e192214c6
commit
48e7b8e284
@@ -2460,7 +2460,6 @@ struct arm_smmu_domain *arm_smmu_domain_alloc(void)
|
||||
if (!smmu_domain)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
mutex_init(&smmu_domain->init_mutex);
|
||||
INIT_LIST_HEAD(&smmu_domain->devices);
|
||||
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)
|
||||
{
|
||||
struct arm_smmu_master *master = dev_iommu_priv_get(dev);
|
||||
struct arm_smmu_domain *smmu_domain;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* Allocate the domain and initialise some of its data structures.
|
||||
@@ -2480,15 +2481,10 @@ static struct iommu_domain *arm_smmu_domain_alloc_paging(struct device *dev)
|
||||
if (IS_ERR(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);
|
||||
if (ret) {
|
||||
kfree(smmu_domain);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
ret = arm_smmu_domain_finalise(smmu_domain, master->smmu, 0);
|
||||
if (ret) {
|
||||
kfree(smmu_domain);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
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);
|
||||
smmu = master->smmu;
|
||||
|
||||
mutex_lock(&smmu_domain->init_mutex);
|
||||
|
||||
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)
|
||||
if (smmu_domain->smmu != smmu)
|
||||
return ret;
|
||||
|
||||
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_device *smmu = master->smmu;
|
||||
struct arm_smmu_cd target_cd;
|
||||
int ret = 0;
|
||||
|
||||
mutex_lock(&smmu_domain->init_mutex);
|
||||
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;
|
||||
if (smmu_domain->smmu != smmu)
|
||||
return -EINVAL;
|
||||
|
||||
if (smmu_domain->stage != ARM_SMMU_DOMAIN_S1)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -843,7 +843,6 @@ enum arm_smmu_domain_stage {
|
||||
|
||||
struct arm_smmu_domain {
|
||||
struct arm_smmu_device *smmu;
|
||||
struct mutex init_mutex; /* Protects smmu pointer */
|
||||
|
||||
struct io_pgtable_ops *pgtbl_ops;
|
||||
atomic_t nr_ats_masters;
|
||||
|
||||
Reference in New Issue
Block a user