diff options
author | Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> | 2017-06-01 10:35:04 -0400 |
---|---|---|
committer | Michael Ellerman <mpe@ellerman.id.au> | 2017-06-08 06:42:56 -0400 |
commit | 92d9dfda8b547cc292af27e11e11c9eff3bb574f (patch) | |
tree | 1fa68d2a4d3a5857040e388f2d514ef25222b050 | |
parent | cec422c11caeeccae709e9942058b6b644ce434c (diff) |
powerpc/mm/4k: Limit 4k page size config to 64TB virtual address space
Supporting 512TB requires us to do a order 3 allocation for level 1 page
table (pgd). This results in page allocation failures with certain workloads.
For now limit 4k linux page size config to 64TB.
Fixes: f6eedbba7a26 ("powerpc/mm/hash: Increase VA range to 128TB")
Reported-by: Hugh Dickins <hughd@google.com>
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
-rw-r--r-- | arch/powerpc/include/asm/book3s/64/hash-4k.h | 2 | ||||
-rw-r--r-- | arch/powerpc/include/asm/processor.h | 25 | ||||
-rw-r--r-- | arch/powerpc/kernel/setup-common.c | 2 | ||||
-rw-r--r-- | arch/powerpc/mm/mmu_context_book3s64.c | 2 |
4 files changed, 15 insertions, 16 deletions
diff --git a/arch/powerpc/include/asm/book3s/64/hash-4k.h b/arch/powerpc/include/asm/book3s/64/hash-4k.h index b4b5e6b671ca..0c4e470571ca 100644 --- a/arch/powerpc/include/asm/book3s/64/hash-4k.h +++ b/arch/powerpc/include/asm/book3s/64/hash-4k.h | |||
@@ -8,7 +8,7 @@ | |||
8 | #define H_PTE_INDEX_SIZE 9 | 8 | #define H_PTE_INDEX_SIZE 9 |
9 | #define H_PMD_INDEX_SIZE 7 | 9 | #define H_PMD_INDEX_SIZE 7 |
10 | #define H_PUD_INDEX_SIZE 9 | 10 | #define H_PUD_INDEX_SIZE 9 |
11 | #define H_PGD_INDEX_SIZE 12 | 11 | #define H_PGD_INDEX_SIZE 9 |
12 | 12 | ||
13 | #ifndef __ASSEMBLY__ | 13 | #ifndef __ASSEMBLY__ |
14 | #define H_PTE_TABLE_SIZE (sizeof(pte_t) << H_PTE_INDEX_SIZE) | 14 | #define H_PTE_TABLE_SIZE (sizeof(pte_t) << H_PTE_INDEX_SIZE) |
diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h index a2123f291ab0..bb99b651085a 100644 --- a/arch/powerpc/include/asm/processor.h +++ b/arch/powerpc/include/asm/processor.h | |||
@@ -110,13 +110,18 @@ void release_thread(struct task_struct *); | |||
110 | #define TASK_SIZE_128TB (0x0000800000000000UL) | 110 | #define TASK_SIZE_128TB (0x0000800000000000UL) |
111 | #define TASK_SIZE_512TB (0x0002000000000000UL) | 111 | #define TASK_SIZE_512TB (0x0002000000000000UL) |
112 | 112 | ||
113 | #ifdef CONFIG_PPC_BOOK3S_64 | 113 | /* |
114 | * For now 512TB is only supported with book3s and 64K linux page size. | ||
115 | */ | ||
116 | #if defined(CONFIG_PPC_BOOK3S_64) && defined(CONFIG_PPC_64K_PAGES) | ||
114 | /* | 117 | /* |
115 | * Max value currently used: | 118 | * Max value currently used: |
116 | */ | 119 | */ |
117 | #define TASK_SIZE_USER64 TASK_SIZE_512TB | 120 | #define TASK_SIZE_USER64 TASK_SIZE_512TB |
121 | #define DEFAULT_MAP_WINDOW_USER64 TASK_SIZE_128TB | ||
118 | #else | 122 | #else |
119 | #define TASK_SIZE_USER64 TASK_SIZE_64TB | 123 | #define TASK_SIZE_USER64 TASK_SIZE_64TB |
124 | #define DEFAULT_MAP_WINDOW_USER64 TASK_SIZE_64TB | ||
120 | #endif | 125 | #endif |
121 | 126 | ||
122 | /* | 127 | /* |
@@ -132,7 +137,7 @@ void release_thread(struct task_struct *); | |||
132 | * space during mmap's. | 137 | * space during mmap's. |
133 | */ | 138 | */ |
134 | #define TASK_UNMAPPED_BASE_USER32 (PAGE_ALIGN(TASK_SIZE_USER32 / 4)) | 139 | #define TASK_UNMAPPED_BASE_USER32 (PAGE_ALIGN(TASK_SIZE_USER32 / 4)) |
135 | #define TASK_UNMAPPED_BASE_USER64 (PAGE_ALIGN(TASK_SIZE_128TB / 4)) | 140 | #define TASK_UNMAPPED_BASE_USER64 (PAGE_ALIGN(DEFAULT_MAP_WINDOW_USER64 / 4)) |
136 | 141 | ||
137 | #define TASK_UNMAPPED_BASE ((is_32bit_task()) ? \ | 142 | #define TASK_UNMAPPED_BASE ((is_32bit_task()) ? \ |
138 | TASK_UNMAPPED_BASE_USER32 : TASK_UNMAPPED_BASE_USER64 ) | 143 | TASK_UNMAPPED_BASE_USER32 : TASK_UNMAPPED_BASE_USER64 ) |
@@ -143,21 +148,15 @@ void release_thread(struct task_struct *); | |||
143 | * with 128TB and conditionally enable upto 512TB | 148 | * with 128TB and conditionally enable upto 512TB |
144 | */ | 149 | */ |
145 | #ifdef CONFIG_PPC_BOOK3S_64 | 150 | #ifdef CONFIG_PPC_BOOK3S_64 |
146 | #define DEFAULT_MAP_WINDOW ((is_32bit_task()) ? \ | 151 | #define DEFAULT_MAP_WINDOW ((is_32bit_task()) ? \ |
147 | TASK_SIZE_USER32 : TASK_SIZE_128TB) | 152 | TASK_SIZE_USER32 : DEFAULT_MAP_WINDOW_USER64) |
148 | #else | 153 | #else |
149 | #define DEFAULT_MAP_WINDOW TASK_SIZE | 154 | #define DEFAULT_MAP_WINDOW TASK_SIZE |
150 | #endif | 155 | #endif |
151 | 156 | ||
152 | #ifdef __powerpc64__ | 157 | #ifdef __powerpc64__ |
153 | 158 | ||
154 | #ifdef CONFIG_PPC_BOOK3S_64 | 159 | #define STACK_TOP_USER64 DEFAULT_MAP_WINDOW_USER64 |
155 | /* Limit stack to 128TB */ | ||
156 | #define STACK_TOP_USER64 TASK_SIZE_128TB | ||
157 | #else | ||
158 | #define STACK_TOP_USER64 TASK_SIZE_USER64 | ||
159 | #endif | ||
160 | |||
161 | #define STACK_TOP_USER32 TASK_SIZE_USER32 | 160 | #define STACK_TOP_USER32 TASK_SIZE_USER32 |
162 | 161 | ||
163 | #define STACK_TOP (is_32bit_task() ? \ | 162 | #define STACK_TOP (is_32bit_task() ? \ |
diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c index 71dcda91755d..857129acf960 100644 --- a/arch/powerpc/kernel/setup-common.c +++ b/arch/powerpc/kernel/setup-common.c | |||
@@ -928,7 +928,7 @@ void __init setup_arch(char **cmdline_p) | |||
928 | 928 | ||
929 | #ifdef CONFIG_PPC_MM_SLICES | 929 | #ifdef CONFIG_PPC_MM_SLICES |
930 | #ifdef CONFIG_PPC64 | 930 | #ifdef CONFIG_PPC64 |
931 | init_mm.context.addr_limit = TASK_SIZE_128TB; | 931 | init_mm.context.addr_limit = DEFAULT_MAP_WINDOW_USER64; |
932 | #else | 932 | #else |
933 | #error "context.addr_limit not initialized." | 933 | #error "context.addr_limit not initialized." |
934 | #endif | 934 | #endif |
diff --git a/arch/powerpc/mm/mmu_context_book3s64.c b/arch/powerpc/mm/mmu_context_book3s64.c index c6dca2ae78ef..a3edf813d455 100644 --- a/arch/powerpc/mm/mmu_context_book3s64.c +++ b/arch/powerpc/mm/mmu_context_book3s64.c | |||
@@ -99,7 +99,7 @@ static int hash__init_new_context(struct mm_struct *mm) | |||
99 | * mm->context.addr_limit. Default to max task size so that we copy the | 99 | * mm->context.addr_limit. Default to max task size so that we copy the |
100 | * default values to paca which will help us to handle slb miss early. | 100 | * default values to paca which will help us to handle slb miss early. |
101 | */ | 101 | */ |
102 | mm->context.addr_limit = TASK_SIZE_128TB; | 102 | mm->context.addr_limit = DEFAULT_MAP_WINDOW_USER64; |
103 | 103 | ||
104 | /* | 104 | /* |
105 | * The old code would re-promote on fork, we don't do that when using | 105 | * The old code would re-promote on fork, we don't do that when using |