diff options
author | Samuel Percival <samuel.percival@arm.com> | 2024-02-15 16:26:57 +0000 |
---|---|---|
committer | Renato Grottesi <otaner@google.com> | 2024-02-16 09:13:59 +0000 |
commit | 0752865ce3b4c9ea2e6bbc242af89453d196e6be (patch) | |
tree | 795f22c6f72947aff2e7b586a0095fa5d5fd7a75 | |
parent | 3652f0a0fb206a8d59571fb5b93bed3a1dd8a894 (diff) | |
download | gpu-0752865ce3b4c9ea2e6bbc242af89453d196e6be.tar.gz |
GPUCORE-40994 robustness enhancementandroid-15-dp-2_r0.7
Improve MMU page teardown.
Provenance: https://code.ipdelivery.arm.com/c/GPU/mali-ddk/+/6429
Test: local build and boot
Bug: 315967882
Signed-off-by: Renato Grottesi <otaner@google.com>
Change-Id: Idb0afac63d6ee5f13f7fd72b7060e3fd1f49391a
-rw-r--r-- | mali_kbase/mmu/mali_kbase_mmu.c | 26 |
1 files changed, 7 insertions, 19 deletions
diff --git a/mali_kbase/mmu/mali_kbase_mmu.c b/mali_kbase/mmu/mali_kbase_mmu.c index 3afde2f..363aea9 100644 --- a/mali_kbase/mmu/mali_kbase_mmu.c +++ b/mali_kbase/mmu/mali_kbase_mmu.c @@ -2907,8 +2907,7 @@ static int kbase_mmu_teardown_pgd_pages(struct kbase_device *kbdev, struct kbase phys_addr_t pgd = mmut->pgd; struct page *p = phys_to_page(pgd); - if (count > nr) - count = nr; + count = MIN(nr, count); /* need to check if this is a 2MB page or a small page */ for (level = MIDGARD_MMU_TOPLEVEL; level <= MIDGARD_MMU_BOTTOMLEVEL; level++) { @@ -2919,23 +2918,12 @@ static int kbase_mmu_teardown_pgd_pages(struct kbase_device *kbdev, struct kbase if (mmu_mode->ate_is_valid(page[index], level)) break; /* keep the mapping */ else if (!mmu_mode->pte_is_valid(page[index], level)) { - /* nothing here, advance */ - switch (level) { - case MIDGARD_MMU_LEVEL(0): - count = 134217728; - break; - case MIDGARD_MMU_LEVEL(1): - count = 262144; - break; - case MIDGARD_MMU_LEVEL(2): - count = 512; - break; - case MIDGARD_MMU_LEVEL(3): - count = 1; - break; - } - if (count > nr) - count = nr; + dev_warn(kbdev->dev, "Invalid PTE found @ level %d for VA %llx", + level, vpfn << PAGE_SHIFT); + /* nothing here, advance to the next PTE of the current level */ + count = (1 << ((3 - level) * 9)); + count -= (vpfn & (count - 1)); + count = MIN(nr, count); goto next; } next_pgd = mmu_mode->pte_to_phy_addr( |