memory hotplug: make alloc_bootmem_section()
alloc_bootmem_section() can allocate specified section's area. This is used for usemap to keep same section with pgdat by later patch. Signed-off-by: Yasunori Goto <y-goto@jp.fujitsu.com> Cc: Badari Pulavarty <pbadari@us.ibm.com> Cc: Yinghai Lu <yhlu.kernel@gmail.com> Cc: Yasunori Goto <y-goto@jp.fujitsu.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Родитель
9d99217a02
Коммит
e70260aabe
|
@ -101,6 +101,8 @@ extern void reserve_bootmem_node(pg_data_t *pgdat,
|
|||
extern void free_bootmem_node(pg_data_t *pgdat,
|
||||
unsigned long addr,
|
||||
unsigned long size);
|
||||
extern void *alloc_bootmem_section(unsigned long size,
|
||||
unsigned long section_nr);
|
||||
|
||||
#ifndef CONFIG_HAVE_ARCH_BOOTMEM_NODE
|
||||
#define alloc_bootmem_node(pgdat, x) \
|
||||
|
|
31
mm/bootmem.c
31
mm/bootmem.c
|
@ -545,6 +545,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
|
||||
|
|
Загрузка…
Ссылка в новой задаче