diff options
| -rw-r--r-- | arch/x86/include/asm/page.h | 1 | ||||
| -rw-r--r-- | arch/x86/include/asm/page_32.h | 4 | ||||
| -rw-r--r-- | arch/x86/include/asm/pgtable-2level.h | 100 | ||||
| -rw-r--r-- | arch/x86/mm/hugetlbpage.c | 9 | ||||
| -rw-r--r-- | arch/x86/mm/numa.c | 10 |
5 files changed, 70 insertions, 54 deletions
diff --git a/arch/x86/include/asm/page.h b/arch/x86/include/asm/page.h index c87892442e53..775873d3be55 100644 --- a/arch/x86/include/asm/page.h +++ b/arch/x86/include/asm/page.h | |||
| @@ -71,6 +71,7 @@ extern bool __virt_addr_valid(unsigned long kaddr); | |||
| 71 | #include <asm-generic/getorder.h> | 71 | #include <asm-generic/getorder.h> |
| 72 | 72 | ||
| 73 | #define __HAVE_ARCH_GATE_AREA 1 | 73 | #define __HAVE_ARCH_GATE_AREA 1 |
| 74 | #define HAVE_ARCH_HUGETLB_UNMAPPED_AREA | ||
| 74 | 75 | ||
| 75 | #endif /* __KERNEL__ */ | 76 | #endif /* __KERNEL__ */ |
| 76 | #endif /* _ASM_X86_PAGE_H */ | 77 | #endif /* _ASM_X86_PAGE_H */ |
diff --git a/arch/x86/include/asm/page_32.h b/arch/x86/include/asm/page_32.h index 4d550d04b609..904f528cc8e8 100644 --- a/arch/x86/include/asm/page_32.h +++ b/arch/x86/include/asm/page_32.h | |||
| @@ -5,10 +5,6 @@ | |||
| 5 | 5 | ||
| 6 | #ifndef __ASSEMBLY__ | 6 | #ifndef __ASSEMBLY__ |
| 7 | 7 | ||
| 8 | #ifdef CONFIG_HUGETLB_PAGE | ||
| 9 | #define HAVE_ARCH_HUGETLB_UNMAPPED_AREA | ||
| 10 | #endif | ||
| 11 | |||
| 12 | #define __phys_addr_nodebug(x) ((x) - PAGE_OFFSET) | 8 | #define __phys_addr_nodebug(x) ((x) - PAGE_OFFSET) |
| 13 | #ifdef CONFIG_DEBUG_VIRTUAL | 9 | #ifdef CONFIG_DEBUG_VIRTUAL |
| 14 | extern unsigned long __phys_addr(unsigned long); | 10 | extern unsigned long __phys_addr(unsigned long); |
diff --git a/arch/x86/include/asm/pgtable-2level.h b/arch/x86/include/asm/pgtable-2level.h index 3bf2dd0cf61f..0d193e234647 100644 --- a/arch/x86/include/asm/pgtable-2level.h +++ b/arch/x86/include/asm/pgtable-2level.h | |||
| @@ -55,6 +55,13 @@ static inline pmd_t native_pmdp_get_and_clear(pmd_t *xp) | |||
| 55 | #define native_pmdp_get_and_clear(xp) native_local_pmdp_get_and_clear(xp) | 55 | #define native_pmdp_get_and_clear(xp) native_local_pmdp_get_and_clear(xp) |
| 56 | #endif | 56 | #endif |
| 57 | 57 | ||
| 58 | /* Bit manipulation helper on pte/pgoff entry */ | ||
| 59 | static inline unsigned long pte_bitop(unsigned long value, unsigned int rightshift, | ||
| 60 | unsigned long mask, unsigned int leftshift) | ||
| 61 | { | ||
| 62 | return ((value >> rightshift) & mask) << leftshift; | ||
| 63 | } | ||
| 64 | |||
| 58 | #ifdef CONFIG_MEM_SOFT_DIRTY | 65 | #ifdef CONFIG_MEM_SOFT_DIRTY |
| 59 | 66 | ||
| 60 | /* | 67 | /* |
| @@ -71,31 +78,34 @@ static inline pmd_t native_pmdp_get_and_clear(pmd_t *xp) | |||
| 71 | #define PTE_FILE_BITS2 (PTE_FILE_SHIFT3 - PTE_FILE_SHIFT2 - 1) | 78 | #define PTE_FILE_BITS2 (PTE_FILE_SHIFT3 - PTE_FILE_SHIFT2 - 1) |
| 72 | #define PTE_FILE_BITS3 (PTE_FILE_SHIFT4 - PTE_FILE_SHIFT3 - 1) | 79 | #define PTE_FILE_BITS3 (PTE_FILE_SHIFT4 - PTE_FILE_SHIFT3 - 1) |
| 73 | 80 | ||
| 74 | #define pte_to_pgoff(pte) \ | 81 | #define PTE_FILE_MASK1 ((1U << PTE_FILE_BITS1) - 1) |
| 75 | ((((pte).pte_low >> (PTE_FILE_SHIFT1)) \ | 82 | #define PTE_FILE_MASK2 ((1U << PTE_FILE_BITS2) - 1) |
| 76 | & ((1U << PTE_FILE_BITS1) - 1))) \ | 83 | #define PTE_FILE_MASK3 ((1U << PTE_FILE_BITS3) - 1) |
| 77 | + ((((pte).pte_low >> (PTE_FILE_SHIFT2)) \ | 84 | |
| 78 | & ((1U << PTE_FILE_BITS2) - 1)) \ | 85 | #define PTE_FILE_LSHIFT2 (PTE_FILE_BITS1) |
| 79 | << (PTE_FILE_BITS1)) \ | 86 | #define PTE_FILE_LSHIFT3 (PTE_FILE_BITS1 + PTE_FILE_BITS2) |
| 80 | + ((((pte).pte_low >> (PTE_FILE_SHIFT3)) \ | 87 | #define PTE_FILE_LSHIFT4 (PTE_FILE_BITS1 + PTE_FILE_BITS2 + PTE_FILE_BITS3) |
| 81 | & ((1U << PTE_FILE_BITS3) - 1)) \ | 88 | |
| 82 | << (PTE_FILE_BITS1 + PTE_FILE_BITS2)) \ | 89 | static __always_inline pgoff_t pte_to_pgoff(pte_t pte) |
| 83 | + ((((pte).pte_low >> (PTE_FILE_SHIFT4))) \ | 90 | { |
| 84 | << (PTE_FILE_BITS1 + PTE_FILE_BITS2 + PTE_FILE_BITS3)) | 91 | return (pgoff_t) |
| 85 | 92 | (pte_bitop(pte.pte_low, PTE_FILE_SHIFT1, PTE_FILE_MASK1, 0) + | |
| 86 | #define pgoff_to_pte(off) \ | 93 | pte_bitop(pte.pte_low, PTE_FILE_SHIFT2, PTE_FILE_MASK2, PTE_FILE_LSHIFT2) + |
| 87 | ((pte_t) { .pte_low = \ | 94 | pte_bitop(pte.pte_low, PTE_FILE_SHIFT3, PTE_FILE_MASK3, PTE_FILE_LSHIFT3) + |
| 88 | ((((off)) & ((1U << PTE_FILE_BITS1) - 1)) << PTE_FILE_SHIFT1) \ | 95 | pte_bitop(pte.pte_low, PTE_FILE_SHIFT4, -1UL, PTE_FILE_LSHIFT4)); |
| 89 | + ((((off) >> PTE_FILE_BITS1) \ | 96 | } |
| 90 | & ((1U << PTE_FILE_BITS2) - 1)) \ | 97 | |
| 91 | << PTE_FILE_SHIFT2) \ | 98 | static __always_inline pte_t pgoff_to_pte(pgoff_t off) |
| 92 | + ((((off) >> (PTE_FILE_BITS1 + PTE_FILE_BITS2)) \ | 99 | { |
| 93 | & ((1U << PTE_FILE_BITS3) - 1)) \ | 100 | return (pte_t){ |
| 94 | << PTE_FILE_SHIFT3) \ | 101 | .pte_low = |
| 95 | + ((((off) >> \ | 102 | pte_bitop(off, 0, PTE_FILE_MASK1, PTE_FILE_SHIFT1) + |
| 96 | (PTE_FILE_BITS1 + PTE_FILE_BITS2 + PTE_FILE_BITS3))) \ | 103 | pte_bitop(off, PTE_FILE_LSHIFT2, PTE_FILE_MASK2, PTE_FILE_SHIFT2) + |
| 97 | << PTE_FILE_SHIFT4) \ | 104 | pte_bitop(off, PTE_FILE_LSHIFT3, PTE_FILE_MASK3, PTE_FILE_SHIFT3) + |
| 98 | + _PAGE_FILE }) | 105 | pte_bitop(off, PTE_FILE_LSHIFT4, -1UL, PTE_FILE_SHIFT4) + |
| 106 | _PAGE_FILE, | ||
| 107 | }; | ||
| 108 | } | ||
| 99 | 109 | ||
| 100 | #else /* CONFIG_MEM_SOFT_DIRTY */ | 110 | #else /* CONFIG_MEM_SOFT_DIRTY */ |
| 101 | 111 | ||
| @@ -115,22 +125,30 @@ static inline pmd_t native_pmdp_get_and_clear(pmd_t *xp) | |||
| 115 | #define PTE_FILE_BITS1 (PTE_FILE_SHIFT2 - PTE_FILE_SHIFT1 - 1) | 125 | #define PTE_FILE_BITS1 (PTE_FILE_SHIFT2 - PTE_FILE_SHIFT1 - 1) |
| 116 | #define PTE_FILE_BITS2 (PTE_FILE_SHIFT3 - PTE_FILE_SHIFT2 - 1) | 126 | #define PTE_FILE_BITS2 (PTE_FILE_SHIFT3 - PTE_FILE_SHIFT2 - 1) |
| 117 | 127 | ||
| 118 | #define pte_to_pgoff(pte) \ | 128 | #define PTE_FILE_MASK1 ((1U << PTE_FILE_BITS1) - 1) |
| 119 | ((((pte).pte_low >> PTE_FILE_SHIFT1) \ | 129 | #define PTE_FILE_MASK2 ((1U << PTE_FILE_BITS2) - 1) |
| 120 | & ((1U << PTE_FILE_BITS1) - 1)) \ | 130 | |
| 121 | + ((((pte).pte_low >> PTE_FILE_SHIFT2) \ | 131 | #define PTE_FILE_LSHIFT2 (PTE_FILE_BITS1) |
| 122 | & ((1U << PTE_FILE_BITS2) - 1)) << PTE_FILE_BITS1) \ | 132 | #define PTE_FILE_LSHIFT3 (PTE_FILE_BITS1 + PTE_FILE_BITS2) |
| 123 | + (((pte).pte_low >> PTE_FILE_SHIFT3) \ | 133 | |
| 124 | << (PTE_FILE_BITS1 + PTE_FILE_BITS2))) | 134 | static __always_inline pgoff_t pte_to_pgoff(pte_t pte) |
| 125 | 135 | { | |
| 126 | #define pgoff_to_pte(off) \ | 136 | return (pgoff_t) |
| 127 | ((pte_t) { .pte_low = \ | 137 | (pte_bitop(pte.pte_low, PTE_FILE_SHIFT1, PTE_FILE_MASK1, 0) + |
| 128 | (((off) & ((1U << PTE_FILE_BITS1) - 1)) << PTE_FILE_SHIFT1) \ | 138 | pte_bitop(pte.pte_low, PTE_FILE_SHIFT2, PTE_FILE_MASK2, PTE_FILE_LSHIFT2) + |
| 129 | + ((((off) >> PTE_FILE_BITS1) & ((1U << PTE_FILE_BITS2) - 1)) \ | 139 | pte_bitop(pte.pte_low, PTE_FILE_SHIFT3, -1UL, PTE_FILE_LSHIFT3)); |
| 130 | << PTE_FILE_SHIFT2) \ | 140 | } |
| 131 | + (((off) >> (PTE_FILE_BITS1 + PTE_FILE_BITS2)) \ | 141 | |
| 132 | << PTE_FILE_SHIFT3) \ | 142 | static __always_inline pte_t pgoff_to_pte(pgoff_t off) |
| 133 | + _PAGE_FILE }) | 143 | { |
| 144 | return (pte_t){ | ||
| 145 | .pte_low = | ||
| 146 | pte_bitop(off, 0, PTE_FILE_MASK1, PTE_FILE_SHIFT1) + | ||
| 147 | pte_bitop(off, PTE_FILE_LSHIFT2, PTE_FILE_MASK2, PTE_FILE_SHIFT2) + | ||
| 148 | pte_bitop(off, PTE_FILE_LSHIFT3, -1UL, PTE_FILE_SHIFT3) + | ||
| 149 | _PAGE_FILE, | ||
| 150 | }; | ||
| 151 | } | ||
| 134 | 152 | ||
| 135 | #endif /* CONFIG_MEM_SOFT_DIRTY */ | 153 | #endif /* CONFIG_MEM_SOFT_DIRTY */ |
| 136 | 154 | ||
diff --git a/arch/x86/mm/hugetlbpage.c b/arch/x86/mm/hugetlbpage.c index 9d980d88b747..8c9f647ff9e1 100644 --- a/arch/x86/mm/hugetlbpage.c +++ b/arch/x86/mm/hugetlbpage.c | |||
| @@ -87,9 +87,7 @@ int pmd_huge_support(void) | |||
| 87 | } | 87 | } |
| 88 | #endif | 88 | #endif |
| 89 | 89 | ||
| 90 | /* x86_64 also uses this file */ | 90 | #ifdef CONFIG_HUGETLB_PAGE |
| 91 | |||
| 92 | #ifdef HAVE_ARCH_HUGETLB_UNMAPPED_AREA | ||
| 93 | static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file, | 91 | static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file, |
| 94 | unsigned long addr, unsigned long len, | 92 | unsigned long addr, unsigned long len, |
| 95 | unsigned long pgoff, unsigned long flags) | 93 | unsigned long pgoff, unsigned long flags) |
| @@ -99,7 +97,7 @@ static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file, | |||
| 99 | 97 | ||
| 100 | info.flags = 0; | 98 | info.flags = 0; |
| 101 | info.length = len; | 99 | info.length = len; |
| 102 | info.low_limit = TASK_UNMAPPED_BASE; | 100 | info.low_limit = current->mm->mmap_legacy_base; |
| 103 | info.high_limit = TASK_SIZE; | 101 | info.high_limit = TASK_SIZE; |
| 104 | info.align_mask = PAGE_MASK & ~huge_page_mask(h); | 102 | info.align_mask = PAGE_MASK & ~huge_page_mask(h); |
| 105 | info.align_offset = 0; | 103 | info.align_offset = 0; |
| @@ -172,8 +170,7 @@ hugetlb_get_unmapped_area(struct file *file, unsigned long addr, | |||
| 172 | return hugetlb_get_unmapped_area_topdown(file, addr, len, | 170 | return hugetlb_get_unmapped_area_topdown(file, addr, len, |
| 173 | pgoff, flags); | 171 | pgoff, flags); |
| 174 | } | 172 | } |
| 175 | 173 | #endif /* CONFIG_HUGETLB_PAGE */ | |
| 176 | #endif /*HAVE_ARCH_HUGETLB_UNMAPPED_AREA*/ | ||
| 177 | 174 | ||
| 178 | #ifdef CONFIG_X86_64 | 175 | #ifdef CONFIG_X86_64 |
| 179 | static __init int setup_hugepagesz(char *opt) | 176 | static __init int setup_hugepagesz(char *opt) |
diff --git a/arch/x86/mm/numa.c b/arch/x86/mm/numa.c index 24aec58d6afd..c85da7bb6b60 100644 --- a/arch/x86/mm/numa.c +++ b/arch/x86/mm/numa.c | |||
| @@ -211,9 +211,13 @@ static void __init setup_node_data(int nid, u64 start, u64 end) | |||
| 211 | */ | 211 | */ |
| 212 | nd_pa = memblock_alloc_nid(nd_size, SMP_CACHE_BYTES, nid); | 212 | nd_pa = memblock_alloc_nid(nd_size, SMP_CACHE_BYTES, nid); |
| 213 | if (!nd_pa) { | 213 | if (!nd_pa) { |
| 214 | pr_err("Cannot find %zu bytes in node %d\n", | 214 | nd_pa = __memblock_alloc_base(nd_size, SMP_CACHE_BYTES, |
| 215 | nd_size, nid); | 215 | MEMBLOCK_ALLOC_ACCESSIBLE); |
| 216 | return; | 216 | if (!nd_pa) { |
| 217 | pr_err("Cannot find %zu bytes in node %d\n", | ||
| 218 | nd_size, nid); | ||
| 219 | return; | ||
| 220 | } | ||
| 217 | } | 221 | } |
| 218 | nd = __va(nd_pa); | 222 | nd = __va(nd_pa); |
| 219 | 223 | ||
