diff mbox series

[v3,09/13] iommu/arm-smmu-v3: Handle failure of arm_smmu_write_ctx_desc()

Message ID 20191209180514.272727-10-jean-philippe@linaro.org
State Superseded
Headers show
Series iommu: Add PASID support to Arm SMMUv3 | expand

Commit Message

Jean-Philippe Brucker Dec. 9, 2019, 6:05 p.m. UTC
Second-level context descriptor tables will be allocated lazily in
arm_smmu_write_ctx_desc(). Help with handling allocation failure by
moving the CD write into arm_smmu_domain_finalise_s1().

Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>

---
 drivers/iommu/arm-smmu-v3.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

-- 
2.24.0

Comments

Eric Auger Dec. 17, 2019, 5:24 p.m. UTC | #1
Hi Jean,

On 12/9/19 7:05 PM, Jean-Philippe Brucker wrote:
> Second-level context descriptor tables will be allocated lazily in

> arm_smmu_write_ctx_desc(). Help with handling allocation failure by

> moving the CD write into arm_smmu_domain_finalise_s1().


nit: would rather change the title to something like "Prepare for
arm_smmu_write_ctx_desc() failure"
> 

> Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>

Reviewed-by: Eric Auger <eric.auger@redhat.com>


Thanks

Eric

> ---

>  drivers/iommu/arm-smmu-v3.c | 11 +++++++----

>  1 file changed, 7 insertions(+), 4 deletions(-)

> 

> diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c

> index f260abadde6d..fc5119f34187 100644

> --- a/drivers/iommu/arm-smmu-v3.c

> +++ b/drivers/iommu/arm-smmu-v3.c

> @@ -2301,8 +2301,15 @@ static int arm_smmu_domain_finalise_s1(struct arm_smmu_domain *smmu_domain,

>  	cfg->cd.ttbr	= pgtbl_cfg->arm_lpae_s1_cfg.ttbr[0];

>  	cfg->cd.tcr	= pgtbl_cfg->arm_lpae_s1_cfg.tcr;

>  	cfg->cd.mair	= pgtbl_cfg->arm_lpae_s1_cfg.mair;

> +

> +	ret = arm_smmu_write_ctx_desc(smmu_domain, 0, &cfg->cd);

> +	if (ret)

> +		goto out_free_tables;

> +

>  	return 0;

>  

> +out_free_tables:

> +	arm_smmu_free_cd_tables(smmu_domain);

>  out_free_asid:

>  	arm_smmu_bitmap_free(smmu->asid_map, asid);

>  	return ret;

> @@ -2569,10 +2576,6 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev)

>  	if (smmu_domain->stage != ARM_SMMU_DOMAIN_BYPASS)

>  		master->ats_enabled = arm_smmu_ats_supported(master);

>  

> -	if (smmu_domain->stage == ARM_SMMU_DOMAIN_S1)

> -		arm_smmu_write_ctx_desc(smmu_domain, 0,

> -					&smmu_domain->s1_cfg.cd);

> -

>  	arm_smmu_install_ste_for_dev(master);

>  

>  	spin_lock_irqsave(&smmu_domain->devices_lock, flags);

>
diff mbox series

Patch

diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c
index f260abadde6d..fc5119f34187 100644
--- a/drivers/iommu/arm-smmu-v3.c
+++ b/drivers/iommu/arm-smmu-v3.c
@@ -2301,8 +2301,15 @@  static int arm_smmu_domain_finalise_s1(struct arm_smmu_domain *smmu_domain,
 	cfg->cd.ttbr	= pgtbl_cfg->arm_lpae_s1_cfg.ttbr[0];
 	cfg->cd.tcr	= pgtbl_cfg->arm_lpae_s1_cfg.tcr;
 	cfg->cd.mair	= pgtbl_cfg->arm_lpae_s1_cfg.mair;
+
+	ret = arm_smmu_write_ctx_desc(smmu_domain, 0, &cfg->cd);
+	if (ret)
+		goto out_free_tables;
+
 	return 0;
 
+out_free_tables:
+	arm_smmu_free_cd_tables(smmu_domain);
 out_free_asid:
 	arm_smmu_bitmap_free(smmu->asid_map, asid);
 	return ret;
@@ -2569,10 +2576,6 @@  static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev)
 	if (smmu_domain->stage != ARM_SMMU_DOMAIN_BYPASS)
 		master->ats_enabled = arm_smmu_ats_supported(master);
 
-	if (smmu_domain->stage == ARM_SMMU_DOMAIN_S1)
-		arm_smmu_write_ctx_desc(smmu_domain, 0,
-					&smmu_domain->s1_cfg.cd);
-
 	arm_smmu_install_ste_for_dev(master);
 
 	spin_lock_irqsave(&smmu_domain->devices_lock, flags);