include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit...
[safe/jmp/linux-2.6] / arch / s390 / mm / vmem.c
index beccacf..8ea3144 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/module.h>
 #include <linux/list.h>
 #include <linux/hugetlb.h>
+#include <linux/slab.h>
 #include <asm/pgalloc.h>
 #include <asm/pgtable.h>
 #include <asm/setup.h>
@@ -60,7 +61,7 @@ static inline pmd_t *vmem_pmd_alloc(void)
        return pmd;
 }
 
-static pte_t __init_refok *vmem_pte_alloc(void)
+static pte_t __ref *vmem_pte_alloc(void)
 {
        pte_t *pte;
 
@@ -70,8 +71,12 @@ static pte_t __init_refok *vmem_pte_alloc(void)
                pte = alloc_bootmem(PTRS_PER_PTE * sizeof(pte_t));
        if (!pte)
                return NULL;
-       clear_table((unsigned long *) pte, _PAGE_TYPE_EMPTY,
-                   PTRS_PER_PTE * sizeof(pte_t));
+       if (MACHINE_HAS_HPAGE)
+               clear_table((unsigned long *) pte, _PAGE_TYPE_EMPTY | _PAGE_CO,
+                           PTRS_PER_PTE * sizeof(pte_t));
+       else
+               clear_table((unsigned long *) pte, _PAGE_TYPE_EMPTY,
+                           PTRS_PER_PTE * sizeof(pte_t));
        return pte;
 }
 
@@ -112,7 +117,8 @@ static int vmem_add_mem(unsigned long start, unsigned long size, int ro)
                if (MACHINE_HAS_HPAGE && !(address & ~HPAGE_MASK) &&
                    (address + HPAGE_SIZE <= start + size) &&
                    (address >= HPAGE_SIZE)) {
-                       pte_val(pte) |= _SEGMENT_ENTRY_LARGE;
+                       pte_val(pte) |= _SEGMENT_ENTRY_LARGE |
+                                       _SEGMENT_ENTRY_CO;
                        pmd_val(*pm_dir) = pte_val(pte);
                        address += HPAGE_SIZE - PAGE_SIZE;
                        continue;
@@ -221,6 +227,7 @@ int __meminit vmemmap_populate(struct page *start, unsigned long nr, int node)
                        *pt_dir = pte;
                }
        }
+       memset(start, 0, nr * sizeof(struct page));
        ret = 0;
 out:
        flush_tlb_kernel_range(start_addr, end_addr);
@@ -235,7 +242,7 @@ static int insert_memory_segment(struct memory_segment *seg)
 {
        struct memory_segment *tmp;
 
-       if (seg->start + seg->size >= VMEM_MAX_PHYS ||
+       if (seg->start + seg->size > VMEM_MAX_PHYS ||
            seg->start + seg->size < seg->start)
                return -ERANGE;
 
@@ -330,6 +337,7 @@ void __init vmem_map_init(void)
        unsigned long start, end;
        int i;
 
+       spin_lock_init(&init_mm.context.list_lock);
        INIT_LIST_HEAD(&init_mm.context.crst_list);
        INIT_LIST_HEAD(&init_mm.context.pgtable_list);
        init_mm.context.noexec = 0;