arm: add support for ARCH_POPULATES_NODE_MAP

ARCH_POPULATES_NODE_MAP is used by most of the other
architectures and allows finer-grained control of
how and where zones are placed.

Signed-off-by: Larry Bassel <lbassel@codeaurora.org>

Conflicts:

	arch/arm/mm/init.c
This commit is contained in:
Larry Bassel
2011-09-08 10:46:49 -07:00
committed by Bryan Huntsman
parent b3e55c62ed
commit d4e809ea8c
2 changed files with 32 additions and 0 deletions

View File

@@ -1593,6 +1593,10 @@ config ARCH_MEMORY_REMOVE
def_bool n
depends on MEMORY_HOTPLUG
config ARCH_POPULATES_NODE_MAP
def_bool n
depends on MEMORY_HOTPLUG
config DONT_RESERVE_FROM_MOVABLE_ZONE
def_bool y
depends on MEMORY_HOTPLUG

View File

@@ -225,6 +225,29 @@ static void __init arm_adjust_dma_zone(unsigned long *size, unsigned long *hole,
}
#endif
#ifdef CONFIG_ARCH_POPULATES_NODE_MAP
static void __init arm_bootmem_free_apnm(unsigned long max_low,
unsigned long max_high)
{
unsigned long max_zone_pfns[MAX_NR_ZONES];
struct memblock_region *reg;
memset(max_zone_pfns, 0, sizeof(max_zone_pfns));
max_zone_pfns[0] = max_low;
#ifdef CONFIG_HIGHMEM
max_zone_pfns[ZONE_HIGHMEM] = max_high;
#endif
for_each_memblock(memory, reg) {
unsigned long start = memblock_region_memory_base_pfn(reg);
unsigned long end = memblock_region_memory_end_pfn(reg);
add_active_range(0, start, end);
}
free_area_init_nodes(max_zone_pfns);
}
#else
static void __init arm_bootmem_free(unsigned long min, unsigned long max_low,
unsigned long max_high)
{
@@ -282,6 +305,7 @@ static void __init arm_bootmem_free(unsigned long min, unsigned long max_low,
free_area_init_node(0, zone_size, min, zhole_size);
}
#endif
#ifdef CONFIG_HAVE_ARCH_PFN_VALID
int pfn_valid(unsigned long pfn)
@@ -417,12 +441,16 @@ void __init bootmem_init(void)
*/
sparse_init();
#ifdef CONFIG_ARCH_POPULATES_NODE_MAP
arm_bootmem_free_apnm(max_low, max_high);
#else
/*
* Now free the memory - free_area_init_node needs
* the sparse mem_map arrays initialized by sparse_init()
* for memmap_init_zone(), otherwise all PFNs are invalid.
*/
arm_bootmem_free(min, max_low, max_high);
#endif
high_memory = __va(((phys_addr_t)max_low << PAGE_SHIFT) - 1) + 1;