unsigned long align)
 {
        unsigned long mem = find_e820_area(start, end, size, align);
-       void *ptr;
 
        if (mem != -1L)
                return __va(mem);
 
-       ptr = __alloc_bootmem_nopanic(size, align, __pa(MAX_DMA_ADDRESS));
-       if (ptr == NULL) {
-               printk(KERN_ERR "Cannot find %lu bytes in node %d\n",
+
+       start = __pa(MAX_DMA_ADDRESS);
+       end = max_low_pfn_mapped << PAGE_SHIFT;
+       mem = find_e820_area(start, end, size, align);
+       if (mem != -1L)
+               return __va(mem);
+
+       printk(KERN_ERR "Cannot find %lu bytes in node %d\n",
                       size, nodeid);
-               return NULL;
-       }
-       return ptr;
+
+       return NULL;
 }
 
 /* Initialize bootmem allocator for a node */
        if (node_data[nodeid] == NULL)
                return;
        nodedata_phys = __pa(node_data[nodeid]);
+       reserve_early(nodedata_phys, nodedata_phys + pgdat_size, "NODE_DATA");
        printk(KERN_INFO "  NODE_DATA [%016lx - %016lx]\n", nodedata_phys,
                nodedata_phys + pgdat_size - 1);
+       nid = phys_to_nid(nodedata_phys);
+       if (nid != nodeid)
+               printk(KERN_INFO "    NODE_DATA(%d) on node %d\n", nodeid, nid);
 
        memset(NODE_DATA(nodeid), 0, sizeof(pg_data_t));
        NODE_DATA(nodeid)->bdata = &bootmem_node_data[nodeid];
         * of alloc_bootmem, that could clash with reserved range
         */
        bootmap_pages = bootmem_bootmap_pages(last_pfn - start_pfn);
-       nid = phys_to_nid(nodedata_phys);
-       if (nid == nodeid)
-               bootmap_start = roundup(nodedata_phys + pgdat_size, PAGE_SIZE);
-       else
-               bootmap_start = roundup(start, PAGE_SIZE);
+       bootmap_start = roundup(nodedata_phys + pgdat_size, PAGE_SIZE);
        /*
         * SMP_CACHE_BYTES could be enough, but init_bootmem_node like
         * to use that to align to PAGE_SIZE
        bootmap = early_node_mem(nodeid, bootmap_start, end,
                                 bootmap_pages<<PAGE_SHIFT, PAGE_SIZE);
        if (bootmap == NULL)  {
-               if (nodedata_phys < start || nodedata_phys >= end) {
-                       /*
-                        * only need to free it if it is from other node
-                        * bootmem
-                        */
-                       if (nid != nodeid)
-                               free_bootmem(nodedata_phys, pgdat_size);
-               }
+               free_early(nodedata_phys, nodedata_phys + pgdat_size);
                node_data[nodeid] = NULL;
                return;
        }
        bootmap_start = __pa(bootmap);
+       reserve_early(bootmap_start, bootmap_start+(bootmap_pages<<PAGE_SHIFT),
+                       "BOOTMAP");
 
        bootmap_size = init_bootmem_node(NODE_DATA(nodeid),
                                         bootmap_start >> PAGE_SHIFT,
        printk(KERN_INFO "  bootmap [%016lx -  %016lx] pages %lx\n",
                 bootmap_start, bootmap_start + bootmap_size - 1,
                 bootmap_pages);
-
-       free_bootmem_with_active_regions(nodeid, end);
-
-       /*
-        * convert early reserve to bootmem reserve earlier
-        * otherwise early_node_mem could use early reserved mem
-        * on previous node
-        */
-       early_res_to_bootmem(start, end);
-
-       /*
-        * in some case early_node_mem could use alloc_bootmem
-        * to get range on other node, don't reserve that again
-        */
-       if (nid != nodeid)
-               printk(KERN_INFO "    NODE_DATA(%d) on node %d\n", nodeid, nid);
-       else
-               reserve_bootmem_node(NODE_DATA(nodeid), nodedata_phys,
-                                       pgdat_size, BOOTMEM_DEFAULT);
        nid = phys_to_nid(bootmap_start);
        if (nid != nodeid)
                printk(KERN_INFO "    bootmap(%d) on node %d\n", nodeid, nid);
-       else
-               reserve_bootmem_node(NODE_DATA(nodeid), bootmap_start,
-                                bootmap_pages<<PAGE_SHIFT, BOOTMEM_DEFAULT);
+
+       free_bootmem_with_active_regions(nodeid, end);
 
        node_set_online(nodeid);
 }