summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Percival <samuel.percival@arm.com>2024-02-15 16:26:57 +0000
committerRenato Grottesi <otaner@google.com>2024-02-16 09:13:59 +0000
commit0752865ce3b4c9ea2e6bbc242af89453d196e6be (patch)
tree795f22c6f72947aff2e7b586a0095fa5d5fd7a75
parent3652f0a0fb206a8d59571fb5b93bed3a1dd8a894 (diff)
downloadgpu-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.c26
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(