diff options
-rw-r--r-- | arch/s390/kernel/setup.c | 2 | ||||
-rw-r--r-- | arch/s390/mm/vmem.c | 3 | ||||
-rw-r--r-- | include/asm-s390/pgtable.h | 12 |
3 files changed, 11 insertions, 6 deletions
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index 72d20f70f8a6..29ae165d1749 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c | |||
@@ -528,7 +528,7 @@ static void __init setup_memory_end(void) | |||
528 | memory_size = 0; | 528 | memory_size = 0; |
529 | memory_end &= PAGE_MASK; | 529 | memory_end &= PAGE_MASK; |
530 | 530 | ||
531 | max_mem = memory_end ? min(VMALLOC_START, memory_end) : VMALLOC_START; | 531 | max_mem = memory_end ? min(VMEM_MAX_PHYS, memory_end) : VMEM_MAX_PHYS; |
532 | memory_end = min(max_mem, memory_end); | 532 | memory_end = min(max_mem, memory_end); |
533 | 533 | ||
534 | /* | 534 | /* |
diff --git a/arch/s390/mm/vmem.c b/arch/s390/mm/vmem.c index 07e046777243..7c1287ccf788 100644 --- a/arch/s390/mm/vmem.c +++ b/arch/s390/mm/vmem.c | |||
@@ -250,7 +250,7 @@ static int insert_memory_segment(struct memory_segment *seg) | |||
250 | { | 250 | { |
251 | struct memory_segment *tmp; | 251 | struct memory_segment *tmp; |
252 | 252 | ||
253 | if (seg->start + seg->size >= VMALLOC_START || | 253 | if (seg->start + seg->size >= VMEM_MAX_PHYS || |
254 | seg->start + seg->size < seg->start) | 254 | seg->start + seg->size < seg->start) |
255 | return -ERANGE; | 255 | return -ERANGE; |
256 | 256 | ||
@@ -360,7 +360,6 @@ void __init vmem_map_init(void) | |||
360 | { | 360 | { |
361 | int i; | 361 | int i; |
362 | 362 | ||
363 | BUILD_BUG_ON((unsigned long)VMEM_MAP + VMEM_MAP_SIZE > VMEM_MAP_MAX); | ||
364 | NODE_DATA(0)->node_mem_map = VMEM_MAP; | 363 | NODE_DATA(0)->node_mem_map = VMEM_MAP; |
365 | for (i = 0; i < MEMORY_CHUNKS && memory_chunk[i].size > 0; i++) | 364 | for (i = 0; i < MEMORY_CHUNKS && memory_chunk[i].size > 0; i++) |
366 | vmem_add_mem(memory_chunk[i].addr, memory_chunk[i].size); | 365 | vmem_add_mem(memory_chunk[i].addr, memory_chunk[i].size); |
diff --git a/include/asm-s390/pgtable.h b/include/asm-s390/pgtable.h index 79b9eab1a0c7..3f520754e71c 100644 --- a/include/asm-s390/pgtable.h +++ b/include/asm-s390/pgtable.h | |||
@@ -115,15 +115,21 @@ extern char empty_zero_page[PAGE_SIZE]; | |||
115 | #ifndef __s390x__ | 115 | #ifndef __s390x__ |
116 | #define VMALLOC_START 0x78000000UL | 116 | #define VMALLOC_START 0x78000000UL |
117 | #define VMALLOC_END 0x7e000000UL | 117 | #define VMALLOC_END 0x7e000000UL |
118 | #define VMEM_MAP_MAX 0x80000000UL | 118 | #define VMEM_MAP_END 0x80000000UL |
119 | #else /* __s390x__ */ | 119 | #else /* __s390x__ */ |
120 | #define VMALLOC_START 0x3e000000000UL | 120 | #define VMALLOC_START 0x3e000000000UL |
121 | #define VMALLOC_END 0x3e040000000UL | 121 | #define VMALLOC_END 0x3e040000000UL |
122 | #define VMEM_MAP_MAX 0x40000000000UL | 122 | #define VMEM_MAP_END 0x40000000000UL |
123 | #endif /* __s390x__ */ | 123 | #endif /* __s390x__ */ |
124 | 124 | ||
125 | /* | ||
126 | * VMEM_MAX_PHYS is the highest physical address that can be added to the 1:1 | ||
127 | * mapping. This needs to be calculated at compile time since the size of the | ||
128 | * VMEM_MAP is static but the size of struct page can change. | ||
129 | */ | ||
130 | #define VMEM_MAX_PHYS min(VMALLOC_START, ((VMEM_MAP_END - VMALLOC_END) / \ | ||
131 | sizeof(struct page) * PAGE_SIZE) & ~((16 << 20) - 1)) | ||
125 | #define VMEM_MAP ((struct page *) VMALLOC_END) | 132 | #define VMEM_MAP ((struct page *) VMALLOC_END) |
126 | #define VMEM_MAP_SIZE ((VMALLOC_START / PAGE_SIZE) * sizeof(struct page)) | ||
127 | 133 | ||
128 | /* | 134 | /* |
129 | * A 31 bit pagetable entry of S390 has following format: | 135 | * A 31 bit pagetable entry of S390 has following format: |