All of lore.kernel.org
 help / color / mirror / Atom feed
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>

  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.