mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-25 16:30:53 +07:00
iommu/amd: Optimize iommu_unmap_page for new fetch_pte interface
Now that fetch_pte returns the page-size of the pte, this function can be optimized a lot. Tested-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com> Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
parent
3039ca1b1c
commit
71b390e9be
@ -1428,8 +1428,8 @@ static unsigned long iommu_unmap_page(struct protection_domain *dom,
|
||||
unsigned long bus_addr,
|
||||
unsigned long page_size)
|
||||
{
|
||||
unsigned long long unmap_size, unmapped;
|
||||
unsigned long pte_pgsize;
|
||||
unsigned long long unmapped;
|
||||
unsigned long unmap_size;
|
||||
u64 *pte;
|
||||
|
||||
BUG_ON(!is_power_of_2(page_size));
|
||||
@ -1438,28 +1438,12 @@ static unsigned long iommu_unmap_page(struct protection_domain *dom,
|
||||
|
||||
while (unmapped < page_size) {
|
||||
|
||||
pte = fetch_pte(dom, bus_addr, &pte_pgsize);
|
||||
pte = fetch_pte(dom, bus_addr, &unmap_size);
|
||||
|
||||
if (!pte) {
|
||||
/*
|
||||
* No PTE for this address
|
||||
* move forward in 4kb steps
|
||||
*/
|
||||
unmap_size = PAGE_SIZE;
|
||||
} else if (PM_PTE_LEVEL(*pte) == 0) {
|
||||
/* 4kb PTE found for this address */
|
||||
unmap_size = PAGE_SIZE;
|
||||
*pte = 0ULL;
|
||||
} else {
|
||||
int count, i;
|
||||
if (pte) {
|
||||
int i, count;
|
||||
|
||||
/* Large PTE found which maps this address */
|
||||
unmap_size = PTE_PAGE_SIZE(*pte);
|
||||
|
||||
/* Only unmap from the first pte in the page */
|
||||
if ((unmap_size - 1) & bus_addr)
|
||||
break;
|
||||
count = PAGE_SIZE_PTE_COUNT(unmap_size);
|
||||
count = PAGE_SIZE_PTE_COUNT(unmap_size);
|
||||
for (i = 0; i < count; i++)
|
||||
pte[i] = 0ULL;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user