From: Kirill A. Shutemov Date: Thu, 9 Mar 2017 14:24:08 +0000 (+0300) Subject: mm: introduce __p4d_alloc() X-Git-Tag: v4.1.12-102.0.20170530_1700~9 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=f1826d5a552d1aa9e574d32d246b90300acb2bdf;p=users%2Fjedix%2Flinux-maple.git mm: introduce __p4d_alloc() For full 5-level paging we need a helper to allocate p4d page table. Signed-off-by: Kirill A. Shutemov Acked-by: Michal Hocko Signed-off-by: Linus Torvalds (cherry picked from commit 90eceff1a375f6ffa78caf8654e787c0a8a591ef) Orabug: 25808647 Signed-off-by: Vijay Kumar Reviewed-by: Bob Picco Signed-off-by: Shannon Nelson --- diff --git a/mm/memory.c b/mm/memory.c index 31fb7571bdf9c..5c5a11380df19 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -3590,6 +3590,29 @@ int handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma, } EXPORT_SYMBOL_GPL(handle_mm_fault); +#ifndef __PAGETABLE_P4D_FOLDED +/* + * Allocate p4d page table. + * We've already handled the fast-path in-line. + */ +int __p4d_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address) +{ + p4d_t *new = p4d_alloc_one(mm, address); + if (!new) + return -ENOMEM; + + smp_wmb(); /* See comment in __pte_alloc */ + + spin_lock(&mm->page_table_lock); + if (pgd_present(*pgd)) /* Another has populated it */ + p4d_free(mm, new); + else + pgd_populate(mm, pgd, new); + spin_unlock(&mm->page_table_lock); + return 0; +} +#endif /* __PAGETABLE_P4D_FOLDED */ + #ifndef __PAGETABLE_PUD_FOLDED /* * Allocate page upper directory.