]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
iommu/amd: Remove amd_iommu_domain_update() from page table freeing
authorJason Gunthorpe <jgg@nvidia.com>
Fri, 30 Aug 2024 00:06:13 +0000 (21:06 -0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 5 Dec 2024 12:53:34 +0000 (13:53 +0100)
[ Upstream commit 322d889ae7d39f8538a6deac35869aa3be1855bd ]

It is a serious bug if the domain is still mapped to any DTEs when it is
freed as we immediately start freeing page table memory, so any remaining
HW touch will UAF.

If it is not mapped then dev_list is empty and amd_iommu_domain_update()
does nothing.

Remove it and add a WARN_ON() to catch this class of bug.

Reviewed-by: Vasant Hegde <vasant.hegde@amd.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/4-v2-831cdc4d00f3+1a315-amd_iopgtbl_jgg@nvidia.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
Stable-dep-of: 016991606aa0 ("iommu/amd/pgtbl_v2: Take protection domain lock before invalidating TLB")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/iommu/amd/io_pgtable.c
drivers/iommu/amd/iommu.c

index 05aed3cb46f1bfe2ec92c95987266f2e1b61e924..b3991ad1ae8ea3edd6498950eed372f39912e410 100644 (file)
@@ -578,9 +578,6 @@ static void v1_free_pgtable(struct io_pgtable *iop)
 
        /* Update data structure */
        amd_iommu_domain_clr_pt_root(dom);
-
-       /* Make changes visible to IOMMUs */
-       amd_iommu_domain_update(dom);
 }
 
 static struct io_pgtable *v1_alloc_pgtable(struct io_pgtable_cfg *cfg, void *cookie)
index 1a61f14459e4fe12c86d0c7e4db6bee968af4ed4..881f6c589257cc38fbc458b0e7d196d016093125 100644 (file)
@@ -2262,6 +2262,8 @@ 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.iop.ops);