|
@@ -35,7 +35,6 @@ unsigned long max_pfn;
|
|
unsigned long saved_max_pfn;
|
|
unsigned long saved_max_pfn;
|
|
#endif
|
|
#endif
|
|
|
|
|
|
-#ifndef CONFIG_NO_BOOTMEM
|
|
|
|
bootmem_data_t bootmem_node_data[MAX_NUMNODES] __initdata;
|
|
bootmem_data_t bootmem_node_data[MAX_NUMNODES] __initdata;
|
|
|
|
|
|
static struct list_head bdata_list __initdata = LIST_HEAD_INIT(bdata_list);
|
|
static struct list_head bdata_list __initdata = LIST_HEAD_INIT(bdata_list);
|
|
@@ -146,7 +145,7 @@ unsigned long __init init_bootmem(unsigned long start, unsigned long pages)
|
|
min_low_pfn = start;
|
|
min_low_pfn = start;
|
|
return init_bootmem_core(NODE_DATA(0)->bdata, start, 0, pages);
|
|
return init_bootmem_core(NODE_DATA(0)->bdata, start, 0, pages);
|
|
}
|
|
}
|
|
-#endif
|
|
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* free_bootmem_late - free bootmem pages directly to page allocator
|
|
* free_bootmem_late - free bootmem pages directly to page allocator
|
|
* @addr: starting address of the range
|
|
* @addr: starting address of the range
|
|
@@ -171,53 +170,6 @@ void __init free_bootmem_late(unsigned long addr, unsigned long size)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_NO_BOOTMEM
|
|
|
|
-static void __init __free_pages_memory(unsigned long start, unsigned long end)
|
|
|
|
-{
|
|
|
|
- int i;
|
|
|
|
- unsigned long start_aligned, end_aligned;
|
|
|
|
- int order = ilog2(BITS_PER_LONG);
|
|
|
|
-
|
|
|
|
- start_aligned = (start + (BITS_PER_LONG - 1)) & ~(BITS_PER_LONG - 1);
|
|
|
|
- end_aligned = end & ~(BITS_PER_LONG - 1);
|
|
|
|
-
|
|
|
|
- if (end_aligned <= start_aligned) {
|
|
|
|
- for (i = start; i < end; i++)
|
|
|
|
- __free_pages_bootmem(pfn_to_page(i), 0);
|
|
|
|
-
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- for (i = start; i < start_aligned; i++)
|
|
|
|
- __free_pages_bootmem(pfn_to_page(i), 0);
|
|
|
|
-
|
|
|
|
- for (i = start_aligned; i < end_aligned; i += BITS_PER_LONG)
|
|
|
|
- __free_pages_bootmem(pfn_to_page(i), order);
|
|
|
|
-
|
|
|
|
- for (i = end_aligned; i < end; i++)
|
|
|
|
- __free_pages_bootmem(pfn_to_page(i), 0);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-unsigned long __init free_all_memory_core_early(int nodeid)
|
|
|
|
-{
|
|
|
|
- int i;
|
|
|
|
- u64 start, end;
|
|
|
|
- unsigned long count = 0;
|
|
|
|
- struct range *range = NULL;
|
|
|
|
- int nr_range;
|
|
|
|
-
|
|
|
|
- nr_range = get_free_all_memory_range(&range, nodeid);
|
|
|
|
-
|
|
|
|
- for (i = 0; i < nr_range; i++) {
|
|
|
|
- start = range[i].start;
|
|
|
|
- end = range[i].end;
|
|
|
|
- count += end - start;
|
|
|
|
- __free_pages_memory(start, end);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return count;
|
|
|
|
-}
|
|
|
|
-#else
|
|
|
|
static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata)
|
|
static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata)
|
|
{
|
|
{
|
|
int aligned;
|
|
int aligned;
|
|
@@ -278,7 +230,6 @@ static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata)
|
|
|
|
|
|
return count;
|
|
return count;
|
|
}
|
|
}
|
|
-#endif
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
* free_all_bootmem_node - release a node's free pages to the buddy allocator
|
|
* free_all_bootmem_node - release a node's free pages to the buddy allocator
|
|
@@ -289,12 +240,7 @@ static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata)
|
|
unsigned long __init free_all_bootmem_node(pg_data_t *pgdat)
|
|
unsigned long __init free_all_bootmem_node(pg_data_t *pgdat)
|
|
{
|
|
{
|
|
register_page_bootmem_info_node(pgdat);
|
|
register_page_bootmem_info_node(pgdat);
|
|
-#ifdef CONFIG_NO_BOOTMEM
|
|
|
|
- /* free_all_memory_core_early(MAX_NUMNODES) will be called later */
|
|
|
|
- return 0;
|
|
|
|
-#else
|
|
|
|
return free_all_bootmem_core(pgdat->bdata);
|
|
return free_all_bootmem_core(pgdat->bdata);
|
|
-#endif
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -304,16 +250,6 @@ unsigned long __init free_all_bootmem_node(pg_data_t *pgdat)
|
|
*/
|
|
*/
|
|
unsigned long __init free_all_bootmem(void)
|
|
unsigned long __init free_all_bootmem(void)
|
|
{
|
|
{
|
|
-#ifdef CONFIG_NO_BOOTMEM
|
|
|
|
- /*
|
|
|
|
- * We need to use MAX_NUMNODES instead of NODE_DATA(0)->node_id
|
|
|
|
- * because in some case like Node0 doesnt have RAM installed
|
|
|
|
- * low ram will be on Node1
|
|
|
|
- * Use MAX_NUMNODES will make sure all ranges in early_node_map[]
|
|
|
|
- * will be used instead of only Node0 related
|
|
|
|
- */
|
|
|
|
- return free_all_memory_core_early(MAX_NUMNODES);
|
|
|
|
-#else
|
|
|
|
unsigned long total_pages = 0;
|
|
unsigned long total_pages = 0;
|
|
bootmem_data_t *bdata;
|
|
bootmem_data_t *bdata;
|
|
|
|
|
|
@@ -321,10 +257,8 @@ unsigned long __init free_all_bootmem(void)
|
|
total_pages += free_all_bootmem_core(bdata);
|
|
total_pages += free_all_bootmem_core(bdata);
|
|
|
|
|
|
return total_pages;
|
|
return total_pages;
|
|
-#endif
|
|
|
|
}
|
|
}
|
|
|
|
|
|
-#ifndef CONFIG_NO_BOOTMEM
|
|
|
|
static void __init __free(bootmem_data_t *bdata,
|
|
static void __init __free(bootmem_data_t *bdata,
|
|
unsigned long sidx, unsigned long eidx)
|
|
unsigned long sidx, unsigned long eidx)
|
|
{
|
|
{
|
|
@@ -419,7 +353,6 @@ static int __init mark_bootmem(unsigned long start, unsigned long end,
|
|
}
|
|
}
|
|
BUG();
|
|
BUG();
|
|
}
|
|
}
|
|
-#endif
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
* free_bootmem_node - mark a page range as usable
|
|
* free_bootmem_node - mark a page range as usable
|
|
@@ -434,10 +367,6 @@ static int __init mark_bootmem(unsigned long start, unsigned long end,
|
|
void __init free_bootmem_node(pg_data_t *pgdat, unsigned long physaddr,
|
|
void __init free_bootmem_node(pg_data_t *pgdat, unsigned long physaddr,
|
|
unsigned long size)
|
|
unsigned long size)
|
|
{
|
|
{
|
|
-#ifdef CONFIG_NO_BOOTMEM
|
|
|
|
- kmemleak_free_part(__va(physaddr), size);
|
|
|
|
- memblock_x86_free_range(physaddr, physaddr + size);
|
|
|
|
-#else
|
|
|
|
unsigned long start, end;
|
|
unsigned long start, end;
|
|
|
|
|
|
kmemleak_free_part(__va(physaddr), size);
|
|
kmemleak_free_part(__va(physaddr), size);
|
|
@@ -446,7 +375,6 @@ void __init free_bootmem_node(pg_data_t *pgdat, unsigned long physaddr,
|
|
end = PFN_DOWN(physaddr + size);
|
|
end = PFN_DOWN(physaddr + size);
|
|
|
|
|
|
mark_bootmem_node(pgdat->bdata, start, end, 0, 0);
|
|
mark_bootmem_node(pgdat->bdata, start, end, 0, 0);
|
|
-#endif
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -460,10 +388,6 @@ void __init free_bootmem_node(pg_data_t *pgdat, unsigned long physaddr,
|
|
*/
|
|
*/
|
|
void __init free_bootmem(unsigned long addr, unsigned long size)
|
|
void __init free_bootmem(unsigned long addr, unsigned long size)
|
|
{
|
|
{
|
|
-#ifdef CONFIG_NO_BOOTMEM
|
|
|
|
- kmemleak_free_part(__va(addr), size);
|
|
|
|
- memblock_x86_free_range(addr, addr + size);
|
|
|
|
-#else
|
|
|
|
unsigned long start, end;
|
|
unsigned long start, end;
|
|
|
|
|
|
kmemleak_free_part(__va(addr), size);
|
|
kmemleak_free_part(__va(addr), size);
|
|
@@ -472,7 +396,6 @@ void __init free_bootmem(unsigned long addr, unsigned long size)
|
|
end = PFN_DOWN(addr + size);
|
|
end = PFN_DOWN(addr + size);
|
|
|
|
|
|
mark_bootmem(start, end, 0, 0);
|
|
mark_bootmem(start, end, 0, 0);
|
|
-#endif
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -489,17 +412,12 @@ void __init free_bootmem(unsigned long addr, unsigned long size)
|
|
int __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)
|
|
unsigned long size, int flags)
|
|
{
|
|
{
|
|
-#ifdef CONFIG_NO_BOOTMEM
|
|
|
|
- panic("no bootmem");
|
|
|
|
- return 0;
|
|
|
|
-#else
|
|
|
|
unsigned long start, end;
|
|
unsigned long start, end;
|
|
|
|
|
|
start = PFN_DOWN(physaddr);
|
|
start = PFN_DOWN(physaddr);
|
|
end = PFN_UP(physaddr + size);
|
|
end = PFN_UP(physaddr + size);
|
|
|
|
|
|
return mark_bootmem_node(pgdat->bdata, start, end, 1, flags);
|
|
return mark_bootmem_node(pgdat->bdata, start, end, 1, flags);
|
|
-#endif
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -515,20 +433,14 @@ int __init reserve_bootmem_node(pg_data_t *pgdat, unsigned long physaddr,
|
|
int __init reserve_bootmem(unsigned long addr, unsigned long size,
|
|
int __init reserve_bootmem(unsigned long addr, unsigned long size,
|
|
int flags)
|
|
int flags)
|
|
{
|
|
{
|
|
-#ifdef CONFIG_NO_BOOTMEM
|
|
|
|
- panic("no bootmem");
|
|
|
|
- return 0;
|
|
|
|
-#else
|
|
|
|
unsigned long start, end;
|
|
unsigned long start, end;
|
|
|
|
|
|
start = PFN_DOWN(addr);
|
|
start = PFN_DOWN(addr);
|
|
end = PFN_UP(addr + size);
|
|
end = PFN_UP(addr + size);
|
|
|
|
|
|
return mark_bootmem(start, end, 1, flags);
|
|
return mark_bootmem(start, end, 1, flags);
|
|
-#endif
|
|
|
|
}
|
|
}
|
|
|
|
|
|
-#ifndef CONFIG_NO_BOOTMEM
|
|
|
|
int __weak __init reserve_bootmem_generic(unsigned long phys, unsigned long len,
|
|
int __weak __init reserve_bootmem_generic(unsigned long phys, unsigned long len,
|
|
int flags)
|
|
int flags)
|
|
{
|
|
{
|
|
@@ -685,33 +597,12 @@ static void * __init alloc_arch_preferred_bootmem(bootmem_data_t *bdata,
|
|
#endif
|
|
#endif
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
-#endif
|
|
|
|
|
|
|
|
static void * __init ___alloc_bootmem_nopanic(unsigned long size,
|
|
static void * __init ___alloc_bootmem_nopanic(unsigned long size,
|
|
unsigned long align,
|
|
unsigned long align,
|
|
unsigned long goal,
|
|
unsigned long goal,
|
|
unsigned long limit)
|
|
unsigned long limit)
|
|
{
|
|
{
|
|
-#ifdef CONFIG_NO_BOOTMEM
|
|
|
|
- void *ptr;
|
|
|
|
-
|
|
|
|
- if (WARN_ON_ONCE(slab_is_available()))
|
|
|
|
- return kzalloc(size, GFP_NOWAIT);
|
|
|
|
-
|
|
|
|
-restart:
|
|
|
|
-
|
|
|
|
- ptr = __alloc_memory_core_early(MAX_NUMNODES, size, align, goal, limit);
|
|
|
|
-
|
|
|
|
- if (ptr)
|
|
|
|
- return ptr;
|
|
|
|
-
|
|
|
|
- if (goal != 0) {
|
|
|
|
- goal = 0;
|
|
|
|
- goto restart;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return NULL;
|
|
|
|
-#else
|
|
|
|
bootmem_data_t *bdata;
|
|
bootmem_data_t *bdata;
|
|
void *region;
|
|
void *region;
|
|
|
|
|
|
@@ -737,7 +628,6 @@ restart:
|
|
}
|
|
}
|
|
|
|
|
|
return NULL;
|
|
return NULL;
|
|
-#endif
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -758,10 +648,6 @@ void * __init __alloc_bootmem_nopanic(unsigned long size, unsigned long align,
|
|
{
|
|
{
|
|
unsigned long limit = 0;
|
|
unsigned long limit = 0;
|
|
|
|
|
|
-#ifdef CONFIG_NO_BOOTMEM
|
|
|
|
- limit = -1UL;
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
return ___alloc_bootmem_nopanic(size, align, goal, limit);
|
|
return ___alloc_bootmem_nopanic(size, align, goal, limit);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -798,14 +684,9 @@ void * __init __alloc_bootmem(unsigned long size, unsigned long align,
|
|
{
|
|
{
|
|
unsigned long limit = 0;
|
|
unsigned long limit = 0;
|
|
|
|
|
|
-#ifdef CONFIG_NO_BOOTMEM
|
|
|
|
- limit = -1UL;
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
return ___alloc_bootmem(size, align, goal, limit);
|
|
return ___alloc_bootmem(size, align, goal, limit);
|
|
}
|
|
}
|
|
|
|
|
|
-#ifndef CONFIG_NO_BOOTMEM
|
|
|
|
static void * __init ___alloc_bootmem_node(bootmem_data_t *bdata,
|
|
static void * __init ___alloc_bootmem_node(bootmem_data_t *bdata,
|
|
unsigned long size, unsigned long align,
|
|
unsigned long size, unsigned long align,
|
|
unsigned long goal, unsigned long limit)
|
|
unsigned long goal, unsigned long limit)
|
|
@@ -822,7 +703,6 @@ static void * __init ___alloc_bootmem_node(bootmem_data_t *bdata,
|
|
|
|
|
|
return ___alloc_bootmem(size, align, goal, limit);
|
|
return ___alloc_bootmem(size, align, goal, limit);
|
|
}
|
|
}
|
|
-#endif
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
* __alloc_bootmem_node - allocate boot memory from a specific node
|
|
* __alloc_bootmem_node - allocate boot memory from a specific node
|
|
@@ -842,24 +722,10 @@ static void * __init ___alloc_bootmem_node(bootmem_data_t *bdata,
|
|
void * __init __alloc_bootmem_node(pg_data_t *pgdat, unsigned long size,
|
|
void * __init __alloc_bootmem_node(pg_data_t *pgdat, unsigned long size,
|
|
unsigned long align, unsigned long goal)
|
|
unsigned long align, unsigned long goal)
|
|
{
|
|
{
|
|
- void *ptr;
|
|
|
|
-
|
|
|
|
if (WARN_ON_ONCE(slab_is_available()))
|
|
if (WARN_ON_ONCE(slab_is_available()))
|
|
return kzalloc_node(size, GFP_NOWAIT, pgdat->node_id);
|
|
return kzalloc_node(size, GFP_NOWAIT, pgdat->node_id);
|
|
|
|
|
|
-#ifdef CONFIG_NO_BOOTMEM
|
|
|
|
- ptr = __alloc_memory_core_early(pgdat->node_id, size, align,
|
|
|
|
- goal, -1ULL);
|
|
|
|
- if (ptr)
|
|
|
|
- return ptr;
|
|
|
|
-
|
|
|
|
- ptr = __alloc_memory_core_early(MAX_NUMNODES, size, align,
|
|
|
|
- goal, -1ULL);
|
|
|
|
-#else
|
|
|
|
- ptr = ___alloc_bootmem_node(pgdat->bdata, size, align, goal, 0);
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
- return ptr;
|
|
|
|
|
|
+ return ___alloc_bootmem_node(pgdat->bdata, size, align, goal, 0);
|
|
}
|
|
}
|
|
|
|
|
|
void * __init __alloc_bootmem_node_high(pg_data_t *pgdat, unsigned long size,
|
|
void * __init __alloc_bootmem_node_high(pg_data_t *pgdat, unsigned long size,
|
|
@@ -880,13 +746,8 @@ void * __init __alloc_bootmem_node_high(pg_data_t *pgdat, unsigned long size,
|
|
unsigned long new_goal;
|
|
unsigned long new_goal;
|
|
|
|
|
|
new_goal = MAX_DMA32_PFN << PAGE_SHIFT;
|
|
new_goal = MAX_DMA32_PFN << PAGE_SHIFT;
|
|
-#ifdef CONFIG_NO_BOOTMEM
|
|
|
|
- ptr = __alloc_memory_core_early(pgdat->node_id, size, align,
|
|
|
|
- new_goal, -1ULL);
|
|
|
|
-#else
|
|
|
|
ptr = alloc_bootmem_core(pgdat->bdata, size, align,
|
|
ptr = alloc_bootmem_core(pgdat->bdata, size, align,
|
|
new_goal, 0);
|
|
new_goal, 0);
|
|
-#endif
|
|
|
|
if (ptr)
|
|
if (ptr)
|
|
return ptr;
|
|
return ptr;
|
|
}
|
|
}
|
|
@@ -907,16 +768,6 @@ void * __init __alloc_bootmem_node_high(pg_data_t *pgdat, unsigned long size,
|
|
void * __init alloc_bootmem_section(unsigned long size,
|
|
void * __init alloc_bootmem_section(unsigned long size,
|
|
unsigned long section_nr)
|
|
unsigned long section_nr)
|
|
{
|
|
{
|
|
-#ifdef CONFIG_NO_BOOTMEM
|
|
|
|
- unsigned long pfn, goal, limit;
|
|
|
|
-
|
|
|
|
- pfn = section_nr_to_pfn(section_nr);
|
|
|
|
- goal = pfn << PAGE_SHIFT;
|
|
|
|
- limit = section_nr_to_pfn(section_nr + 1) << PAGE_SHIFT;
|
|
|
|
-
|
|
|
|
- return __alloc_memory_core_early(early_pfn_to_nid(pfn), size,
|
|
|
|
- SMP_CACHE_BYTES, goal, limit);
|
|
|
|
-#else
|
|
|
|
bootmem_data_t *bdata;
|
|
bootmem_data_t *bdata;
|
|
unsigned long pfn, goal, limit;
|
|
unsigned long pfn, goal, limit;
|
|
|
|
|
|
@@ -926,7 +777,6 @@ void * __init alloc_bootmem_section(unsigned long size,
|
|
bdata = &bootmem_node_data[early_pfn_to_nid(pfn)];
|
|
bdata = &bootmem_node_data[early_pfn_to_nid(pfn)];
|
|
|
|
|
|
return alloc_bootmem_core(bdata, size, SMP_CACHE_BYTES, goal, limit);
|
|
return alloc_bootmem_core(bdata, size, SMP_CACHE_BYTES, goal, limit);
|
|
-#endif
|
|
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
@@ -938,16 +788,11 @@ void * __init __alloc_bootmem_node_nopanic(pg_data_t *pgdat, unsigned long size,
|
|
if (WARN_ON_ONCE(slab_is_available()))
|
|
if (WARN_ON_ONCE(slab_is_available()))
|
|
return kzalloc_node(size, GFP_NOWAIT, pgdat->node_id);
|
|
return kzalloc_node(size, GFP_NOWAIT, pgdat->node_id);
|
|
|
|
|
|
-#ifdef CONFIG_NO_BOOTMEM
|
|
|
|
- ptr = __alloc_memory_core_early(pgdat->node_id, size, align,
|
|
|
|
- goal, -1ULL);
|
|
|
|
-#else
|
|
|
|
ptr = alloc_arch_preferred_bootmem(pgdat->bdata, size, align, goal, 0);
|
|
ptr = alloc_arch_preferred_bootmem(pgdat->bdata, size, align, goal, 0);
|
|
if (ptr)
|
|
if (ptr)
|
|
return ptr;
|
|
return ptr;
|
|
|
|
|
|
ptr = alloc_bootmem_core(pgdat->bdata, size, align, goal, 0);
|
|
ptr = alloc_bootmem_core(pgdat->bdata, size, align, goal, 0);
|
|
-#endif
|
|
|
|
if (ptr)
|
|
if (ptr)
|
|
return ptr;
|
|
return ptr;
|
|
|
|
|
|
@@ -995,21 +840,9 @@ void * __init __alloc_bootmem_low(unsigned long size, unsigned long align,
|
|
void * __init __alloc_bootmem_low_node(pg_data_t *pgdat, unsigned long size,
|
|
void * __init __alloc_bootmem_low_node(pg_data_t *pgdat, unsigned long size,
|
|
unsigned long align, unsigned long goal)
|
|
unsigned long align, unsigned long goal)
|
|
{
|
|
{
|
|
- void *ptr;
|
|
|
|
-
|
|
|
|
if (WARN_ON_ONCE(slab_is_available()))
|
|
if (WARN_ON_ONCE(slab_is_available()))
|
|
return kzalloc_node(size, GFP_NOWAIT, pgdat->node_id);
|
|
return kzalloc_node(size, GFP_NOWAIT, pgdat->node_id);
|
|
|
|
|
|
-#ifdef CONFIG_NO_BOOTMEM
|
|
|
|
- ptr = __alloc_memory_core_early(pgdat->node_id, size, align,
|
|
|
|
|
|
+ return ___alloc_bootmem_node(pgdat->bdata, size, align,
|
|
goal, ARCH_LOW_ADDRESS_LIMIT);
|
|
goal, ARCH_LOW_ADDRESS_LIMIT);
|
|
- if (ptr)
|
|
|
|
- return ptr;
|
|
|
|
- ptr = __alloc_memory_core_early(MAX_NUMNODES, size, align,
|
|
|
|
- goal, ARCH_LOW_ADDRESS_LIMIT);
|
|
|
|
-#else
|
|
|
|
- ptr = ___alloc_bootmem_node(pgdat->bdata, size, align,
|
|
|
|
- goal, ARCH_LOW_ADDRESS_LIMIT);
|
|
|
|
-#endif
|
|
|
|
- return ptr;
|
|
|
|
}
|
|
}
|