Merge branch 'next' of git://git.monstr.eu/linux-2.6-microblaze
[pandora-kernel.git] / arch / x86 / mm / init_64.c
index 1ad7c0f..8434620 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/initrd.h>
 #include <linux/pagemap.h>
 #include <linux/bootmem.h>
+#include <linux/memblock.h>
 #include <linux/proc_fs.h>
 #include <linux/pci.h>
 #include <linux/pfn.h>
@@ -52,8 +53,6 @@
 #include <asm/init.h>
 #include <linux/bootmem.h>
 
-static unsigned long dma_reserve __initdata;
-
 static int __init parse_direct_gbpages_off(char *arg)
 {
        direct_gbpages = 0;
@@ -116,12 +115,19 @@ void sync_global_pgds(unsigned long start, unsigned long end)
                spin_lock_irqsave(&pgd_lock, flags);
                list_for_each_entry(page, &pgd_list, lru) {
                        pgd_t *pgd;
+                       spinlock_t *pgt_lock;
+
                        pgd = (pgd_t *)page_address(page) + pgd_index(address);
+                       pgt_lock = &pgd_page_get_mm(page)->page_table_lock;
+                       spin_lock(pgt_lock);
+
                        if (pgd_none(*pgd))
                                set_pgd(pgd, *pgd_ref);
                        else
                                BUG_ON(pgd_page_vaddr(*pgd)
                                       != pgd_page_vaddr(*pgd_ref));
+
+                       spin_unlock(pgt_lock);
                }
                spin_unlock_irqrestore(&pgd_lock, flags);
        }
@@ -323,7 +329,7 @@ static __ref void *alloc_low_page(unsigned long *phys)
                panic("alloc_low_page: ran out of memory");
 
        adr = early_memremap(pfn * PAGE_SIZE, PAGE_SIZE);
-       memset(adr, 0, PAGE_SIZE);
+       clear_page(adr);
        *phys  = pfn * PAGE_SIZE;
        return adr;
 }
@@ -610,23 +616,7 @@ kernel_physical_mapping_init(unsigned long start,
 void __init initmem_init(unsigned long start_pfn, unsigned long end_pfn,
                                int acpi, int k8)
 {
-#ifndef CONFIG_NO_BOOTMEM
-       unsigned long bootmap_size, bootmap;
-
-       bootmap_size = bootmem_bootmap_pages(end_pfn)<<PAGE_SHIFT;
-       bootmap = find_e820_area(0, end_pfn<<PAGE_SHIFT, bootmap_size,
-                                PAGE_SIZE);
-       if (bootmap == -1L)
-               panic("Cannot find bootmem map of size %ld\n", bootmap_size);
-       reserve_early(bootmap, bootmap + bootmap_size, "BOOTMAP");
-       /* don't touch min_low_pfn */
-       bootmap_size = init_bootmem_node(NODE_DATA(0), bootmap >> PAGE_SHIFT,
-                                        0, end_pfn);
-       e820_register_active_regions(0, start_pfn, end_pfn);
-       free_bootmem_with_active_regions(0, end_pfn);
-#else
-       e820_register_active_regions(0, start_pfn, end_pfn);
-#endif
+       memblock_x86_register_active_regions(0, start_pfn, end_pfn);
 }
 #endif
 
@@ -836,52 +826,6 @@ void mark_rodata_ro(void)
 
 #endif
 
-int __init reserve_bootmem_generic(unsigned long phys, unsigned long len,
-                                  int flags)
-{
-#ifdef CONFIG_NUMA
-       int nid, next_nid;
-       int ret;
-#endif
-       unsigned long pfn = phys >> PAGE_SHIFT;
-
-       if (pfn >= max_pfn) {
-               /*
-                * This can happen with kdump kernels when accessing
-                * firmware tables:
-                */
-               if (pfn < max_pfn_mapped)
-                       return -EFAULT;
-
-               printk(KERN_ERR "reserve_bootmem: illegal reserve %lx %lu\n",
-                               phys, len);
-               return -EFAULT;
-       }
-
-       /* Should check here against the e820 map to avoid double free */
-#ifdef CONFIG_NUMA
-       nid = phys_to_nid(phys);
-       next_nid = phys_to_nid(phys + len - 1);
-       if (nid == next_nid)
-               ret = reserve_bootmem_node(NODE_DATA(nid), phys, len, flags);
-       else
-               ret = reserve_bootmem(phys, len, flags);
-
-       if (ret != 0)
-               return ret;
-
-#else
-       reserve_bootmem(phys, len, flags);
-#endif
-
-       if (phys+len <= MAX_DMA_PFN*PAGE_SIZE) {
-               dma_reserve += len / PAGE_SIZE;
-               set_dma_reserve(dma_reserve);
-       }
-
-       return 0;
-}
-
 int kern_addr_valid(unsigned long addr)
 {
        unsigned long above = ((long)addr) >> __VIRTUAL_MASK_SHIFT;