|
@@ -273,10 +273,10 @@ static unsigned long *__kmalloc_section_usemap(void)
|
|
|
#ifdef CONFIG_MEMORY_HOTREMOVE
|
|
|
static unsigned long * __init
|
|
|
sparse_early_usemaps_alloc_pgdat_section(struct pglist_data *pgdat,
|
|
|
- unsigned long count)
|
|
|
+ unsigned long size)
|
|
|
{
|
|
|
- unsigned long section_nr;
|
|
|
-
|
|
|
+ pg_data_t *host_pgdat;
|
|
|
+ unsigned long goal;
|
|
|
/*
|
|
|
* A page may contain usemaps for other sections preventing the
|
|
|
* page being freed and making a section unremovable while
|
|
@@ -287,8 +287,10 @@ sparse_early_usemaps_alloc_pgdat_section(struct pglist_data *pgdat,
|
|
|
* from the same section as the pgdat where possible to avoid
|
|
|
* this problem.
|
|
|
*/
|
|
|
- section_nr = pfn_to_section_nr(__pa(pgdat) >> PAGE_SHIFT);
|
|
|
- return alloc_bootmem_section(usemap_size() * count, section_nr);
|
|
|
+ goal = __pa(pgdat) & PAGE_SECTION_MASK;
|
|
|
+ host_pgdat = NODE_DATA(early_pfn_to_nid(goal >> PAGE_SHIFT));
|
|
|
+ return __alloc_bootmem_node_nopanic(host_pgdat, size,
|
|
|
+ SMP_CACHE_BYTES, goal);
|
|
|
}
|
|
|
|
|
|
static void __init check_usemap_section_nr(int nid, unsigned long *usemap)
|
|
@@ -332,9 +334,9 @@ static void __init check_usemap_section_nr(int nid, unsigned long *usemap)
|
|
|
#else
|
|
|
static unsigned long * __init
|
|
|
sparse_early_usemaps_alloc_pgdat_section(struct pglist_data *pgdat,
|
|
|
- unsigned long count)
|
|
|
+ unsigned long size)
|
|
|
{
|
|
|
- return NULL;
|
|
|
+ return alloc_bootmem_node_nopanic(pgdat, size);
|
|
|
}
|
|
|
|
|
|
static void __init check_usemap_section_nr(int nid, unsigned long *usemap)
|
|
@@ -352,13 +354,10 @@ static void __init sparse_early_usemaps_alloc_node(unsigned long**usemap_map,
|
|
|
int size = usemap_size();
|
|
|
|
|
|
usemap = sparse_early_usemaps_alloc_pgdat_section(NODE_DATA(nodeid),
|
|
|
- usemap_count);
|
|
|
+ size * usemap_count);
|
|
|
if (!usemap) {
|
|
|
- usemap = alloc_bootmem_node(NODE_DATA(nodeid), size * usemap_count);
|
|
|
- if (!usemap) {
|
|
|
- printk(KERN_WARNING "%s: allocation failed\n", __func__);
|
|
|
- return;
|
|
|
- }
|
|
|
+ printk(KERN_WARNING "%s: allocation failed\n", __func__);
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
for (pnum = pnum_begin; pnum < pnum_end; pnum++) {
|