Skip to content

Commit

Permalink
iommu/amd: Fix I/O page table memory leak
Browse files Browse the repository at this point in the history
[ Upstream commit 6b0b2d9 ]

The current logic updates the I/O page table mode for the domain
before calling the logic to free memory used for the page table.
This results in IOMMU page table memory leak, and can be observed
when launching VM w/ pass-through devices.

Fix by freeing the memory used for page table before updating the mode.

Cc: Joerg Roedel <joro@8bytes.org>
Reported-by: Daniel Jordan <daniel.m.jordan@oracle.com>
Tested-by: Daniel Jordan <daniel.m.jordan@oracle.com>
Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Fixes: e42ba06 ("iommu/amd: Restructure code for freeing page table")
Link: https://lore.kernel.org/all/20220118194720.urjgi73b7c3tq2o6@oracle.com/
Link: https://lore.kernel.org/r/20220210154745.11524-1-suravee.suthikulpanit@amd.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
ssuthiku-amd authored and gregkh committed Mar 8, 2022
1 parent f6cabb7 commit 378e2fe
Showing 1 changed file with 6 additions and 6 deletions.
12 changes: 6 additions & 6 deletions drivers/iommu/amd/io_pgtable.c
Expand Up @@ -519,19 +519,19 @@ static void v1_free_pgtable(struct io_pgtable *iop)

dom = container_of(pgtable, struct protection_domain, iop);

/* Update data structure */
amd_iommu_domain_clr_pt_root(dom);

/* Make changes visible to IOMMUs */
amd_iommu_domain_update(dom);

/* Page-table is not visible to IOMMU anymore, so free it */
BUG_ON(pgtable->mode < PAGE_MODE_NONE ||
pgtable->mode > PAGE_MODE_6_LEVEL);

root = (unsigned long)pgtable->root;
freelist = free_sub_pt(root, pgtable->mode, freelist);

/* Update data structure */
amd_iommu_domain_clr_pt_root(dom);

/* Make changes visible to IOMMUs */
amd_iommu_domain_update(dom);

free_page_list(freelist);
}

Expand Down

0 comments on commit 378e2fe

Please sign in to comment.