]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/s390/mm/vmem.c
Merge branches 'release' and 'ppc-workaround' into release
[linux-2.6-omap-h63xx.git] / arch / s390 / mm / vmem.c
index fb9c5a85aa563b745fafbf096fdd5d239603da8e..7c1287ccf78864fee054865ef9afd97193497d93 100644 (file)
 #include <asm/setup.h>
 #include <asm/tlbflush.h>
 
-unsigned long vmalloc_end;
-EXPORT_SYMBOL(vmalloc_end);
-
-static struct page *vmem_map;
 static DEFINE_MUTEX(vmem_mutex);
 
 struct memory_segment {
@@ -66,7 +62,7 @@ void __meminit memmap_init(unsigned long size, int nid, unsigned long zone,
        }
 }
 
-static void __init_refok *vmem_alloc_pages(unsigned int order)
+static void __ref *vmem_alloc_pages(unsigned int order)
 {
        if (slab_is_available())
                return (void *)__get_free_pages(GFP_KERNEL, order);
@@ -188,8 +184,8 @@ static int vmem_add_mem_map(unsigned long start, unsigned long size)
        pte_t  pte;
        int ret = -ENOMEM;
 
-       map_start = vmem_map + PFN_DOWN(start);
-       map_end = vmem_map + PFN_DOWN(start + size);
+       map_start = VMEM_MAP + PFN_DOWN(start);
+       map_end = VMEM_MAP + PFN_DOWN(start + size);
 
        start_addr = (unsigned long) map_start & PAGE_MASK;
        end_addr = PFN_ALIGN((unsigned long) map_end);
@@ -240,10 +236,10 @@ static int vmem_add_mem(unsigned long start, unsigned long size)
 {
        int ret;
 
-       ret = vmem_add_range(start, size);
+       ret = vmem_add_mem_map(start, size);
        if (ret)
                return ret;
-       return vmem_add_mem_map(start, size);
+       return vmem_add_range(start, size);
 }
 
 /*
@@ -254,7 +250,7 @@ static int insert_memory_segment(struct memory_segment *seg)
 {
        struct memory_segment *tmp;
 
-       if (PFN_DOWN(seg->start + seg->size) > max_pfn ||
+       if (seg->start + seg->size >= VMEM_MAX_PHYS ||
            seg->start + seg->size < seg->start)
                return -ERANGE;
 
@@ -357,17 +353,14 @@ out:
 
 /*
  * map whole physical memory to virtual memory (identity mapping)
+ * we reserve enough space in the vmalloc area for vmemmap to hotplug
+ * additional memory segments.
  */
 void __init vmem_map_init(void)
 {
-       unsigned long map_size;
        int i;
 
-       map_size = ALIGN(max_low_pfn, MAX_ORDER_NR_PAGES) * sizeof(struct page);
-       vmalloc_end = PFN_ALIGN(VMALLOC_END_INIT) - PFN_ALIGN(map_size);
-       vmem_map = (struct page *) vmalloc_end;
-       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++)
                vmem_add_mem(memory_chunk[i].addr, memory_chunk[i].size);
 }
@@ -382,7 +375,7 @@ static int __init vmem_convert_memory_chunk(void)
        int i;
 
        mutex_lock(&vmem_mutex);
-       for (i = 0; i < MEMORY_CHUNKS && memory_chunk[i].size > 0; i++) {
+       for (i = 0; i < MEMORY_CHUNKS; i++) {
                if (!memory_chunk[i].size)
                        continue;
                seg = kzalloc(sizeof(*seg), GFP_KERNEL);