iommu/amd: Remove conditions from domain free paths
authorJason Gunthorpe <jgg@nvidia.com>
Fri, 30 Aug 2024 00:06:19 +0000 (21:06 -0300)
committerJoerg Roedel <jroedel@suse.de>
Wed, 4 Sep 2024 09:39:01 +0000 (11:39 +0200)
Don't use tlb as some flag to indicate if protection_domain_alloc()
completed. Have protection_domain_alloc() unwind itself in the normal
kernel style and require protection_domain_free() only be called on
successful results of protection_domain_alloc().

Also, the amd_iommu_domain_free() op is never called by the core code with
a NULL argument, so remove all the NULL tests as well.

Reviewed-by: Vasant Hegde <vasant.hegde@amd.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/10-v2-831cdc4d00f3+1a315-amd_iopgtbl_jgg@nvidia.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/amd/iommu.c

index 44231c3b6b71eedbf9e729163eaa3798e291ddd1..2876ac42ae2d44aa226f9fe009b91a106079b309 100644 (file)
@@ -2253,17 +2253,9 @@ static void cleanup_domain(struct protection_domain *domain)
 
 void protection_domain_free(struct protection_domain *domain)
 {
-       if (!domain)
-               return;
-
        WARN_ON(!list_empty(&domain->dev_list));
-
-       if (domain->iop.pgtbl.cfg.tlb)
-               free_io_pgtable_ops(&domain->iop.pgtbl.ops);
-
-       if (domain->id)
-               domain_id_free(domain->id);
-
+       free_io_pgtable_ops(&domain->iop.pgtbl.ops);
+       domain_id_free(domain->id);
        kfree(domain);
 }
 
@@ -2279,7 +2271,7 @@ struct protection_domain *protection_domain_alloc(unsigned int type, int nid)
 
        domain->id = domain_id_alloc();
        if (!domain->id)
-               goto out_err;
+               goto err_free;
 
        spin_lock_init(&domain->lock);
        INIT_LIST_HEAD(&domain->dev_list);
@@ -2302,7 +2294,7 @@ struct protection_domain *protection_domain_alloc(unsigned int type, int nid)
                pgtable = AMD_IOMMU_V1;
                break;
        default:
-               goto out_err;
+               goto err_id;
        }
 
        switch (pgtable) {
@@ -2313,17 +2305,19 @@ struct protection_domain *protection_domain_alloc(unsigned int type, int nid)
                domain->pd_mode = PD_MODE_V2;
                break;
        default:
-               goto out_err;
+               goto err_id;
        }
 
        pgtbl_ops =
                alloc_io_pgtable_ops(pgtable, &domain->iop.pgtbl.cfg, domain);
        if (!pgtbl_ops)
-               goto out_err;
+               goto err_id;
 
        return domain;
-out_err:
-       protection_domain_free(domain);
+err_id:
+       domain_id_free(domain->id);
+err_free:
+       kfree(domain);
        return NULL;
 }
 
@@ -2412,9 +2406,6 @@ void amd_iommu_domain_free(struct iommu_domain *dom)
        struct protection_domain *domain;
        unsigned long flags;
 
-       if (!dom)
-               return;
-
        domain = to_pdomain(dom);
 
        spin_lock_irqsave(&domain->lock, flags);