arm64: mm: Correct show_pte behaviour
authorSteve Capper <steve.capper@linaro.org>
Fri, 19 Apr 2013 14:49:31 +0000 (15:49 +0100)
committerCatalin Marinas <catalin.marinas@arm.com>
Thu, 25 Apr 2013 16:45:52 +0000 (17:45 +0100)
show_pte makes use of the *_none_or_clear_bad style functions. If a
pgd, pud or pmd is identified as being bad, it will then be cleared.

As show_pte appears to be called from either the user or kernel
fault handlers this side effect can lead to unpredictable behaviour;
especially as TLB entries are not invalidated.

This patch removes the page table sanitisation from show_pte. If a
bad pgd, pud or pmd is encountered it is left unmodified.

Signed-off-by: Steve Capper <steve.capper@linaro.org>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm64/mm/fault.c

index afadae6682ed8b867f6165b0e92860f0f0cc566d..52638171d6fdc3f1e287442e1564fe48a41b526e 100644 (file)
@@ -57,16 +57,16 @@ void show_pte(struct mm_struct *mm, unsigned long addr)
                pmd_t *pmd;
                pte_t *pte;
 
-               if (pgd_none_or_clear_bad(pgd))
+               if (pgd_none(*pgd) || pgd_bad(*pgd))
                        break;
 
                pud = pud_offset(pgd, addr);
-               if (pud_none_or_clear_bad(pud))
+               if (pud_none(*pud) || pud_bad(*pud))
                        break;
 
                pmd = pmd_offset(pud, addr);
                printk(", *pmd=%016llx", pmd_val(*pmd));
-               if (pmd_none_or_clear_bad(pmd))
+               if (pmd_none(*pmd) || pmd_bad(*pmd))
                        break;
 
                pte = pte_offset_map(pmd, addr);