From: shaohui.zheng@intel.com
To: akpm@linux-foundation.org, linux-mm@kvack.org
Cc: linux-kernel@vger.kernel.org, haicheng.li@linux.intel.com,
lethal@linux-sh.org, ak@linux.intel.com,
shaohui.zheng@linux.intel.com, rientjes@google.com,
dave@linux.vnet.ibm.com, gregkh@suse.de,
Shaohui Zheng <shaohui.zheng@intel.com>,
Haicheng Li <haicheng.li@intel.com>,
Wu Fengguang <fengguang.wu@intel.com>
Subject: [6/8, v5] From: Shaohui Zheng <shaohui.zheng@intel.com>
Date: Mon, 29 Nov 2010 17:17:56 +0800 [thread overview]
Message-ID: <20101129091936.116394523@intel.com> (raw)
In-Reply-To: 20101129091750.950277284@intel.com
[-- Attachment #1: 006-hotplug-emulator-extend-memory-probe-interface-to-support-numa.patch --]
[-- Type: text/plain, Size: 5705 bytes --]
Subject: [6/8, v5] NUMA Hotplug Emulator: extend memory probe interface to support NUMA
Extend memory probe interface to support an extra paramter nid,
the reserved memory can be added into this node if node exists.
Add a memory section(128M) to node 3(boots with mem=1024m)
echo 0x40000000,3 > memory/probe
And more we make it friendly, it is possible to add memory to do
echo 3g > memory/probe
echo 1024m,3 > memory/probe
It maintains backwards compatibility.
Another format suggested by Dave Hansen:
echo physical_address=0x40000000 numa_node=3 > memory/probe
it is more explicit to show meaning of the parameters.
Signed-off-by: Shaohui Zheng <shaohui.zheng@intel.com>
Signed-off-by: Haicheng Li <haicheng.li@intel.com>
Signed-off-by: Wu Fengguang <fengguang.wu@intel.com>
---
Index: linux-hpe4/arch/x86/Kconfig
===================================================================
--- linux-hpe4.orig/arch/x86/Kconfig 2010-11-29 14:43:51.529065999 +0800
+++ linux-hpe4/arch/x86/Kconfig 2010-11-29 14:43:54.569066000 +0800
@@ -1276,10 +1276,6 @@
def_bool y
depends on ARCH_SPARSEMEM_ENABLE
-config ARCH_MEMORY_PROBE
- def_bool X86_64
- depends on MEMORY_HOTPLUG
-
config ILLEGAL_POINTER_VALUE
hex
default 0 if X86_32
Index: linux-hpe4/drivers/base/memory.c
===================================================================
--- linux-hpe4.orig/drivers/base/memory.c 2010-11-29 14:43:51.539066000 +0800
+++ linux-hpe4/drivers/base/memory.c 2010-11-29 14:43:54.569066000 +0800
@@ -329,27 +329,76 @@
* will not need to do it from userspace. The fake hot-add code
* as well as ppc64 will do all of their discovery in userspace
* and will require this interface.
+ *
+ * Parameter format 1: physical_address,numa_node
+ * Parameter format 2: physical_address=0x40000000 numa_node=3
*/
#ifdef CONFIG_ARCH_MEMORY_PROBE
-static ssize_t
-memory_probe_store(struct class *class, struct class_attribute *attr,
- const char *buf, size_t count)
+ssize_t parse_memory_probe_store(const char *buf, size_t count)
{
- u64 phys_addr;
- int nid;
+ u64 phys_addr = 0;
+ int nid = 0;
int ret;
+ char *p = NULL, *q = NULL;
+ /* format: physical_address=0x40000000 numa_node=3 */
+ p = strchr(buf, '=');
+ if (p != NULL) {
+ *p = '\0';
+ q = strchr(buf, ' ');
+ if (q == NULL) {
+ if (strcmp(buf, "physical_address") != 0)
+ ret = -EPERM;
+ else
+ phys_addr = memparse(p+1, NULL);
+ } else {
+ *q++ = '\0';
+ p = strchr(q, '=');
+ if (strcmp(buf, "physical_address") == 0)
+ phys_addr = memparse(p+1, NULL);
+ if (strcmp(buf, "numa_node") == 0)
+ nid = simple_strtoul(p+1, NULL, 0);
+ if (strcmp(q, "physical_address") == 0)
+ phys_addr = memparse(p+1, NULL);
+ if (strcmp(q, "numa_node") == 0)
+ nid = simple_strtoul(p+1, NULL, 0);
+ }
+ } else { /* physical_address,numa_node */
+ p = strchr(buf, ',');
+ if (p != NULL && strlen(p+1) > 0) {
+ /* nid specified */
+ *p++ = '\0';
+ nid = simple_strtoul(p, NULL, 0);
+ phys_addr = memparse(buf, NULL);
+ } else {
+ phys_addr = memparse(buf, NULL);
+ nid = memory_add_physaddr_to_nid(phys_addr);
+ }
+ }
- phys_addr = simple_strtoull(buf, NULL, 0);
-
- nid = memory_add_physaddr_to_nid(phys_addr);
- ret = add_memory(nid, phys_addr, PAGES_PER_SECTION << PAGE_SHIFT);
+ if (nid < 0 || nid > nr_node_ids - 1) {
+ printk(KERN_ERR "Invalid node id %d(0<=nid<%d).\n", nid, nr_node_ids);
+ ret = -EPERM;
+ } else {
+ printk(KERN_INFO "Add a memory section to node: %d.\n", nid);
+ ret = add_memory(nid, phys_addr, PAGES_PER_SECTION << PAGE_SHIFT);
+ if (ret)
+ count = ret;
+ }
if (ret)
count = ret;
return count;
}
-static CLASS_ATTR(probe, S_IWUSR, NULL, memory_probe_store);
+EXPORT_SYMBOL(parse_memory_probe_store);
+
+static ssize_t
+memory_probe_store(struct class *class, struct class_attribute *attr,
+ const char *buf, size_t count)
+{
+ return parse_memory_probe_store(buf, count);
+}
+
static int memory_probe_init(void)
{
Index: linux-hpe4/mm/Kconfig
===================================================================
--- linux-hpe4.orig/mm/Kconfig 2010-11-29 14:43:51.549066001 +0800
+++ linux-hpe4/mm/Kconfig 2010-11-29 14:43:54.569066000 +0800
@@ -174,6 +174,17 @@
default "999999" if DEBUG_SPINLOCK || DEBUG_LOCK_ALLOC
default "4"
+config ARCH_MEMORY_PROBE
+ def_bool y
+ bool "Memory hotplug emulation"
+ depends on MEMORY_HOTPLUG
+ ---help---
+ Enable memory hotplug emulation. Reserve memory with grub parameter
+ "mem=N"(such as mem=1024M), where N is the initial memory size, the
+ rest physical memory will be removed from e820 table; the memory probe
+ interface is for memory hot-add to specified node in software method.
+ This is for debuging and testing purpose
+
#
# support for memory compaction
config COMPACTION
Index: linux-hpe4/include/linux/memory_hotplug.h
===================================================================
--- linux-hpe4.orig/include/linux/memory_hotplug.h 2010-11-29 14:43:51.559066001 +0800
+++ linux-hpe4/include/linux/memory_hotplug.h 2010-11-29 14:43:54.569066000 +0800
@@ -211,6 +211,14 @@
extern void sparse_remove_one_section(struct zone *zone, struct mem_section *ms);
extern struct page *sparse_decode_mem_map(unsigned long coded_mem_map,
unsigned long pnum);
+#ifdef CONFIG_ARCH_MEMORY_PROBE
+extern ssize_t parse_memory_probe_store(const char *buf, size_t count);
+#else
+static inline ssize_t parse_memory_probe_store(const char *buf, size_t count)
+{
+ return 0;
+}
+#endif /* CONFIG_ARCH_MEMORY_PROBE */
#ifdef CONFIG_ARCH_MEMORY_PROBE
extern ssize_t parse_memory_probe_store(const char *buf, size_t count);
--
Thanks & Regards,
Shaohui
WARNING: multiple messages have this Message-ID (diff)
From: shaohui.zheng@intel.com
To: akpm@linux-foundation.org, linux-mm@kvack.org
Cc: linux-kernel@vger.kernel.org, haicheng.li@linux.intel.com,
lethal@linux-sh.org, ak@linux.intel.com,
shaohui.zheng@linux.intel.com, rientjes@google.com,
dave@linux.vnet.ibm.com, gregkh@suse.de,
Shaohui Zheng <shaohui.zheng@intel.com>,
Haicheng Li <haicheng.li@intel.com>,
Wu Fengguang <fengguang.wu@intel.com>
Subject: [6/8, v5] From: Shaohui Zheng <shaohui.zheng@intel.com>
Date: Mon, 29 Nov 2010 17:17:56 +0800 [thread overview]
Message-ID: <20101129091936.116394523@intel.com> (raw)
In-Reply-To: 20101129091750.950277284@intel.com
[-- Attachment #1: 006-hotplug-emulator-extend-memory-probe-interface-to-support-numa.patch --]
[-- Type: text/plain, Size: 6001 bytes --]
Subject: [6/8, v5] NUMA Hotplug Emulator: extend memory probe interface to support NUMA
Extend memory probe interface to support an extra paramter nid,
the reserved memory can be added into this node if node exists.
Add a memory section(128M) to node 3(boots with mem=1024m)
echo 0x40000000,3 > memory/probe
And more we make it friendly, it is possible to add memory to do
echo 3g > memory/probe
echo 1024m,3 > memory/probe
It maintains backwards compatibility.
Another format suggested by Dave Hansen:
echo physical_address=0x40000000 numa_node=3 > memory/probe
it is more explicit to show meaning of the parameters.
Signed-off-by: Shaohui Zheng <shaohui.zheng@intel.com>
Signed-off-by: Haicheng Li <haicheng.li@intel.com>
Signed-off-by: Wu Fengguang <fengguang.wu@intel.com>
---
Index: linux-hpe4/arch/x86/Kconfig
===================================================================
--- linux-hpe4.orig/arch/x86/Kconfig 2010-11-29 14:43:51.529065999 +0800
+++ linux-hpe4/arch/x86/Kconfig 2010-11-29 14:43:54.569066000 +0800
@@ -1276,10 +1276,6 @@
def_bool y
depends on ARCH_SPARSEMEM_ENABLE
-config ARCH_MEMORY_PROBE
- def_bool X86_64
- depends on MEMORY_HOTPLUG
-
config ILLEGAL_POINTER_VALUE
hex
default 0 if X86_32
Index: linux-hpe4/drivers/base/memory.c
===================================================================
--- linux-hpe4.orig/drivers/base/memory.c 2010-11-29 14:43:51.539066000 +0800
+++ linux-hpe4/drivers/base/memory.c 2010-11-29 14:43:54.569066000 +0800
@@ -329,27 +329,76 @@
* will not need to do it from userspace. The fake hot-add code
* as well as ppc64 will do all of their discovery in userspace
* and will require this interface.
+ *
+ * Parameter format 1: physical_address,numa_node
+ * Parameter format 2: physical_address=0x40000000 numa_node=3
*/
#ifdef CONFIG_ARCH_MEMORY_PROBE
-static ssize_t
-memory_probe_store(struct class *class, struct class_attribute *attr,
- const char *buf, size_t count)
+ssize_t parse_memory_probe_store(const char *buf, size_t count)
{
- u64 phys_addr;
- int nid;
+ u64 phys_addr = 0;
+ int nid = 0;
int ret;
+ char *p = NULL, *q = NULL;
+ /* format: physical_address=0x40000000 numa_node=3 */
+ p = strchr(buf, '=');
+ if (p != NULL) {
+ *p = '\0';
+ q = strchr(buf, ' ');
+ if (q == NULL) {
+ if (strcmp(buf, "physical_address") != 0)
+ ret = -EPERM;
+ else
+ phys_addr = memparse(p+1, NULL);
+ } else {
+ *q++ = '\0';
+ p = strchr(q, '=');
+ if (strcmp(buf, "physical_address") == 0)
+ phys_addr = memparse(p+1, NULL);
+ if (strcmp(buf, "numa_node") == 0)
+ nid = simple_strtoul(p+1, NULL, 0);
+ if (strcmp(q, "physical_address") == 0)
+ phys_addr = memparse(p+1, NULL);
+ if (strcmp(q, "numa_node") == 0)
+ nid = simple_strtoul(p+1, NULL, 0);
+ }
+ } else { /* physical_address,numa_node */
+ p = strchr(buf, ',');
+ if (p != NULL && strlen(p+1) > 0) {
+ /* nid specified */
+ *p++ = '\0';
+ nid = simple_strtoul(p, NULL, 0);
+ phys_addr = memparse(buf, NULL);
+ } else {
+ phys_addr = memparse(buf, NULL);
+ nid = memory_add_physaddr_to_nid(phys_addr);
+ }
+ }
- phys_addr = simple_strtoull(buf, NULL, 0);
-
- nid = memory_add_physaddr_to_nid(phys_addr);
- ret = add_memory(nid, phys_addr, PAGES_PER_SECTION << PAGE_SHIFT);
+ if (nid < 0 || nid > nr_node_ids - 1) {
+ printk(KERN_ERR "Invalid node id %d(0<=nid<%d).\n", nid, nr_node_ids);
+ ret = -EPERM;
+ } else {
+ printk(KERN_INFO "Add a memory section to node: %d.\n", nid);
+ ret = add_memory(nid, phys_addr, PAGES_PER_SECTION << PAGE_SHIFT);
+ if (ret)
+ count = ret;
+ }
if (ret)
count = ret;
return count;
}
-static CLASS_ATTR(probe, S_IWUSR, NULL, memory_probe_store);
+EXPORT_SYMBOL(parse_memory_probe_store);
+
+static ssize_t
+memory_probe_store(struct class *class, struct class_attribute *attr,
+ const char *buf, size_t count)
+{
+ return parse_memory_probe_store(buf, count);
+}
+
static int memory_probe_init(void)
{
Index: linux-hpe4/mm/Kconfig
===================================================================
--- linux-hpe4.orig/mm/Kconfig 2010-11-29 14:43:51.549066001 +0800
+++ linux-hpe4/mm/Kconfig 2010-11-29 14:43:54.569066000 +0800
@@ -174,6 +174,17 @@
default "999999" if DEBUG_SPINLOCK || DEBUG_LOCK_ALLOC
default "4"
+config ARCH_MEMORY_PROBE
+ def_bool y
+ bool "Memory hotplug emulation"
+ depends on MEMORY_HOTPLUG
+ ---help---
+ Enable memory hotplug emulation. Reserve memory with grub parameter
+ "mem=N"(such as mem=1024M), where N is the initial memory size, the
+ rest physical memory will be removed from e820 table; the memory probe
+ interface is for memory hot-add to specified node in software method.
+ This is for debuging and testing purpose
+
#
# support for memory compaction
config COMPACTION
Index: linux-hpe4/include/linux/memory_hotplug.h
===================================================================
--- linux-hpe4.orig/include/linux/memory_hotplug.h 2010-11-29 14:43:51.559066001 +0800
+++ linux-hpe4/include/linux/memory_hotplug.h 2010-11-29 14:43:54.569066000 +0800
@@ -211,6 +211,14 @@
extern void sparse_remove_one_section(struct zone *zone, struct mem_section *ms);
extern struct page *sparse_decode_mem_map(unsigned long coded_mem_map,
unsigned long pnum);
+#ifdef CONFIG_ARCH_MEMORY_PROBE
+extern ssize_t parse_memory_probe_store(const char *buf, size_t count);
+#else
+static inline ssize_t parse_memory_probe_store(const char *buf, size_t count)
+{
+ return 0;
+}
+#endif /* CONFIG_ARCH_MEMORY_PROBE */
#ifdef CONFIG_ARCH_MEMORY_PROBE
extern ssize_t parse_memory_probe_store(const char *buf, size_t count);
--
Thanks & Regards,
Shaohui
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom policy in Canada: sign http://dissolvethecrtc.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2010-11-29 10:45 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-11-29 9:17 [0/8, v5] NUMA Hotplug Emulator(v5) - Feedbacks & Responses shaohui.zheng
2010-11-29 9:17 ` shaohui.zheng
2010-11-29 9:17 ` [1/8, v5] NUMA Hotplug Emulator: Add numa=possibe options shaohui.zheng
2010-11-29 9:17 ` shaohui.zheng
2010-11-29 23:59 ` David Rientjes
2010-11-29 23:59 ` David Rientjes
2010-11-30 1:09 ` Shaohui Zheng
2010-11-30 1:09 ` Shaohui Zheng
2010-11-29 9:17 ` [2/8, v5] NUMA Hotplug Emulator: Add node hotplug emulation shaohui.zheng
2010-11-29 9:17 ` shaohui.zheng
2010-11-30 0:01 ` David Rientjes
2010-11-30 0:01 ` David Rientjes
2010-11-30 1:22 ` Shaohui Zheng
2010-11-30 1:22 ` Shaohui Zheng
2010-11-30 20:10 ` David Rientjes
2010-11-30 20:10 ` David Rientjes
2010-11-30 23:16 ` Shaohui Zheng
2010-11-30 23:16 ` Shaohui Zheng
2010-12-02 0:59 ` David Rientjes
2010-12-02 0:59 ` David Rientjes
2010-11-29 9:17 ` [3/8, v5] NUMA Hotplug Emulation: Abstract cpu register functions shaohui.zheng
2010-11-29 9:17 ` shaohui.zheng
2010-11-29 9:17 ` [4/8, v5] NUMA Hotplug Emulator: support cpu probe/release in x86_64 shaohui.zheng
2010-11-29 9:17 ` shaohui.zheng
2010-11-29 9:17 ` [5/8, v5] NUMA Hotplug Emulator: Fake CPU socket with logical CPU on x86 shaohui.zheng
2010-11-29 9:17 ` shaohui.zheng
2010-11-29 9:17 ` shaohui.zheng [this message]
2010-11-29 9:17 ` [6/8, v5] From: Shaohui Zheng <shaohui.zheng@intel.com> shaohui.zheng
2010-11-29 9:17 ` [7/8, v5] NUMA Hotplug Emulator: implement debugfs interface for memory probe shaohui.zheng
2010-11-29 9:17 ` shaohui.zheng
2010-11-29 9:17 ` [8/8, v5] NUMA Hotplug Emulator: documentation shaohui.zheng
2010-11-29 9:17 ` shaohui.zheng
2010-11-29 18:19 ` Valdis.Kletnieks
2010-11-30 1:31 ` Shaohui Zheng
2010-11-30 1:31 ` Shaohui Zheng
2010-11-30 0:02 ` David Rientjes
2010-11-30 0:02 ` David Rientjes
2010-11-30 1:32 ` Shaohui Zheng
2010-11-30 1:32 ` Shaohui Zheng
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=20101129091936.116394523@intel.com \
--to=shaohui.zheng@intel.com \
--cc=ak@linux.intel.com \
--cc=akpm@linux-foundation.org \
--cc=dave@linux.vnet.ibm.com \
--cc=fengguang.wu@intel.com \
--cc=gregkh@suse.de \
--cc=haicheng.li@intel.com \
--cc=haicheng.li@linux.intel.com \
--cc=lethal@linux-sh.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=rientjes@google.com \
--cc=shaohui.zheng@linux.intel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.