x86, e820: remove end_user_pfn
[pandora-kernel.git] / mm / bootmem.c
index b679164..8d9f60e 100644 (file)
@@ -442,15 +442,17 @@ unsigned long __init init_bootmem_node(pg_data_t *pgdat, unsigned long freepfn,
        return init_bootmem_core(pgdat, freepfn, startpfn, endpfn);
 }
 
-void __init reserve_bootmem_node(pg_data_t *pgdat, unsigned long physaddr,
+int __init reserve_bootmem_node(pg_data_t *pgdat, unsigned long physaddr,
                                 unsigned long size, int flags)
 {
        int ret;
 
        ret = can_reserve_bootmem_core(pgdat->bdata, physaddr, size, flags);
        if (ret < 0)
-               return;
+               return -ENOMEM;
        reserve_bootmem_core(pgdat->bdata, physaddr, size, flags);
+
+       return 0;
 }
 
 void __init free_bootmem_node(pg_data_t *pgdat, unsigned long physaddr,
@@ -461,6 +463,7 @@ void __init free_bootmem_node(pg_data_t *pgdat, unsigned long physaddr,
 
 unsigned long __init free_all_bootmem_node(pg_data_t *pgdat)
 {
+       register_page_bootmem_info_node(pgdat);
        return free_all_bootmem_core(pgdat);
 }
 
@@ -544,6 +547,37 @@ void * __init __alloc_bootmem_node(pg_data_t *pgdat, unsigned long size,
        return __alloc_bootmem(size, align, goal);
 }
 
+#ifdef CONFIG_SPARSEMEM
+void * __init alloc_bootmem_section(unsigned long size,
+                                   unsigned long section_nr)
+{
+       void *ptr;
+       unsigned long limit, goal, start_nr, end_nr, pfn;
+       struct pglist_data *pgdat;
+
+       pfn = section_nr_to_pfn(section_nr);
+       goal = PFN_PHYS(pfn);
+       limit = PFN_PHYS(section_nr_to_pfn(section_nr + 1)) - 1;
+       pgdat = NODE_DATA(early_pfn_to_nid(pfn));
+       ptr = __alloc_bootmem_core(pgdat->bdata, size, SMP_CACHE_BYTES, goal,
+                                  limit);
+
+       if (!ptr)
+               return NULL;
+
+       start_nr = pfn_to_section_nr(PFN_DOWN(__pa(ptr)));
+       end_nr = pfn_to_section_nr(PFN_DOWN(__pa(ptr) + size));
+       if (start_nr != section_nr || end_nr != section_nr) {
+               printk(KERN_WARNING "alloc_bootmem failed on section %ld.\n",
+                      section_nr);
+               free_bootmem_core(pgdat->bdata, __pa(ptr), size);
+               ptr = NULL;
+       }
+
+       return ptr;
+}
+#endif
+
 #ifndef ARCH_LOW_ADDRESS_LIMIT
 #define ARCH_LOW_ADDRESS_LIMIT 0xffffffffUL
 #endif