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:50 +0000 |
commit | 6b217b43f0424690a7febf9b2b60aa34ea973eda (patch) | |
tree | 283a05c35f39d822bbb9bdcc05b2b542bafa4b3d | |
parent | 0781d08e1eb2fce0dc82582a41ecd183d75fad71 (diff) | |
download | gpu-6b217b43f0424690a7febf9b2b60aa34ea973eda.tar.gz |
GPUCORE-40994 robustness enhancementandroid-15-dp-2_r0.5android-15-dp-2_r0.4android-15-dp-2_r0.3android-15-dp-2_r0.2
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 9775adf..0e73641 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( |