Browse Source

[S390] Remove BUILD_BUG_ON() in vmem code.

Remove BUILD_BUG_ON() in vmem code since it causes build failures if
the size of struct page increases. Instead calculate at compile time
the address of the highest physical address that can be added to the
1:1 mapping.
This supposed to fix a build failure with the page owner tracking leak
detector patches as reported by akpm.

page-owner-tracking-leak-detector-broken-on-s390.patch can be removed
from -mm again when this is merged.

Cc: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Heiko Carstens 17 years ago
parent
commit
0189103c69
3 changed files with 11 additions and 6 deletions
  1. 1 1
      arch/s390/kernel/setup.c
  2. 1 2
      arch/s390/mm/vmem.c
  3. 9 3
      include/asm-s390/pgtable.h

+ 1 - 1
arch/s390/kernel/setup.c

@@ -528,7 +528,7 @@ static void __init setup_memory_end(void)
 	memory_size = 0;
 	memory_size = 0;
 	memory_end &= PAGE_MASK;
 	memory_end &= PAGE_MASK;
 
 
-	max_mem = memory_end ? min(VMALLOC_START, memory_end) : VMALLOC_START;
+	max_mem = memory_end ? min(VMEM_MAX_PHYS, memory_end) : VMEM_MAX_PHYS;
 	memory_end = min(max_mem, memory_end);
 	memory_end = min(max_mem, memory_end);
 
 
 	/*
 	/*

+ 1 - 2
arch/s390/mm/vmem.c

@@ -250,7 +250,7 @@ static int insert_memory_segment(struct memory_segment *seg)
 {
 {
 	struct memory_segment *tmp;
 	struct memory_segment *tmp;
 
 
-	if (seg->start + seg->size >= VMALLOC_START ||
+	if (seg->start + seg->size >= VMEM_MAX_PHYS ||
 	    seg->start + seg->size < seg->start)
 	    seg->start + seg->size < seg->start)
 		return -ERANGE;
 		return -ERANGE;
 
 
@@ -360,7 +360,6 @@ void __init vmem_map_init(void)
 {
 {
 	int i;
 	int i;
 
 
-	BUILD_BUG_ON((unsigned long)VMEM_MAP + VMEM_MAP_SIZE > VMEM_MAP_MAX);
 	NODE_DATA(0)->node_mem_map = VMEM_MAP;
 	NODE_DATA(0)->node_mem_map = VMEM_MAP;
 	for (i = 0; i < MEMORY_CHUNKS && memory_chunk[i].size > 0; i++)
 	for (i = 0; i < MEMORY_CHUNKS && memory_chunk[i].size > 0; i++)
 		vmem_add_mem(memory_chunk[i].addr, memory_chunk[i].size);
 		vmem_add_mem(memory_chunk[i].addr, memory_chunk[i].size);

+ 9 - 3
include/asm-s390/pgtable.h

@@ -115,15 +115,21 @@ extern char empty_zero_page[PAGE_SIZE];
 #ifndef __s390x__
 #ifndef __s390x__
 #define VMALLOC_START	0x78000000UL
 #define VMALLOC_START	0x78000000UL
 #define VMALLOC_END	0x7e000000UL
 #define VMALLOC_END	0x7e000000UL
-#define VMEM_MAP_MAX	0x80000000UL
+#define VMEM_MAP_END	0x80000000UL
 #else /* __s390x__ */
 #else /* __s390x__ */
 #define VMALLOC_START	0x3e000000000UL
 #define VMALLOC_START	0x3e000000000UL
 #define VMALLOC_END	0x3e040000000UL
 #define VMALLOC_END	0x3e040000000UL
-#define VMEM_MAP_MAX	0x40000000000UL
+#define VMEM_MAP_END	0x40000000000UL
 #endif /* __s390x__ */
 #endif /* __s390x__ */
 
 
+/*
+ * VMEM_MAX_PHYS is the highest physical address that can be added to the 1:1
+ * mapping. This needs to be calculated at compile time since the size of the
+ * VMEM_MAP is static but the size of struct page can change.
+ */
+#define VMEM_MAX_PHYS	min(VMALLOC_START, ((VMEM_MAP_END - VMALLOC_END) / \
+			  sizeof(struct page) * PAGE_SIZE) & ~((16 << 20) - 1))
 #define VMEM_MAP	((struct page *) VMALLOC_END)
 #define VMEM_MAP	((struct page *) VMALLOC_END)
-#define VMEM_MAP_SIZE	((VMALLOC_START / PAGE_SIZE) * sizeof(struct page))
 
 
 /*
 /*
  * A 31 bit pagetable entry of S390 has following format:
  * A 31 bit pagetable entry of S390 has following format: