Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=0189103c69f47712a0c542a8bc28ff46ebe53a8a
Commit:     0189103c69f47712a0c542a8bc28ff46ebe53a8a
Parent:     e35e1fadb4585e3143fab34dd4f5070698b3305b
Author:     Heiko Carstens <[EMAIL PROTECTED]>
AuthorDate: Tue Feb 5 16:50:49 2008 +0100
Committer:  Martin Schwidefsky <[EMAIL PROTECTED]>
CommitDate: Tue Feb 5 16:51:01 2008 +0100

    [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 <[EMAIL PROTECTED]>
    Signed-off-by: Heiko Carstens <[EMAIL PROTECTED]>
    Signed-off-by: Martin Schwidefsky <[EMAIL PROTECTED]>
---
 arch/s390/kernel/setup.c   |    2 +-
 arch/s390/mm/vmem.c        |    3 +--
 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 72d20f7..29ae165 100644
--- a/arch/s390/kernel/setup.c
+++ b/arch/s390/kernel/setup.c
@@ -528,7 +528,7 @@ static void __init setup_memory_end(void)
        memory_size = 0;
        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);
 
        /*
diff --git a/arch/s390/mm/vmem.c b/arch/s390/mm/vmem.c
index 07e0467..7c1287c 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)
 {
        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)
                return -ERANGE;
 
@@ -360,7 +360,6 @@ void __init vmem_map_init(void)
 {
        int i;
 
-       BUILD_BUG_ON((unsigned long)VMEM_MAP + VMEM_MAP_SIZE > VMEM_MAP_MAX);
        NODE_DATA(0)->node_mem_map = VMEM_MAP;
        for (i = 0; i < MEMORY_CHUNKS && memory_chunk[i].size > 0; i++)
                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 79b9eab..3f52075 100644
--- a/include/asm-s390/pgtable.h
+++ b/include/asm-s390/pgtable.h
@@ -115,15 +115,21 @@ extern char empty_zero_page[PAGE_SIZE];
 #ifndef __s390x__
 #define VMALLOC_START  0x78000000UL
 #define VMALLOC_END    0x7e000000UL
-#define VMEM_MAP_MAX   0x80000000UL
+#define VMEM_MAP_END   0x80000000UL
 #else /* __s390x__ */
 #define VMALLOC_START  0x3e000000000UL
 #define VMALLOC_END    0x3e040000000UL
-#define VMEM_MAP_MAX   0x40000000000UL
+#define VMEM_MAP_END   0x40000000000UL
 #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_SIZE  ((VMALLOC_START / PAGE_SIZE) * sizeof(struct page))
 
 /*
  * A 31 bit pagetable entry of S390 has following format:
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to