linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Tang Chen <tangchen@cn.fujitsu.com>
To: rjw@sisk.pl, lenb@kernel.org, tglx@linutronix.de, mingo@elte.hu,
	hpa@zytor.com, akpm@linux-foundation.org, tj@kernel.org,
	trenn@suse.de, yinghai@kernel.org, jiang.liu@huawei.com,
	wency@cn.fujitsu.com, laijs@cn.fujitsu.com,
	isimatu.yasuaki@jp.fujitsu.com, izumi.taku@jp.fujitsu.com,
	mgorman@suse.de, minchan@kernel.org, mina86@mina86.com,
	gong.chen@linux.intel.com, vasilis.liaskovitis@profitbricks.com,
	lwoodman@redhat.com, riel@redhat.com, jweiner@redhat.com,
	prarit@redhat.com, zhangyanfei@cn.fujitsu.com
Cc: x86@kernel.org, linux-doc@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-mm@kvack.org,
	linux-acpi@vger.kernel.org
Subject: [PATCH 05/11] memblock: Introduce allocation order to memblock.
Date: Tue, 27 Aug 2013 17:37:42 +0800	[thread overview]
Message-ID: <1377596268-31552-6-git-send-email-tangchen@cn.fujitsu.com> (raw)
In-Reply-To: <1377596268-31552-1-git-send-email-tangchen@cn.fujitsu.com>

The Linux kernel cannot migrate pages used by the kernel. As a result, kernel
pages cannot be hot-removed. So we cannot allocate hotpluggable memory for
the kernel.

ACPI SRAT (System Resource Affinity Table) contains the memory hotplug info.
But before SRAT is parsed, memblock has already started to allocate memory
for the kernel. So we need to prevent memblock from doing this.

In a memory hotplug system, any numa node the kernel resides in should
be unhotpluggable. And for a modern server, each node could have at least
16GB memory. So memory around the kernel image is highly likely unhotpluggable.

So the basic idea is: Allocate memory from the end of the kernel image and
to the higher memory. Since memory allocation before SRAT is parsed won't
be too much, it could highly likely be in the same node with kernel image.

The current memblock can only allocate memory from high address to low.
So this patch introduces the allocation order to memblock. It could be
used to tell memblock to allocate memory from high to low or from low
to high.

Signed-off-by: Tang Chen <tangchen@cn.fujitsu.com>
Reviewed-by: Zhang Yanfei <zhangyanfei@cn.fujitsu.com>
---
 include/linux/memblock.h |   15 +++++++++++++++
 mm/memblock.c            |   13 +++++++++++++
 2 files changed, 28 insertions(+), 0 deletions(-)

diff --git a/include/linux/memblock.h b/include/linux/memblock.h
index cabd685..f233c1f 100644
--- a/include/linux/memblock.h
+++ b/include/linux/memblock.h
@@ -19,6 +19,11 @@
 
 #define INIT_MEMBLOCK_REGIONS	128
 
+/* Allocation order. */
+#define MEMBLOCK_ORDER_HIGH_TO_LOW	0
+#define MEMBLOCK_ORDER_LOW_TO_HIGH	1
+#define MEMBLOCK_ORDER_DEFAULT		MEMBLOCK_ORDER_HIGH_TO_LOW
+
 struct memblock_region {
 	phys_addr_t base;
 	phys_addr_t size;
@@ -35,6 +40,7 @@ struct memblock_type {
 };
 
 struct memblock {
+	int current_order;	/* allocate from higher or lower address */
 	phys_addr_t current_limit_low;	/* lower boundary of accessable range */
 	phys_addr_t current_limit_high;	/* upper boundary of accessable range */
 	struct memblock_type memory;
@@ -174,6 +180,15 @@ static inline void memblock_dump_all(void)
 }
 
 /**
+ * memblock_set_current_order - Set the current allocation order to allow
+ *                         allocating memory from higher to lower address or
+ *                         from lower to higher address
+ * @order: In which order to allocate memory. Could be
+ *         MEMBLOCK_ORDER_{HIGH_TO_LOW|LOW_TO_HIGH}
+ */
+void memblock_set_current_order(int order);
+
+/**
  * memblock_set_current_limit_low - Set the current allocation lower limit to
  *                         allow limiting allocations to what is currently
  *                         accessible during boot
diff --git a/mm/memblock.c b/mm/memblock.c
index 54c1c2e..8f1e2d4 100644
--- a/mm/memblock.c
+++ b/mm/memblock.c
@@ -32,6 +32,7 @@ struct memblock memblock __initdata_memblock = {
 	.reserved.cnt		= 1,	/* empty dummy entry */
 	.reserved.max		= INIT_MEMBLOCK_REGIONS,
 
+	.current_order		= MEMBLOCK_ORDER_DEFAULT,
 	.current_limit_low	= 0,
 	.current_limit_high	= MEMBLOCK_ALLOC_ANYWHERE,
 };
@@ -989,6 +990,18 @@ void __init_memblock memblock_trim_memory(phys_addr_t align)
 	}
 }
 
+void __init_memblock memblock_set_current_order(int order)
+{
+	if (order != MEMBLOCK_ORDER_HIGH_TO_LOW &&
+	    order != MEMBLOCK_ORDER_LOW_TO_HIGH) {
+		pr_warn("memblock: Failed to set allocation order. "
+			"Invalid order type: %d\n", order);
+		return;
+	}
+
+	memblock.current_order = order;
+}
+
 void __init_memblock memblock_set_current_limit_low(phys_addr_t limit)
 {
 	memblock.current_limit_low = limit;
-- 
1.7.1


  parent reply	other threads:[~2013-08-27  9:39 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-27  9:37 [PATCH 00/11] x86, memblock: Allocate memory near kernel image before SRAT parsed Tang Chen
2013-08-27  9:37 ` [PATCH 01/11] memblock: Rename current_limit to current_limit_high in memblock Tang Chen
2013-08-27  9:37 ` [PATCH 02/11] memblock: Rename memblock_set_current_limit() to memblock_set_current_limit_high() Tang Chen
2013-08-27  9:37 ` [PATCH 03/11] memblock: Introduce lowest limit in memblock Tang Chen
2013-08-27  9:37 ` [PATCH 04/11] memblock: Introduce memblock_set_current_limit_low() to set lower limit of memblock Tang Chen
2013-08-27  9:37 ` Tang Chen [this message]
     [not found]   ` <20130905091615.GB15294@hacker.(null)>
2013-09-05  9:21     ` [PATCH 05/11] memblock: Introduce allocation order to memblock Tang Chen
2013-08-27  9:37 ` [PATCH 06/11] memblock: Improve memblock to support allocation from lower address Tang Chen
2013-09-04  0:24   ` Toshi Kani
2013-09-04  1:00     ` Tang Chen
2013-08-27  9:37 ` [PATCH 07/11] x86, memblock: Set lowest limit for memblock_alloc_base_nid() Tang Chen
2013-09-04  0:37   ` Toshi Kani
2013-09-04  2:05     ` Tang Chen
2013-09-04 15:22       ` Toshi Kani
2013-08-27  9:37 ` [PATCH 08/11] x86, acpi, memblock: Use __memblock_alloc_base() in acpi_initrd_override() Tang Chen
2013-08-28  0:04   ` Rafael J. Wysocki
2013-08-27  9:37 ` [PATCH 09/11] mem-hotplug: Introduce movablenode boot option to {en|dis}able using SRAT Tang Chen
2013-08-27  9:37 ` [PATCH 10/11] x86, mem-hotplug: Support initialize page tables from low to high Tang Chen
     [not found]   ` <20130905133027.GA23038@hacker.(null)>
2013-09-06  1:34     ` Tang Chen
     [not found]       ` <20130906021653.GA1062@hacker.(null)>
2013-09-06  3:09         ` Tang Chen
2013-08-27  9:37 ` [PATCH 11/11] x86, mem_hotplug: Allocate memory near kernel image before SRAT is parsed Tang Chen
2013-09-04 19:40   ` Toshi Kani
     [not found] ` <20130828080311.GA608@hacker.(null)>
2013-08-28  9:34   ` [PATCH 00/11] x86, memblock: Allocate memory near kernel image before SRAT parsed Tang Chen
2013-08-28 15:19 ` Tejun Heo
2013-08-29  1:30   ` Tang Chen
     [not found]     ` <20130829013657.GA22599@hacker.(null)>
2013-08-29  1:53       ` Tang Chen
2013-09-02  1:03 ` Tang Chen
2013-09-04 19:22 ` Tejun Heo
2013-09-05  9:01   ` Tang Chen
     [not found]   ` <52299935.0302450a.26c9.ffffb240SMTPIN_ADDED_BROKEN@mx.google.com>
2013-09-06 15:15     ` Tejun Heo
2013-09-06 15:47       ` H. Peter Anvin
     [not found]       ` <522db781.22ab440a.41b1.ffffd825SMTPIN_ADDED_BROKEN@mx.google.com>
2013-09-09 13:58         ` Tejun Heo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1377596268-31552-6-git-send-email-tangchen@cn.fujitsu.com \
    --to=tangchen@cn.fujitsu.com \
    --cc=akpm@linux-foundation.org \
    --cc=gong.chen@linux.intel.com \
    --cc=hpa@zytor.com \
    --cc=isimatu.yasuaki@jp.fujitsu.com \
    --cc=izumi.taku@jp.fujitsu.com \
    --cc=jiang.liu@huawei.com \
    --cc=jweiner@redhat.com \
    --cc=laijs@cn.fujitsu.com \
    --cc=lenb@kernel.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=lwoodman@redhat.com \
    --cc=mgorman@suse.de \
    --cc=mina86@mina86.com \
    --cc=minchan@kernel.org \
    --cc=mingo@elte.hu \
    --cc=prarit@redhat.com \
    --cc=riel@redhat.com \
    --cc=rjw@sisk.pl \
    --cc=tglx@linutronix.de \
    --cc=tj@kernel.org \
    --cc=trenn@suse.de \
    --cc=vasilis.liaskovitis@profitbricks.com \
    --cc=wency@cn.fujitsu.com \
    --cc=x86@kernel.org \
    --cc=yinghai@kernel.org \
    --cc=zhangyanfei@cn.fujitsu.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).