Re: [PATCH v3 12/13] x86, numa, acpi, memory-hotplug: Make movablecore=acpi have higher priority.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, May 24, 2013 at 05:29:21PM +0800, Tang Chen wrote:
>Arrange hotpluggable memory as ZONE_MOVABLE will cause NUMA performance decreased
>because the kernel cannot use movable memory.
>
>For users who don't use memory hotplug and who don't want to lose their NUMA
>performance, they need a way to disable this functionality.
>
>So, if users specify "movablecore=acpi" in kernel commandline, the kernel will
>use SRAT to arrange ZONE_MOVABLE, and it has higher priority then original
>movablecore and kernelcore boot option.
>
>For those who don't want this, just specify nothing.
>

Reviewed-by: Wanpeng Li <liwanp@xxxxxxxxxxxxxxxxxx>

>Signed-off-by: Tang Chen <tangchen@xxxxxxxxxxxxxx>
>---
> include/linux/memblock.h |    1 +
> mm/memblock.c            |    5 +++++
> mm/page_alloc.c          |   31 +++++++++++++++++++++++++++++--
> 3 files changed, 35 insertions(+), 2 deletions(-)
>
>diff --git a/include/linux/memblock.h b/include/linux/memblock.h
>index 08c761d..5528e8f 100644
>--- a/include/linux/memblock.h
>+++ b/include/linux/memblock.h
>@@ -69,6 +69,7 @@ int memblock_free(phys_addr_t base, phys_addr_t size);
> int memblock_reserve(phys_addr_t base, phys_addr_t size);
> int memblock_reserve_local_node(phys_addr_t base, phys_addr_t size, int nid);
> int memblock_reserve_hotpluggable(phys_addr_t base, phys_addr_t size, int nid);
>+bool memblock_is_hotpluggable(struct memblock_region *region);
> void memblock_free_hotpluggable(void);
> void memblock_trim_memory(phys_addr_t align);
> void memblock_mark_kernel_nodes(void);
>diff --git a/mm/memblock.c b/mm/memblock.c
>index 54de398..8b9a13c 100644
>--- a/mm/memblock.c
>+++ b/mm/memblock.c
>@@ -623,6 +623,11 @@ int __init_memblock memblock_reserve_hotpluggable(phys_addr_t base,
> 	return memblock_reserve_region(base, size, nid, flags);
> }
>
>+bool __init_memblock memblock_is_hotpluggable(struct memblock_region *region)
>+{
>+	return region->flags & (1 << MEMBLK_HOTPLUGGABLE);
>+}
>+
> /**
>  * __next_free_mem_range - next function for for_each_free_mem_range()
>  * @idx: pointer to u64 loop variable
>diff --git a/mm/page_alloc.c b/mm/page_alloc.c
>index b9ea143..557b21b 100644
>--- a/mm/page_alloc.c
>+++ b/mm/page_alloc.c
>@@ -4793,9 +4793,37 @@ static void __init find_zone_movable_pfns_for_nodes(void)
> 	nodemask_t saved_node_state = node_states[N_MEMORY];
> 	unsigned long totalpages = early_calculate_totalpages();
> 	int usable_nodes = nodes_weight(node_states[N_MEMORY]);
>+	struct memblock_type *reserved = &memblock.reserved;
>
> 	/*
>-	 * If movablecore was specified, calculate what size of
>+	 * Need to find movable_zone earlier in case movablecore=acpi is
>+	 * specified.
>+	 */
>+	find_usable_zone_for_movable();
>+
>+	/*
>+	 * If movablecore=acpi was specified, then zone_movable_pfn[] has been
>+	 * initialized, and no more work needs to do.
>+	 * NOTE: In this case, we ignore kernelcore option.
>+	 */
>+	if (movablecore_enable_srat) {
>+		for (i = 0; i < reserved->cnt; i++) {
>+			if (!memblock_is_hotpluggable(&reserved->regions[i]))
>+				continue;
>+
>+			nid = reserved->regions[i].nid;
>+
>+			usable_startpfn = PFN_DOWN(reserved->regions[i].base);
>+			zone_movable_pfn[nid] = zone_movable_pfn[nid] ?
>+				min(usable_startpfn, zone_movable_pfn[nid]) :
>+				usable_startpfn;
>+		}
>+
>+		goto out;
>+	}
>+
>+	/*
>+	 * If movablecore=nn[KMG] was specified, calculate what size of
> 	 * kernelcore that corresponds so that memory usable for
> 	 * any allocation type is evenly spread. If both kernelcore
> 	 * and movablecore are specified, then the value of kernelcore
>@@ -4821,7 +4849,6 @@ static void __init find_zone_movable_pfns_for_nodes(void)
> 		goto out;
>
> 	/* usable_startpfn is the lowest possible pfn ZONE_MOVABLE can be at */
>-	find_usable_zone_for_movable();
> 	usable_startpfn = arch_zone_lowest_possible_pfn[movable_zone];
>
> restart:
>-- 
>1.7.1
>
>--
>To unsubscribe, send a message with 'unsubscribe linux-mm' in
>the body to majordomo@xxxxxxxxx.  For more info on Linux MM,
>see: http://www.linux-mm.org/ .
>Don't email: <a href=mailto:"dont@xxxxxxxxx";> email@xxxxxxxxx </a>

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@xxxxxxxxx.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@xxxxxxxxx";> email@xxxxxxxxx </a>




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]