Messages in this thread Patch in this message | | | From | Lai Jiangshan <> | Subject | [PATCH 2/2] x86/mm/pti: warn and stop when pti_clone_pagetable() is on 1G page | Date | Mon, 30 Nov 2020 23:25:16 +0800 |
| |
From: Lai Jiangshan <laijs@linux.alibaba.com>
All callers don't call pti_clone_pagetable() on range that includes pud large page(1G). If it were called in such case, there would be bugs in the caller size, so it worth a warning for robustness.
Also add check for pgd_large() & p4d_large() with the same reason, and pgd_large() & p4d_large() are constant 0 which just acts as self-comment in code without overhead.
Signed-off-by: Lai Jiangshan <laijs@linux.alibaba.com> --- arch/x86/mm/pti.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/arch/x86/mm/pti.c b/arch/x86/mm/pti.c index a229320515da..89366fec956b 100644 --- a/arch/x86/mm/pti.c +++ b/arch/x86/mm/pti.c @@ -321,10 +321,10 @@ pti_clone_pgtable(unsigned long start, unsigned long end, break; pgd = pgd_offset_k(addr); - if (WARN_ON(pgd_none(*pgd))) + if (WARN_ON(pgd_none(*pgd) || pgd_large(*pgd))) return; p4d = p4d_offset(pgd, addr); - if (WARN_ON(p4d_none(*p4d))) + if (WARN_ON(p4d_none(*p4d) || p4d_large(*p4d))) return; pud = pud_offset(p4d, addr); @@ -333,6 +333,8 @@ pti_clone_pgtable(unsigned long start, unsigned long end, addr = round_up(addr + 1, PUD_SIZE); continue; } + if (WARN_ON(pud_large(*pud))) + return; pmd = pmd_offset(pud, addr); if (pmd_none(*pmd)) { -- 2.19.1.6.gb485710b
| |