mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-09 02:00:43 -04:00
Merge branch 'prep-for-5level'
Merge 5-level page table prep from Kirill Shutemov: "Here's relatively low-risk part of 5-level paging patchset. Merging it now will make x86 5-level paging enabling in v4.12 easier. The first patch is actually x86-specific: detect 5-level paging support. It boils down to single define. The rest of patchset converts Linux MMU abstraction from 4- to 5-level paging. Enabling of new abstraction in most cases requires adding single line of code in arch-specific code. The rest is taken care by asm-generic/. Changes to mm/ code are mostly mechanical: add support for new page table level -- p4d_t -- where we deal with pud_t now. v2: - fix build on microblaze (Michal); - comment for __ARCH_HAS_5LEVEL_HACK in kasan_populate_zero_shadow(); - acks from Michal" * emailed patches from Kirill A Shutemov <kirill.shutemov@linux.intel.com>: mm: introduce __p4d_alloc() mm: convert generic code to 5-level paging asm-generic: introduce <asm-generic/pgtable-nop4d.h> arch, mm: convert all architectures to use 5level-fixup.h asm-generic: introduce __ARCH_USE_5LEVEL_HACK asm-generic: introduce 5level-fixup.h x86/cpufeature: Add 5-level paging detection
This commit is contained in:
@@ -122,7 +122,7 @@ struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address,
|
||||
struct page *follow_huge_pud(struct mm_struct *mm, unsigned long address,
|
||||
pud_t *pud, int flags);
|
||||
int pmd_huge(pmd_t pmd);
|
||||
int pud_huge(pud_t pmd);
|
||||
int pud_huge(pud_t pud);
|
||||
unsigned long hugetlb_change_protection(struct vm_area_struct *vma,
|
||||
unsigned long address, unsigned long end, pgprot_t newprot);
|
||||
|
||||
@@ -197,6 +197,9 @@ static inline void __unmap_hugepage_range(struct mmu_gather *tlb,
|
||||
#ifndef pgd_huge
|
||||
#define pgd_huge(x) 0
|
||||
#endif
|
||||
#ifndef p4d_huge
|
||||
#define p4d_huge(x) 0
|
||||
#endif
|
||||
|
||||
#ifndef pgd_write
|
||||
static inline int pgd_write(pgd_t pgd)
|
||||
|
||||
@@ -18,6 +18,7 @@ extern unsigned char kasan_zero_page[PAGE_SIZE];
|
||||
extern pte_t kasan_zero_pte[PTRS_PER_PTE];
|
||||
extern pmd_t kasan_zero_pmd[PTRS_PER_PMD];
|
||||
extern pud_t kasan_zero_pud[PTRS_PER_PUD];
|
||||
extern p4d_t kasan_zero_p4d[PTRS_PER_P4D];
|
||||
|
||||
void kasan_populate_zero_shadow(const void *shadow_start,
|
||||
const void *shadow_end);
|
||||
|
||||
@@ -1560,14 +1560,24 @@ static inline pte_t *get_locked_pte(struct mm_struct *mm, unsigned long addr,
|
||||
return ptep;
|
||||
}
|
||||
|
||||
#ifdef __PAGETABLE_PUD_FOLDED
|
||||
static inline int __pud_alloc(struct mm_struct *mm, pgd_t *pgd,
|
||||
#ifdef __PAGETABLE_P4D_FOLDED
|
||||
static inline int __p4d_alloc(struct mm_struct *mm, pgd_t *pgd,
|
||||
unsigned long address)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
int __pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address);
|
||||
int __p4d_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address);
|
||||
#endif
|
||||
|
||||
#ifdef __PAGETABLE_PUD_FOLDED
|
||||
static inline int __pud_alloc(struct mm_struct *mm, p4d_t *p4d,
|
||||
unsigned long address)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
int __pud_alloc(struct mm_struct *mm, p4d_t *p4d, unsigned long address);
|
||||
#endif
|
||||
|
||||
#if defined(__PAGETABLE_PMD_FOLDED) || !defined(CONFIG_MMU)
|
||||
@@ -1619,12 +1629,23 @@ int __pte_alloc_kernel(pmd_t *pmd, unsigned long address);
|
||||
* Remove it when 4level-fixup.h has been removed.
|
||||
*/
|
||||
#if defined(CONFIG_MMU) && !defined(__ARCH_HAS_4LEVEL_HACK)
|
||||
static inline pud_t *pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address)
|
||||
|
||||
#ifndef __ARCH_HAS_5LEVEL_HACK
|
||||
static inline p4d_t *p4d_alloc(struct mm_struct *mm, pgd_t *pgd,
|
||||
unsigned long address)
|
||||
{
|
||||
return (unlikely(pgd_none(*pgd)) && __pud_alloc(mm, pgd, address))?
|
||||
NULL: pud_offset(pgd, address);
|
||||
return (unlikely(pgd_none(*pgd)) && __p4d_alloc(mm, pgd, address)) ?
|
||||
NULL : p4d_offset(pgd, address);
|
||||
}
|
||||
|
||||
static inline pud_t *pud_alloc(struct mm_struct *mm, p4d_t *p4d,
|
||||
unsigned long address)
|
||||
{
|
||||
return (unlikely(p4d_none(*p4d)) && __pud_alloc(mm, p4d, address)) ?
|
||||
NULL : pud_offset(p4d, address);
|
||||
}
|
||||
#endif /* !__ARCH_HAS_5LEVEL_HACK */
|
||||
|
||||
static inline pmd_t *pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address)
|
||||
{
|
||||
return (unlikely(pud_none(*pud)) && __pmd_alloc(mm, pud, address))?
|
||||
@@ -2385,7 +2406,8 @@ void sparse_mem_maps_populate_node(struct page **map_map,
|
||||
|
||||
struct page *sparse_mem_map_populate(unsigned long pnum, int nid);
|
||||
pgd_t *vmemmap_pgd_populate(unsigned long addr, int node);
|
||||
pud_t *vmemmap_pud_populate(pgd_t *pgd, unsigned long addr, int node);
|
||||
p4d_t *vmemmap_p4d_populate(pgd_t *pgd, unsigned long addr, int node);
|
||||
pud_t *vmemmap_pud_populate(p4d_t *p4d, unsigned long addr, int node);
|
||||
pmd_t *vmemmap_pmd_populate(pud_t *pud, unsigned long addr, int node);
|
||||
pte_t *vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int node);
|
||||
void *vmemmap_alloc_block(unsigned long size, int node);
|
||||
|
||||
Reference in New Issue
Block a user