From: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
To: Wen Congyang <wency@cn.fujitsu.com>
Cc: x86@kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org,
linuxppc-dev@lists.ozlabs.org, linux-acpi@vger.kernel.org,
linux-s390@vger.kernel.org, linux-sh@vger.kernel.org,
linux-ia64@vger.kernel.org, cmetcalf@tilera.com,
sparclinux@vger.kernel.org, David Rientjes <rientjes@google.com>,
Jiang Liu <liuj97@gmail.com>, Len Brown <len.brown@intel.com>,
benh@kernel.crashing.org, paulus@samba.org,
Christoph Lameter <cl@linux.com>,
Minchan Kim <minchan.kim@gmail.com>,
Andrew Morton <akpm@linux-foundation.org>,
KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
Jianguo Wu <wujianguo@huawei.com>
Subject: Re: [PATCH v3 11/12] memory-hotplug: remove sysfs file of node
Date: Mon, 19 Nov 2012 19:08:55 +0900 [thread overview]
Message-ID: <50AA0537.1000501@jp.fujitsu.com> (raw)
In-Reply-To: <1351763083-7905-12-git-send-email-wency@cn.fujitsu.com>
Hi Wen,
This patch cannot be applied, if I apply latest acpi framework's patch-set:
https://lkml.org/lkml/2012/11/15/21
Because acpi_memory_disable_device() is gone by the patch-set.
I updated the patch and attached it on the mail.
2012/11/01 18:44, Wen Congyang wrote:
> This patch introduces a new function try_offline_node() to
> remove sysfs file of node when all memory sections of this
> node are removed. If some memory sections of this node are
> not removed, this function does nothing.
>
> CC: David Rientjes <rientjes@google.com>
> CC: Jiang Liu <liuj97@gmail.com>
> CC: Len Brown <len.brown@intel.com>
> CC: Christoph Lameter <cl@linux.com>
> Cc: Minchan Kim <minchan.kim@gmail.com>
> CC: Andrew Morton <akpm@linux-foundation.org>
> CC: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
> CC: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
> Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
> ---
> drivers/acpi/acpi_memhotplug.c | 8 +++++-
> include/linux/memory_hotplug.h | 2 +-
> mm/memory_hotplug.c | 58 ++++++++++++++++++++++++++++++++++++++++--
> 3 files changed, 64 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c
> index 24c807f..0780f99 100644
> --- a/drivers/acpi/acpi_memhotplug.c
> +++ b/drivers/acpi/acpi_memhotplug.c
> @@ -310,7 +310,9 @@ static int acpi_memory_disable_device(struct acpi_memory_device *mem_device)
> {
> int result;
> struct acpi_memory_info *info, *n;
> + int node;
>
> + node = acpi_get_node(mem_device->device->handle);
>
> /*
> * Ask the VM to offline this memory range.
> @@ -318,7 +320,11 @@ static int acpi_memory_disable_device(struct acpi_memory_device *mem_device)
> */
> list_for_each_entry_safe(info, n, &mem_device->res_list, list) {
> if (info->enabled) {
> - result = remove_memory(info->start_addr, info->length);
> + if (node < 0)
> + node = memory_add_physaddr_to_nid(
> + info->start_addr);
> + result = remove_memory(node, info->start_addr,
> + info->length);
> if (result)
> return result;
> }
> diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h
> index d4c4402..7b4cfe6 100644
> --- a/include/linux/memory_hotplug.h
> +++ b/include/linux/memory_hotplug.h
> @@ -231,7 +231,7 @@ extern int arch_add_memory(int nid, u64 start, u64 size);
> extern int offline_pages(unsigned long start_pfn, unsigned long nr_pages);
> extern int offline_memory_block(struct memory_block *mem);
> extern bool is_memblock_offlined(struct memory_block *mem);
> -extern int remove_memory(u64 start, u64 size);
> +extern int remove_memory(int node, u64 start, u64 size);
> extern int sparse_add_one_section(struct zone *zone, unsigned long start_pfn,
> int nr_pages);
> extern void sparse_remove_one_section(struct zone *zone, struct mem_section *ms);
> diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
> index 7bcced0..d965da3 100644
> --- a/mm/memory_hotplug.c
> +++ b/mm/memory_hotplug.c
> @@ -29,6 +29,7 @@
> #include <linux/suspend.h>
> #include <linux/mm_inline.h>
> #include <linux/firmware-map.h>
> +#include <linux/stop_machine.h>
>
> #include <asm/tlbflush.h>
>
> @@ -1299,7 +1300,58 @@ static int is_memblock_offlined_cb(struct memory_block *mem, void *arg)
> return ret;
> }
>
> -int __ref remove_memory(u64 start, u64 size)
> +static int check_cpu_on_node(void *data)
> +{
> + struct pglist_data *pgdat = data;
> + int cpu;
> +
> + for_each_present_cpu(cpu) {
> + if (cpu_to_node(cpu) == pgdat->node_id)
> + /*
> + * the cpu on this node isn't removed, and we can't
> + * offline this node.
> + */
> + return -EBUSY;
> + }
> +
> + return 0;
> +}
> +
> +/* offline the node if all memory sections of this node are removed */
> +static void try_offline_node(int nid)
> +{
> + unsigned long start_pfn = NODE_DATA(nid)->node_start_pfn;
> + unsigned long end_pfn = start_pfn + NODE_DATA(nid)->node_spanned_pages;
> + unsigned long pfn;
> +
> + for (pfn = start_pfn; pfn < end_pfn; pfn += PAGES_PER_SECTION) {
> + unsigned long section_nr = pfn_to_section_nr(pfn);
> +
> + if (!present_section_nr(section_nr))
> + continue;
> +
> + if (pfn_to_nid(pfn) != nid)
> + continue;
> +
> + /*
> + * some memory sections of this node are not removed, and we
> + * can't offline node now.
> + */
> + return;
> + }
> +
> + if (stop_machine(check_cpu_on_node, NODE_DATA(nid), NULL))
> + return;
> +
> + /*
> + * all memory/cpu of this node are removed, we can offline this
> + * node now.
> + */
> + node_set_offline(nid);
> + unregister_one_node(nid);
> +}
> +
> +int __ref remove_memory(int nid, u64 start, u64 size)
> {
> unsigned long start_pfn, end_pfn;
> int ret = 0;
> @@ -1346,6 +1398,8 @@ repeat:
>
> arch_remove_memory(start, size);
>
> + try_offline_node(nid);
> +
> unlock_memory_hotplug();
>
> return 0;
> @@ -1355,7 +1409,7 @@ int offline_pages(unsigned long start_pfn, unsigned long nr_pages)
> {
> return -EINVAL;
> }
> -int remove_memory(u64 start, u64 size)
> +int remove_memory(int nid, u64 start, u64 size)
> {
> return -EINVAL;
> }
>
---
This patch introduces a new function try_offline_node() to
remove sysfs file of node when all memory sections of this
node are removed. If some memory sections of this node are
not removed, this function does nothing.
CC: David Rientjes <rientjes@google.com>
CC: Jiang Liu <liuj97@gmail.com>
CC: Len Brown <len.brown@intel.com>
CC: Christoph Lameter <cl@linux.com>
Cc: Minchan Kim <minchan.kim@gmail.com>
CC: Andrew Morton <akpm@linux-foundation.org>
CC: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
CC: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
---
drivers/acpi/acpi_memhotplug.c | 9 +++++-
include/linux/memory_hotplug.h | 2 -
mm/memory_hotplug.c | 58 +++++++++++++++++++++++++++++++++++++++--
3 files changed, 65 insertions(+), 4 deletions(-)
Index: linux-3.7-rc6/drivers/acpi/acpi_memhotplug.c
===================================================================
--- linux-3.7-rc6.orig/drivers/acpi/acpi_memhotplug.c 2012-11-19 16:16:55.161912688 +0900
+++ linux-3.7-rc6/drivers/acpi/acpi_memhotplug.c 2012-11-19 16:17:05.346912109 +0900
@@ -295,6 +295,9 @@ static int acpi_memory_remove_memory(str
{
int result = 0;
struct acpi_memory_info *info, *n;
+ int node;
+
+ node = acpi_get_node(mem_device->device->handle);
list_for_each_entry_safe(info, n, &mem_device->res_list, list) {
if (info->failed)
@@ -308,7 +311,11 @@ static int acpi_memory_remove_memory(str
*/
return -EBUSY;
- result = remove_memory(info->start_addr, info->length);
+ if (node < 0)
+ node = memory_add_physaddr_to_nid(
+ info->start_addr);
+ result = remove_memory(node, info->start_addr,
+ info->length);
if (result)
return result;
Index: linux-3.7-rc6/include/linux/memory_hotplug.h
===================================================================
--- linux-3.7-rc6.orig/include/linux/memory_hotplug.h 2012-11-19 16:16:55.167912687 +0900
+++ linux-3.7-rc6/include/linux/memory_hotplug.h 2012-11-19 16:17:05.348912109 +0900
@@ -242,7 +242,7 @@ extern int arch_add_memory(int nid, u64
extern int offline_pages(unsigned long start_pfn, unsigned long nr_pages);
extern int offline_memory_block(struct memory_block *mem);
extern bool is_memblock_offlined(struct memory_block *mem);
-extern int remove_memory(u64 start, u64 size);
+extern int remove_memory(int node, u64 start, u64 size);
extern int sparse_add_one_section(struct zone *zone, unsigned long start_pfn,
int nr_pages);
extern void sparse_remove_one_section(struct zone *zone, struct mem_section *ms);
Index: linux-3.7-rc6/mm/memory_hotplug.c
===================================================================
--- linux-3.7-rc6.orig/mm/memory_hotplug.c 2012-11-19 16:16:55.164912687 +0900
+++ linux-3.7-rc6/mm/memory_hotplug.c 2012-11-19 16:17:05.356912108 +0900
@@ -29,6 +29,7 @@
#include <linux/suspend.h>
#include <linux/mm_inline.h>
#include <linux/firmware-map.h>
+#include <linux/stop_machine.h>
#include <asm/tlbflush.h>
@@ -1652,7 +1653,58 @@ static int is_memblock_offlined_cb(struc
return ret;
}
-int __ref remove_memory(u64 start, u64 size)
+static int check_cpu_on_node(void *data)
+{
+ struct pglist_data *pgdat = data;
+ int cpu;
+
+ for_each_present_cpu(cpu) {
+ if (cpu_to_node(cpu) == pgdat->node_id)
+ /*
+ * the cpu on this node isn't removed, and we can't
+ * offline this node.
+ */
+ return -EBUSY;
+ }
+
+ return 0;
+}
+
+/* offline the node if all memory sections of this node are removed */
+static void try_offline_node(int nid)
+{
+ unsigned long start_pfn = NODE_DATA(nid)->node_start_pfn;
+ unsigned long end_pfn = start_pfn + NODE_DATA(nid)->node_spanned_pages;
+ unsigned long pfn;
+
+ for (pfn = start_pfn; pfn < end_pfn; pfn += PAGES_PER_SECTION) {
+ unsigned long section_nr = pfn_to_section_nr(pfn);
+
+ if (!present_section_nr(section_nr))
+ continue;
+
+ if (pfn_to_nid(pfn) != nid)
+ continue;
+
+ /*
+ * some memory sections of this node are not removed, and we
+ * can't offline node now.
+ */
+ return;
+ }
+
+ if (stop_machine(check_cpu_on_node, NODE_DATA(nid), NULL))
+ return;
+
+ /*
+ * all memory/cpu of this node are removed, we can offline this
+ * node now.
+ */
+ node_set_offline(nid);
+ unregister_one_node(nid);
+}
+
+int __ref remove_memory(int nid, u64 start, u64 size)
{
unsigned long start_pfn, end_pfn;
int ret = 0;
@@ -1699,6 +1751,8 @@ repeat:
arch_remove_memory(start, size);
+ try_offline_node(nid);
+
unlock_memory_hotplug();
return 0;
@@ -1708,7 +1762,7 @@ int offline_pages(unsigned long start_pf
{
return -EINVAL;
}
-int remove_memory(u64 start, u64 size)
+int remove_memory(int nid, u64 start, u64 size)
{
return -EINVAL;
}
WARNING: multiple messages have this Message-ID (diff)
From: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
To: Wen Congyang <wency@cn.fujitsu.com>
Cc: x86@kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org,
linuxppc-dev@lists.ozlabs.org, linux-acpi@vger.kernel.org,
linux-s390@vger.kernel.org, linux-sh@vger.kernel.org,
linux-ia64@vger.kernel.org, cmetcalf@tilera.com,
sparclinux@vger.kernel.org, David Rientjes <rientjes@google.com>,
Jiang Liu <liuj97@gmail.com>, Len Brown <len.brown@intel.com>,
benh@kernel.crashing.org, paulus@samba.org,
Christoph Lameter <cl@linux.com>,
Minchan Kim <minchan.kim@gmail.com>,
Andrew Morton <akpm@linux-foundation.org>,
KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
Jianguo Wu <wujianguo@huawei.com>
Subject: Re: [PATCH v3 11/12] memory-hotplug: remove sysfs file of node
Date: Mon, 19 Nov 2012 10:08:55 +0000 [thread overview]
Message-ID: <50AA0537.1000501@jp.fujitsu.com> (raw)
In-Reply-To: <1351763083-7905-12-git-send-email-wency@cn.fujitsu.com>
Hi Wen,
This patch cannot be applied, if I apply latest acpi framework's patch-set:
https://lkml.org/lkml/2012/11/15/21
Because acpi_memory_disable_device() is gone by the patch-set.
I updated the patch and attached it on the mail.
2012/11/01 18:44, Wen Congyang wrote:
> This patch introduces a new function try_offline_node() to
> remove sysfs file of node when all memory sections of this
> node are removed. If some memory sections of this node are
> not removed, this function does nothing.
>
> CC: David Rientjes <rientjes@google.com>
> CC: Jiang Liu <liuj97@gmail.com>
> CC: Len Brown <len.brown@intel.com>
> CC: Christoph Lameter <cl@linux.com>
> Cc: Minchan Kim <minchan.kim@gmail.com>
> CC: Andrew Morton <akpm@linux-foundation.org>
> CC: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
> CC: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
> Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
> ---
> drivers/acpi/acpi_memhotplug.c | 8 +++++-
> include/linux/memory_hotplug.h | 2 +-
> mm/memory_hotplug.c | 58 ++++++++++++++++++++++++++++++++++++++++--
> 3 files changed, 64 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c
> index 24c807f..0780f99 100644
> --- a/drivers/acpi/acpi_memhotplug.c
> +++ b/drivers/acpi/acpi_memhotplug.c
> @@ -310,7 +310,9 @@ static int acpi_memory_disable_device(struct acpi_memory_device *mem_device)
> {
> int result;
> struct acpi_memory_info *info, *n;
> + int node;
>
> + node = acpi_get_node(mem_device->device->handle);
>
> /*
> * Ask the VM to offline this memory range.
> @@ -318,7 +320,11 @@ static int acpi_memory_disable_device(struct acpi_memory_device *mem_device)
> */
> list_for_each_entry_safe(info, n, &mem_device->res_list, list) {
> if (info->enabled) {
> - result = remove_memory(info->start_addr, info->length);
> + if (node < 0)
> + node = memory_add_physaddr_to_nid(
> + info->start_addr);
> + result = remove_memory(node, info->start_addr,
> + info->length);
> if (result)
> return result;
> }
> diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h
> index d4c4402..7b4cfe6 100644
> --- a/include/linux/memory_hotplug.h
> +++ b/include/linux/memory_hotplug.h
> @@ -231,7 +231,7 @@ extern int arch_add_memory(int nid, u64 start, u64 size);
> extern int offline_pages(unsigned long start_pfn, unsigned long nr_pages);
> extern int offline_memory_block(struct memory_block *mem);
> extern bool is_memblock_offlined(struct memory_block *mem);
> -extern int remove_memory(u64 start, u64 size);
> +extern int remove_memory(int node, u64 start, u64 size);
> extern int sparse_add_one_section(struct zone *zone, unsigned long start_pfn,
> int nr_pages);
> extern void sparse_remove_one_section(struct zone *zone, struct mem_section *ms);
> diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
> index 7bcced0..d965da3 100644
> --- a/mm/memory_hotplug.c
> +++ b/mm/memory_hotplug.c
> @@ -29,6 +29,7 @@
> #include <linux/suspend.h>
> #include <linux/mm_inline.h>
> #include <linux/firmware-map.h>
> +#include <linux/stop_machine.h>
>
> #include <asm/tlbflush.h>
>
> @@ -1299,7 +1300,58 @@ static int is_memblock_offlined_cb(struct memory_block *mem, void *arg)
> return ret;
> }
>
> -int __ref remove_memory(u64 start, u64 size)
> +static int check_cpu_on_node(void *data)
> +{
> + struct pglist_data *pgdat = data;
> + int cpu;
> +
> + for_each_present_cpu(cpu) {
> + if (cpu_to_node(cpu) = pgdat->node_id)
> + /*
> + * the cpu on this node isn't removed, and we can't
> + * offline this node.
> + */
> + return -EBUSY;
> + }
> +
> + return 0;
> +}
> +
> +/* offline the node if all memory sections of this node are removed */
> +static void try_offline_node(int nid)
> +{
> + unsigned long start_pfn = NODE_DATA(nid)->node_start_pfn;
> + unsigned long end_pfn = start_pfn + NODE_DATA(nid)->node_spanned_pages;
> + unsigned long pfn;
> +
> + for (pfn = start_pfn; pfn < end_pfn; pfn += PAGES_PER_SECTION) {
> + unsigned long section_nr = pfn_to_section_nr(pfn);
> +
> + if (!present_section_nr(section_nr))
> + continue;
> +
> + if (pfn_to_nid(pfn) != nid)
> + continue;
> +
> + /*
> + * some memory sections of this node are not removed, and we
> + * can't offline node now.
> + */
> + return;
> + }
> +
> + if (stop_machine(check_cpu_on_node, NODE_DATA(nid), NULL))
> + return;
> +
> + /*
> + * all memory/cpu of this node are removed, we can offline this
> + * node now.
> + */
> + node_set_offline(nid);
> + unregister_one_node(nid);
> +}
> +
> +int __ref remove_memory(int nid, u64 start, u64 size)
> {
> unsigned long start_pfn, end_pfn;
> int ret = 0;
> @@ -1346,6 +1398,8 @@ repeat:
>
> arch_remove_memory(start, size);
>
> + try_offline_node(nid);
> +
> unlock_memory_hotplug();
>
> return 0;
> @@ -1355,7 +1409,7 @@ int offline_pages(unsigned long start_pfn, unsigned long nr_pages)
> {
> return -EINVAL;
> }
> -int remove_memory(u64 start, u64 size)
> +int remove_memory(int nid, u64 start, u64 size)
> {
> return -EINVAL;
> }
>
---
This patch introduces a new function try_offline_node() to
remove sysfs file of node when all memory sections of this
node are removed. If some memory sections of this node are
not removed, this function does nothing.
CC: David Rientjes <rientjes@google.com>
CC: Jiang Liu <liuj97@gmail.com>
CC: Len Brown <len.brown@intel.com>
CC: Christoph Lameter <cl@linux.com>
Cc: Minchan Kim <minchan.kim@gmail.com>
CC: Andrew Morton <akpm@linux-foundation.org>
CC: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
CC: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
---
drivers/acpi/acpi_memhotplug.c | 9 +++++-
include/linux/memory_hotplug.h | 2 -
mm/memory_hotplug.c | 58 +++++++++++++++++++++++++++++++++++++++--
3 files changed, 65 insertions(+), 4 deletions(-)
Index: linux-3.7-rc6/drivers/acpi/acpi_memhotplug.c
=================================--- linux-3.7-rc6.orig/drivers/acpi/acpi_memhotplug.c 2012-11-19 16:16:55.161912688 +0900
+++ linux-3.7-rc6/drivers/acpi/acpi_memhotplug.c 2012-11-19 16:17:05.346912109 +0900
@@ -295,6 +295,9 @@ static int acpi_memory_remove_memory(str
{
int result = 0;
struct acpi_memory_info *info, *n;
+ int node;
+
+ node = acpi_get_node(mem_device->device->handle);
list_for_each_entry_safe(info, n, &mem_device->res_list, list) {
if (info->failed)
@@ -308,7 +311,11 @@ static int acpi_memory_remove_memory(str
*/
return -EBUSY;
- result = remove_memory(info->start_addr, info->length);
+ if (node < 0)
+ node = memory_add_physaddr_to_nid(
+ info->start_addr);
+ result = remove_memory(node, info->start_addr,
+ info->length);
if (result)
return result;
Index: linux-3.7-rc6/include/linux/memory_hotplug.h
=================================--- linux-3.7-rc6.orig/include/linux/memory_hotplug.h 2012-11-19 16:16:55.167912687 +0900
+++ linux-3.7-rc6/include/linux/memory_hotplug.h 2012-11-19 16:17:05.348912109 +0900
@@ -242,7 +242,7 @@ extern int arch_add_memory(int nid, u64
extern int offline_pages(unsigned long start_pfn, unsigned long nr_pages);
extern int offline_memory_block(struct memory_block *mem);
extern bool is_memblock_offlined(struct memory_block *mem);
-extern int remove_memory(u64 start, u64 size);
+extern int remove_memory(int node, u64 start, u64 size);
extern int sparse_add_one_section(struct zone *zone, unsigned long start_pfn,
int nr_pages);
extern void sparse_remove_one_section(struct zone *zone, struct mem_section *ms);
Index: linux-3.7-rc6/mm/memory_hotplug.c
=================================--- linux-3.7-rc6.orig/mm/memory_hotplug.c 2012-11-19 16:16:55.164912687 +0900
+++ linux-3.7-rc6/mm/memory_hotplug.c 2012-11-19 16:17:05.356912108 +0900
@@ -29,6 +29,7 @@
#include <linux/suspend.h>
#include <linux/mm_inline.h>
#include <linux/firmware-map.h>
+#include <linux/stop_machine.h>
#include <asm/tlbflush.h>
@@ -1652,7 +1653,58 @@ static int is_memblock_offlined_cb(struc
return ret;
}
-int __ref remove_memory(u64 start, u64 size)
+static int check_cpu_on_node(void *data)
+{
+ struct pglist_data *pgdat = data;
+ int cpu;
+
+ for_each_present_cpu(cpu) {
+ if (cpu_to_node(cpu) = pgdat->node_id)
+ /*
+ * the cpu on this node isn't removed, and we can't
+ * offline this node.
+ */
+ return -EBUSY;
+ }
+
+ return 0;
+}
+
+/* offline the node if all memory sections of this node are removed */
+static void try_offline_node(int nid)
+{
+ unsigned long start_pfn = NODE_DATA(nid)->node_start_pfn;
+ unsigned long end_pfn = start_pfn + NODE_DATA(nid)->node_spanned_pages;
+ unsigned long pfn;
+
+ for (pfn = start_pfn; pfn < end_pfn; pfn += PAGES_PER_SECTION) {
+ unsigned long section_nr = pfn_to_section_nr(pfn);
+
+ if (!present_section_nr(section_nr))
+ continue;
+
+ if (pfn_to_nid(pfn) != nid)
+ continue;
+
+ /*
+ * some memory sections of this node are not removed, and we
+ * can't offline node now.
+ */
+ return;
+ }
+
+ if (stop_machine(check_cpu_on_node, NODE_DATA(nid), NULL))
+ return;
+
+ /*
+ * all memory/cpu of this node are removed, we can offline this
+ * node now.
+ */
+ node_set_offline(nid);
+ unregister_one_node(nid);
+}
+
+int __ref remove_memory(int nid, u64 start, u64 size)
{
unsigned long start_pfn, end_pfn;
int ret = 0;
@@ -1699,6 +1751,8 @@ repeat:
arch_remove_memory(start, size);
+ try_offline_node(nid);
+
unlock_memory_hotplug();
return 0;
@@ -1708,7 +1762,7 @@ int offline_pages(unsigned long start_pf
{
return -EINVAL;
}
-int remove_memory(u64 start, u64 size)
+int remove_memory(int nid, u64 start, u64 size)
{
return -EINVAL;
}
WARNING: multiple messages have this Message-ID (diff)
From: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
To: Wen Congyang <wency@cn.fujitsu.com>
Cc: linux-s390@vger.kernel.org, linux-ia64@vger.kernel.org,
Len Brown <len.brown@intel.com>,
linux-acpi@vger.kernel.org, linux-sh@vger.kernel.org,
x86@kernel.org, linux-kernel@vger.kernel.org,
cmetcalf@tilera.com, Jianguo Wu <wujianguo@huawei.com>,
linux-mm@kvack.org, paulus@samba.org,
Minchan Kim <minchan.kim@gmail.com>,
KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
David Rientjes <rientjes@google.com>,
sparclinux@vger.kernel.org, Christoph Lameter <cl@linux.com>,
linuxppc-dev@lists.ozlabs.org,
Andrew Morton <akpm@linux-foundation.org>,
Jiang Liu <liuj97@gmail.com>
Subject: Re: [PATCH v3 11/12] memory-hotplug: remove sysfs file of node
Date: Mon, 19 Nov 2012 19:08:55 +0900 [thread overview]
Message-ID: <50AA0537.1000501@jp.fujitsu.com> (raw)
In-Reply-To: <1351763083-7905-12-git-send-email-wency@cn.fujitsu.com>
Hi Wen,
This patch cannot be applied, if I apply latest acpi framework's patch-set:
https://lkml.org/lkml/2012/11/15/21
Because acpi_memory_disable_device() is gone by the patch-set.
I updated the patch and attached it on the mail.
2012/11/01 18:44, Wen Congyang wrote:
> This patch introduces a new function try_offline_node() to
> remove sysfs file of node when all memory sections of this
> node are removed. If some memory sections of this node are
> not removed, this function does nothing.
>
> CC: David Rientjes <rientjes@google.com>
> CC: Jiang Liu <liuj97@gmail.com>
> CC: Len Brown <len.brown@intel.com>
> CC: Christoph Lameter <cl@linux.com>
> Cc: Minchan Kim <minchan.kim@gmail.com>
> CC: Andrew Morton <akpm@linux-foundation.org>
> CC: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
> CC: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
> Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
> ---
> drivers/acpi/acpi_memhotplug.c | 8 +++++-
> include/linux/memory_hotplug.h | 2 +-
> mm/memory_hotplug.c | 58 ++++++++++++++++++++++++++++++++++++++++--
> 3 files changed, 64 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c
> index 24c807f..0780f99 100644
> --- a/drivers/acpi/acpi_memhotplug.c
> +++ b/drivers/acpi/acpi_memhotplug.c
> @@ -310,7 +310,9 @@ static int acpi_memory_disable_device(struct acpi_memory_device *mem_device)
> {
> int result;
> struct acpi_memory_info *info, *n;
> + int node;
>
> + node = acpi_get_node(mem_device->device->handle);
>
> /*
> * Ask the VM to offline this memory range.
> @@ -318,7 +320,11 @@ static int acpi_memory_disable_device(struct acpi_memory_device *mem_device)
> */
> list_for_each_entry_safe(info, n, &mem_device->res_list, list) {
> if (info->enabled) {
> - result = remove_memory(info->start_addr, info->length);
> + if (node < 0)
> + node = memory_add_physaddr_to_nid(
> + info->start_addr);
> + result = remove_memory(node, info->start_addr,
> + info->length);
> if (result)
> return result;
> }
> diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h
> index d4c4402..7b4cfe6 100644
> --- a/include/linux/memory_hotplug.h
> +++ b/include/linux/memory_hotplug.h
> @@ -231,7 +231,7 @@ extern int arch_add_memory(int nid, u64 start, u64 size);
> extern int offline_pages(unsigned long start_pfn, unsigned long nr_pages);
> extern int offline_memory_block(struct memory_block *mem);
> extern bool is_memblock_offlined(struct memory_block *mem);
> -extern int remove_memory(u64 start, u64 size);
> +extern int remove_memory(int node, u64 start, u64 size);
> extern int sparse_add_one_section(struct zone *zone, unsigned long start_pfn,
> int nr_pages);
> extern void sparse_remove_one_section(struct zone *zone, struct mem_section *ms);
> diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
> index 7bcced0..d965da3 100644
> --- a/mm/memory_hotplug.c
> +++ b/mm/memory_hotplug.c
> @@ -29,6 +29,7 @@
> #include <linux/suspend.h>
> #include <linux/mm_inline.h>
> #include <linux/firmware-map.h>
> +#include <linux/stop_machine.h>
>
> #include <asm/tlbflush.h>
>
> @@ -1299,7 +1300,58 @@ static int is_memblock_offlined_cb(struct memory_block *mem, void *arg)
> return ret;
> }
>
> -int __ref remove_memory(u64 start, u64 size)
> +static int check_cpu_on_node(void *data)
> +{
> + struct pglist_data *pgdat = data;
> + int cpu;
> +
> + for_each_present_cpu(cpu) {
> + if (cpu_to_node(cpu) == pgdat->node_id)
> + /*
> + * the cpu on this node isn't removed, and we can't
> + * offline this node.
> + */
> + return -EBUSY;
> + }
> +
> + return 0;
> +}
> +
> +/* offline the node if all memory sections of this node are removed */
> +static void try_offline_node(int nid)
> +{
> + unsigned long start_pfn = NODE_DATA(nid)->node_start_pfn;
> + unsigned long end_pfn = start_pfn + NODE_DATA(nid)->node_spanned_pages;
> + unsigned long pfn;
> +
> + for (pfn = start_pfn; pfn < end_pfn; pfn += PAGES_PER_SECTION) {
> + unsigned long section_nr = pfn_to_section_nr(pfn);
> +
> + if (!present_section_nr(section_nr))
> + continue;
> +
> + if (pfn_to_nid(pfn) != nid)
> + continue;
> +
> + /*
> + * some memory sections of this node are not removed, and we
> + * can't offline node now.
> + */
> + return;
> + }
> +
> + if (stop_machine(check_cpu_on_node, NODE_DATA(nid), NULL))
> + return;
> +
> + /*
> + * all memory/cpu of this node are removed, we can offline this
> + * node now.
> + */
> + node_set_offline(nid);
> + unregister_one_node(nid);
> +}
> +
> +int __ref remove_memory(int nid, u64 start, u64 size)
> {
> unsigned long start_pfn, end_pfn;
> int ret = 0;
> @@ -1346,6 +1398,8 @@ repeat:
>
> arch_remove_memory(start, size);
>
> + try_offline_node(nid);
> +
> unlock_memory_hotplug();
>
> return 0;
> @@ -1355,7 +1409,7 @@ int offline_pages(unsigned long start_pfn, unsigned long nr_pages)
> {
> return -EINVAL;
> }
> -int remove_memory(u64 start, u64 size)
> +int remove_memory(int nid, u64 start, u64 size)
> {
> return -EINVAL;
> }
>
---
This patch introduces a new function try_offline_node() to
remove sysfs file of node when all memory sections of this
node are removed. If some memory sections of this node are
not removed, this function does nothing.
CC: David Rientjes <rientjes@google.com>
CC: Jiang Liu <liuj97@gmail.com>
CC: Len Brown <len.brown@intel.com>
CC: Christoph Lameter <cl@linux.com>
Cc: Minchan Kim <minchan.kim@gmail.com>
CC: Andrew Morton <akpm@linux-foundation.org>
CC: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
CC: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
---
drivers/acpi/acpi_memhotplug.c | 9 +++++-
include/linux/memory_hotplug.h | 2 -
mm/memory_hotplug.c | 58 +++++++++++++++++++++++++++++++++++++++--
3 files changed, 65 insertions(+), 4 deletions(-)
Index: linux-3.7-rc6/drivers/acpi/acpi_memhotplug.c
===================================================================
--- linux-3.7-rc6.orig/drivers/acpi/acpi_memhotplug.c 2012-11-19 16:16:55.161912688 +0900
+++ linux-3.7-rc6/drivers/acpi/acpi_memhotplug.c 2012-11-19 16:17:05.346912109 +0900
@@ -295,6 +295,9 @@ static int acpi_memory_remove_memory(str
{
int result = 0;
struct acpi_memory_info *info, *n;
+ int node;
+
+ node = acpi_get_node(mem_device->device->handle);
list_for_each_entry_safe(info, n, &mem_device->res_list, list) {
if (info->failed)
@@ -308,7 +311,11 @@ static int acpi_memory_remove_memory(str
*/
return -EBUSY;
- result = remove_memory(info->start_addr, info->length);
+ if (node < 0)
+ node = memory_add_physaddr_to_nid(
+ info->start_addr);
+ result = remove_memory(node, info->start_addr,
+ info->length);
if (result)
return result;
Index: linux-3.7-rc6/include/linux/memory_hotplug.h
===================================================================
--- linux-3.7-rc6.orig/include/linux/memory_hotplug.h 2012-11-19 16:16:55.167912687 +0900
+++ linux-3.7-rc6/include/linux/memory_hotplug.h 2012-11-19 16:17:05.348912109 +0900
@@ -242,7 +242,7 @@ extern int arch_add_memory(int nid, u64
extern int offline_pages(unsigned long start_pfn, unsigned long nr_pages);
extern int offline_memory_block(struct memory_block *mem);
extern bool is_memblock_offlined(struct memory_block *mem);
-extern int remove_memory(u64 start, u64 size);
+extern int remove_memory(int node, u64 start, u64 size);
extern int sparse_add_one_section(struct zone *zone, unsigned long start_pfn,
int nr_pages);
extern void sparse_remove_one_section(struct zone *zone, struct mem_section *ms);
Index: linux-3.7-rc6/mm/memory_hotplug.c
===================================================================
--- linux-3.7-rc6.orig/mm/memory_hotplug.c 2012-11-19 16:16:55.164912687 +0900
+++ linux-3.7-rc6/mm/memory_hotplug.c 2012-11-19 16:17:05.356912108 +0900
@@ -29,6 +29,7 @@
#include <linux/suspend.h>
#include <linux/mm_inline.h>
#include <linux/firmware-map.h>
+#include <linux/stop_machine.h>
#include <asm/tlbflush.h>
@@ -1652,7 +1653,58 @@ static int is_memblock_offlined_cb(struc
return ret;
}
-int __ref remove_memory(u64 start, u64 size)
+static int check_cpu_on_node(void *data)
+{
+ struct pglist_data *pgdat = data;
+ int cpu;
+
+ for_each_present_cpu(cpu) {
+ if (cpu_to_node(cpu) == pgdat->node_id)
+ /*
+ * the cpu on this node isn't removed, and we can't
+ * offline this node.
+ */
+ return -EBUSY;
+ }
+
+ return 0;
+}
+
+/* offline the node if all memory sections of this node are removed */
+static void try_offline_node(int nid)
+{
+ unsigned long start_pfn = NODE_DATA(nid)->node_start_pfn;
+ unsigned long end_pfn = start_pfn + NODE_DATA(nid)->node_spanned_pages;
+ unsigned long pfn;
+
+ for (pfn = start_pfn; pfn < end_pfn; pfn += PAGES_PER_SECTION) {
+ unsigned long section_nr = pfn_to_section_nr(pfn);
+
+ if (!present_section_nr(section_nr))
+ continue;
+
+ if (pfn_to_nid(pfn) != nid)
+ continue;
+
+ /*
+ * some memory sections of this node are not removed, and we
+ * can't offline node now.
+ */
+ return;
+ }
+
+ if (stop_machine(check_cpu_on_node, NODE_DATA(nid), NULL))
+ return;
+
+ /*
+ * all memory/cpu of this node are removed, we can offline this
+ * node now.
+ */
+ node_set_offline(nid);
+ unregister_one_node(nid);
+}
+
+int __ref remove_memory(int nid, u64 start, u64 size)
{
unsigned long start_pfn, end_pfn;
int ret = 0;
@@ -1699,6 +1751,8 @@ repeat:
arch_remove_memory(start, size);
+ try_offline_node(nid);
+
unlock_memory_hotplug();
return 0;
@@ -1708,7 +1762,7 @@ int offline_pages(unsigned long start_pf
{
return -EINVAL;
}
-int remove_memory(u64 start, u64 size)
+int remove_memory(int nid, u64 start, u64 size)
{
return -EINVAL;
}
WARNING: multiple messages have this Message-ID (diff)
From: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
To: Wen Congyang <wency@cn.fujitsu.com>
Cc: x86@kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org,
linuxppc-dev@lists.ozlabs.org, linux-acpi@vger.kernel.org,
linux-s390@vger.kernel.org, linux-sh@vger.kernel.org,
linux-ia64@vger.kernel.org, cmetcalf@tilera.com,
sparclinux@vger.kernel.org, David Rientjes <rientjes@google.com>,
Jiang Liu <liuj97@gmail.com>, Len Brown <len.brown@intel.com>,
benh@kernel.crashing.org, paulus@samba.org,
Christoph Lameter <cl@linux.com>,
Minchan Kim <minchan.kim@gmail.com>,
Andrew Morton <akpm@linux-foundation.org>,
KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
Jianguo Wu <wujianguo@huawei.com>
Subject: Re: [PATCH v3 11/12] memory-hotplug: remove sysfs file of node
Date: Mon, 19 Nov 2012 19:08:55 +0900 [thread overview]
Message-ID: <50AA0537.1000501@jp.fujitsu.com> (raw)
In-Reply-To: <1351763083-7905-12-git-send-email-wency@cn.fujitsu.com>
Hi Wen,
This patch cannot be applied, if I apply latest acpi framework's patch-set:
https://lkml.org/lkml/2012/11/15/21
Because acpi_memory_disable_device() is gone by the patch-set.
I updated the patch and attached it on the mail.
2012/11/01 18:44, Wen Congyang wrote:
> This patch introduces a new function try_offline_node() to
> remove sysfs file of node when all memory sections of this
> node are removed. If some memory sections of this node are
> not removed, this function does nothing.
>
> CC: David Rientjes <rientjes@google.com>
> CC: Jiang Liu <liuj97@gmail.com>
> CC: Len Brown <len.brown@intel.com>
> CC: Christoph Lameter <cl@linux.com>
> Cc: Minchan Kim <minchan.kim@gmail.com>
> CC: Andrew Morton <akpm@linux-foundation.org>
> CC: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
> CC: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
> Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
> ---
> drivers/acpi/acpi_memhotplug.c | 8 +++++-
> include/linux/memory_hotplug.h | 2 +-
> mm/memory_hotplug.c | 58 ++++++++++++++++++++++++++++++++++++++++--
> 3 files changed, 64 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c
> index 24c807f..0780f99 100644
> --- a/drivers/acpi/acpi_memhotplug.c
> +++ b/drivers/acpi/acpi_memhotplug.c
> @@ -310,7 +310,9 @@ static int acpi_memory_disable_device(struct acpi_memory_device *mem_device)
> {
> int result;
> struct acpi_memory_info *info, *n;
> + int node;
>
> + node = acpi_get_node(mem_device->device->handle);
>
> /*
> * Ask the VM to offline this memory range.
> @@ -318,7 +320,11 @@ static int acpi_memory_disable_device(struct acpi_memory_device *mem_device)
> */
> list_for_each_entry_safe(info, n, &mem_device->res_list, list) {
> if (info->enabled) {
> - result = remove_memory(info->start_addr, info->length);
> + if (node < 0)
> + node = memory_add_physaddr_to_nid(
> + info->start_addr);
> + result = remove_memory(node, info->start_addr,
> + info->length);
> if (result)
> return result;
> }
> diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h
> index d4c4402..7b4cfe6 100644
> --- a/include/linux/memory_hotplug.h
> +++ b/include/linux/memory_hotplug.h
> @@ -231,7 +231,7 @@ extern int arch_add_memory(int nid, u64 start, u64 size);
> extern int offline_pages(unsigned long start_pfn, unsigned long nr_pages);
> extern int offline_memory_block(struct memory_block *mem);
> extern bool is_memblock_offlined(struct memory_block *mem);
> -extern int remove_memory(u64 start, u64 size);
> +extern int remove_memory(int node, u64 start, u64 size);
> extern int sparse_add_one_section(struct zone *zone, unsigned long start_pfn,
> int nr_pages);
> extern void sparse_remove_one_section(struct zone *zone, struct mem_section *ms);
> diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
> index 7bcced0..d965da3 100644
> --- a/mm/memory_hotplug.c
> +++ b/mm/memory_hotplug.c
> @@ -29,6 +29,7 @@
> #include <linux/suspend.h>
> #include <linux/mm_inline.h>
> #include <linux/firmware-map.h>
> +#include <linux/stop_machine.h>
>
> #include <asm/tlbflush.h>
>
> @@ -1299,7 +1300,58 @@ static int is_memblock_offlined_cb(struct memory_block *mem, void *arg)
> return ret;
> }
>
> -int __ref remove_memory(u64 start, u64 size)
> +static int check_cpu_on_node(void *data)
> +{
> + struct pglist_data *pgdat = data;
> + int cpu;
> +
> + for_each_present_cpu(cpu) {
> + if (cpu_to_node(cpu) == pgdat->node_id)
> + /*
> + * the cpu on this node isn't removed, and we can't
> + * offline this node.
> + */
> + return -EBUSY;
> + }
> +
> + return 0;
> +}
> +
> +/* offline the node if all memory sections of this node are removed */
> +static void try_offline_node(int nid)
> +{
> + unsigned long start_pfn = NODE_DATA(nid)->node_start_pfn;
> + unsigned long end_pfn = start_pfn + NODE_DATA(nid)->node_spanned_pages;
> + unsigned long pfn;
> +
> + for (pfn = start_pfn; pfn < end_pfn; pfn += PAGES_PER_SECTION) {
> + unsigned long section_nr = pfn_to_section_nr(pfn);
> +
> + if (!present_section_nr(section_nr))
> + continue;
> +
> + if (pfn_to_nid(pfn) != nid)
> + continue;
> +
> + /*
> + * some memory sections of this node are not removed, and we
> + * can't offline node now.
> + */
> + return;
> + }
> +
> + if (stop_machine(check_cpu_on_node, NODE_DATA(nid), NULL))
> + return;
> +
> + /*
> + * all memory/cpu of this node are removed, we can offline this
> + * node now.
> + */
> + node_set_offline(nid);
> + unregister_one_node(nid);
> +}
> +
> +int __ref remove_memory(int nid, u64 start, u64 size)
> {
> unsigned long start_pfn, end_pfn;
> int ret = 0;
> @@ -1346,6 +1398,8 @@ repeat:
>
> arch_remove_memory(start, size);
>
> + try_offline_node(nid);
> +
> unlock_memory_hotplug();
>
> return 0;
> @@ -1355,7 +1409,7 @@ int offline_pages(unsigned long start_pfn, unsigned long nr_pages)
> {
> return -EINVAL;
> }
> -int remove_memory(u64 start, u64 size)
> +int remove_memory(int nid, u64 start, u64 size)
> {
> return -EINVAL;
> }
>
---
This patch introduces a new function try_offline_node() to
remove sysfs file of node when all memory sections of this
node are removed. If some memory sections of this node are
not removed, this function does nothing.
CC: David Rientjes <rientjes@google.com>
CC: Jiang Liu <liuj97@gmail.com>
CC: Len Brown <len.brown@intel.com>
CC: Christoph Lameter <cl@linux.com>
Cc: Minchan Kim <minchan.kim@gmail.com>
CC: Andrew Morton <akpm@linux-foundation.org>
CC: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
CC: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
---
drivers/acpi/acpi_memhotplug.c | 9 +++++-
include/linux/memory_hotplug.h | 2 -
mm/memory_hotplug.c | 58 +++++++++++++++++++++++++++++++++++++++--
3 files changed, 65 insertions(+), 4 deletions(-)
Index: linux-3.7-rc6/drivers/acpi/acpi_memhotplug.c
===================================================================
--- linux-3.7-rc6.orig/drivers/acpi/acpi_memhotplug.c 2012-11-19 16:16:55.161912688 +0900
+++ linux-3.7-rc6/drivers/acpi/acpi_memhotplug.c 2012-11-19 16:17:05.346912109 +0900
@@ -295,6 +295,9 @@ static int acpi_memory_remove_memory(str
{
int result = 0;
struct acpi_memory_info *info, *n;
+ int node;
+
+ node = acpi_get_node(mem_device->device->handle);
list_for_each_entry_safe(info, n, &mem_device->res_list, list) {
if (info->failed)
@@ -308,7 +311,11 @@ static int acpi_memory_remove_memory(str
*/
return -EBUSY;
- result = remove_memory(info->start_addr, info->length);
+ if (node < 0)
+ node = memory_add_physaddr_to_nid(
+ info->start_addr);
+ result = remove_memory(node, info->start_addr,
+ info->length);
if (result)
return result;
Index: linux-3.7-rc6/include/linux/memory_hotplug.h
===================================================================
--- linux-3.7-rc6.orig/include/linux/memory_hotplug.h 2012-11-19 16:16:55.167912687 +0900
+++ linux-3.7-rc6/include/linux/memory_hotplug.h 2012-11-19 16:17:05.348912109 +0900
@@ -242,7 +242,7 @@ extern int arch_add_memory(int nid, u64
extern int offline_pages(unsigned long start_pfn, unsigned long nr_pages);
extern int offline_memory_block(struct memory_block *mem);
extern bool is_memblock_offlined(struct memory_block *mem);
-extern int remove_memory(u64 start, u64 size);
+extern int remove_memory(int node, u64 start, u64 size);
extern int sparse_add_one_section(struct zone *zone, unsigned long start_pfn,
int nr_pages);
extern void sparse_remove_one_section(struct zone *zone, struct mem_section *ms);
Index: linux-3.7-rc6/mm/memory_hotplug.c
===================================================================
--- linux-3.7-rc6.orig/mm/memory_hotplug.c 2012-11-19 16:16:55.164912687 +0900
+++ linux-3.7-rc6/mm/memory_hotplug.c 2012-11-19 16:17:05.356912108 +0900
@@ -29,6 +29,7 @@
#include <linux/suspend.h>
#include <linux/mm_inline.h>
#include <linux/firmware-map.h>
+#include <linux/stop_machine.h>
#include <asm/tlbflush.h>
@@ -1652,7 +1653,58 @@ static int is_memblock_offlined_cb(struc
return ret;
}
-int __ref remove_memory(u64 start, u64 size)
+static int check_cpu_on_node(void *data)
+{
+ struct pglist_data *pgdat = data;
+ int cpu;
+
+ for_each_present_cpu(cpu) {
+ if (cpu_to_node(cpu) == pgdat->node_id)
+ /*
+ * the cpu on this node isn't removed, and we can't
+ * offline this node.
+ */
+ return -EBUSY;
+ }
+
+ return 0;
+}
+
+/* offline the node if all memory sections of this node are removed */
+static void try_offline_node(int nid)
+{
+ unsigned long start_pfn = NODE_DATA(nid)->node_start_pfn;
+ unsigned long end_pfn = start_pfn + NODE_DATA(nid)->node_spanned_pages;
+ unsigned long pfn;
+
+ for (pfn = start_pfn; pfn < end_pfn; pfn += PAGES_PER_SECTION) {
+ unsigned long section_nr = pfn_to_section_nr(pfn);
+
+ if (!present_section_nr(section_nr))
+ continue;
+
+ if (pfn_to_nid(pfn) != nid)
+ continue;
+
+ /*
+ * some memory sections of this node are not removed, and we
+ * can't offline node now.
+ */
+ return;
+ }
+
+ if (stop_machine(check_cpu_on_node, NODE_DATA(nid), NULL))
+ return;
+
+ /*
+ * all memory/cpu of this node are removed, we can offline this
+ * node now.
+ */
+ node_set_offline(nid);
+ unregister_one_node(nid);
+}
+
+int __ref remove_memory(int nid, u64 start, u64 size)
{
unsigned long start_pfn, end_pfn;
int ret = 0;
@@ -1699,6 +1751,8 @@ repeat:
arch_remove_memory(start, size);
+ try_offline_node(nid);
+
unlock_memory_hotplug();
return 0;
@@ -1708,7 +1762,7 @@ int offline_pages(unsigned long start_pf
{
return -EINVAL;
}
-int remove_memory(u64 start, u64 size)
+int remove_memory(int nid, u64 start, u64 size)
{
return -EINVAL;
}
--
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/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
WARNING: multiple messages have this Message-ID (diff)
From: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
To: Wen Congyang <wency@cn.fujitsu.com>
Cc: <x86@kernel.org>, <linux-mm@kvack.org>,
<linux-kernel@vger.kernel.org>, <linuxppc-dev@lists.ozlabs.org>,
<linux-acpi@vger.kernel.org>, <linux-s390@vger.kernel.org>,
<linux-sh@vger.kernel.org>, <linux-ia64@vger.kernel.org>,
<cmetcalf@tilera.com>, <sparclinux@vger.kernel.org>,
David Rientjes <rientjes@google.com>,
Jiang Liu <liuj97@gmail.com>, Len Brown <len.brown@intel.com>,
<benh@kernel.crashing.org>, <paulus@samba.org>,
Christoph Lameter <cl@linux.com>,
Minchan Kim <minchan.kim@gmail.com>,
Andrew Morton <akpm@linux-foundation.org>,
KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
Jianguo Wu <wujianguo@huawei.com>
Subject: Re: [PATCH v3 11/12] memory-hotplug: remove sysfs file of node
Date: Mon, 19 Nov 2012 19:08:55 +0900 [thread overview]
Message-ID: <50AA0537.1000501@jp.fujitsu.com> (raw)
In-Reply-To: <1351763083-7905-12-git-send-email-wency@cn.fujitsu.com>
Hi Wen,
This patch cannot be applied, if I apply latest acpi framework's patch-set:
https://lkml.org/lkml/2012/11/15/21
Because acpi_memory_disable_device() is gone by the patch-set.
I updated the patch and attached it on the mail.
2012/11/01 18:44, Wen Congyang wrote:
> This patch introduces a new function try_offline_node() to
> remove sysfs file of node when all memory sections of this
> node are removed. If some memory sections of this node are
> not removed, this function does nothing.
>
> CC: David Rientjes <rientjes@google.com>
> CC: Jiang Liu <liuj97@gmail.com>
> CC: Len Brown <len.brown@intel.com>
> CC: Christoph Lameter <cl@linux.com>
> Cc: Minchan Kim <minchan.kim@gmail.com>
> CC: Andrew Morton <akpm@linux-foundation.org>
> CC: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
> CC: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
> Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
> ---
> drivers/acpi/acpi_memhotplug.c | 8 +++++-
> include/linux/memory_hotplug.h | 2 +-
> mm/memory_hotplug.c | 58 ++++++++++++++++++++++++++++++++++++++++--
> 3 files changed, 64 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c
> index 24c807f..0780f99 100644
> --- a/drivers/acpi/acpi_memhotplug.c
> +++ b/drivers/acpi/acpi_memhotplug.c
> @@ -310,7 +310,9 @@ static int acpi_memory_disable_device(struct acpi_memory_device *mem_device)
> {
> int result;
> struct acpi_memory_info *info, *n;
> + int node;
>
> + node = acpi_get_node(mem_device->device->handle);
>
> /*
> * Ask the VM to offline this memory range.
> @@ -318,7 +320,11 @@ static int acpi_memory_disable_device(struct acpi_memory_device *mem_device)
> */
> list_for_each_entry_safe(info, n, &mem_device->res_list, list) {
> if (info->enabled) {
> - result = remove_memory(info->start_addr, info->length);
> + if (node < 0)
> + node = memory_add_physaddr_to_nid(
> + info->start_addr);
> + result = remove_memory(node, info->start_addr,
> + info->length);
> if (result)
> return result;
> }
> diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h
> index d4c4402..7b4cfe6 100644
> --- a/include/linux/memory_hotplug.h
> +++ b/include/linux/memory_hotplug.h
> @@ -231,7 +231,7 @@ extern int arch_add_memory(int nid, u64 start, u64 size);
> extern int offline_pages(unsigned long start_pfn, unsigned long nr_pages);
> extern int offline_memory_block(struct memory_block *mem);
> extern bool is_memblock_offlined(struct memory_block *mem);
> -extern int remove_memory(u64 start, u64 size);
> +extern int remove_memory(int node, u64 start, u64 size);
> extern int sparse_add_one_section(struct zone *zone, unsigned long start_pfn,
> int nr_pages);
> extern void sparse_remove_one_section(struct zone *zone, struct mem_section *ms);
> diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
> index 7bcced0..d965da3 100644
> --- a/mm/memory_hotplug.c
> +++ b/mm/memory_hotplug.c
> @@ -29,6 +29,7 @@
> #include <linux/suspend.h>
> #include <linux/mm_inline.h>
> #include <linux/firmware-map.h>
> +#include <linux/stop_machine.h>
>
> #include <asm/tlbflush.h>
>
> @@ -1299,7 +1300,58 @@ static int is_memblock_offlined_cb(struct memory_block *mem, void *arg)
> return ret;
> }
>
> -int __ref remove_memory(u64 start, u64 size)
> +static int check_cpu_on_node(void *data)
> +{
> + struct pglist_data *pgdat = data;
> + int cpu;
> +
> + for_each_present_cpu(cpu) {
> + if (cpu_to_node(cpu) == pgdat->node_id)
> + /*
> + * the cpu on this node isn't removed, and we can't
> + * offline this node.
> + */
> + return -EBUSY;
> + }
> +
> + return 0;
> +}
> +
> +/* offline the node if all memory sections of this node are removed */
> +static void try_offline_node(int nid)
> +{
> + unsigned long start_pfn = NODE_DATA(nid)->node_start_pfn;
> + unsigned long end_pfn = start_pfn + NODE_DATA(nid)->node_spanned_pages;
> + unsigned long pfn;
> +
> + for (pfn = start_pfn; pfn < end_pfn; pfn += PAGES_PER_SECTION) {
> + unsigned long section_nr = pfn_to_section_nr(pfn);
> +
> + if (!present_section_nr(section_nr))
> + continue;
> +
> + if (pfn_to_nid(pfn) != nid)
> + continue;
> +
> + /*
> + * some memory sections of this node are not removed, and we
> + * can't offline node now.
> + */
> + return;
> + }
> +
> + if (stop_machine(check_cpu_on_node, NODE_DATA(nid), NULL))
> + return;
> +
> + /*
> + * all memory/cpu of this node are removed, we can offline this
> + * node now.
> + */
> + node_set_offline(nid);
> + unregister_one_node(nid);
> +}
> +
> +int __ref remove_memory(int nid, u64 start, u64 size)
> {
> unsigned long start_pfn, end_pfn;
> int ret = 0;
> @@ -1346,6 +1398,8 @@ repeat:
>
> arch_remove_memory(start, size);
>
> + try_offline_node(nid);
> +
> unlock_memory_hotplug();
>
> return 0;
> @@ -1355,7 +1409,7 @@ int offline_pages(unsigned long start_pfn, unsigned long nr_pages)
> {
> return -EINVAL;
> }
> -int remove_memory(u64 start, u64 size)
> +int remove_memory(int nid, u64 start, u64 size)
> {
> return -EINVAL;
> }
>
---
This patch introduces a new function try_offline_node() to
remove sysfs file of node when all memory sections of this
node are removed. If some memory sections of this node are
not removed, this function does nothing.
CC: David Rientjes <rientjes@google.com>
CC: Jiang Liu <liuj97@gmail.com>
CC: Len Brown <len.brown@intel.com>
CC: Christoph Lameter <cl@linux.com>
Cc: Minchan Kim <minchan.kim@gmail.com>
CC: Andrew Morton <akpm@linux-foundation.org>
CC: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
CC: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
---
drivers/acpi/acpi_memhotplug.c | 9 +++++-
include/linux/memory_hotplug.h | 2 -
mm/memory_hotplug.c | 58 +++++++++++++++++++++++++++++++++++++++--
3 files changed, 65 insertions(+), 4 deletions(-)
Index: linux-3.7-rc6/drivers/acpi/acpi_memhotplug.c
===================================================================
--- linux-3.7-rc6.orig/drivers/acpi/acpi_memhotplug.c 2012-11-19 16:16:55.161912688 +0900
+++ linux-3.7-rc6/drivers/acpi/acpi_memhotplug.c 2012-11-19 16:17:05.346912109 +0900
@@ -295,6 +295,9 @@ static int acpi_memory_remove_memory(str
{
int result = 0;
struct acpi_memory_info *info, *n;
+ int node;
+
+ node = acpi_get_node(mem_device->device->handle);
list_for_each_entry_safe(info, n, &mem_device->res_list, list) {
if (info->failed)
@@ -308,7 +311,11 @@ static int acpi_memory_remove_memory(str
*/
return -EBUSY;
- result = remove_memory(info->start_addr, info->length);
+ if (node < 0)
+ node = memory_add_physaddr_to_nid(
+ info->start_addr);
+ result = remove_memory(node, info->start_addr,
+ info->length);
if (result)
return result;
Index: linux-3.7-rc6/include/linux/memory_hotplug.h
===================================================================
--- linux-3.7-rc6.orig/include/linux/memory_hotplug.h 2012-11-19 16:16:55.167912687 +0900
+++ linux-3.7-rc6/include/linux/memory_hotplug.h 2012-11-19 16:17:05.348912109 +0900
@@ -242,7 +242,7 @@ extern int arch_add_memory(int nid, u64
extern int offline_pages(unsigned long start_pfn, unsigned long nr_pages);
extern int offline_memory_block(struct memory_block *mem);
extern bool is_memblock_offlined(struct memory_block *mem);
-extern int remove_memory(u64 start, u64 size);
+extern int remove_memory(int node, u64 start, u64 size);
extern int sparse_add_one_section(struct zone *zone, unsigned long start_pfn,
int nr_pages);
extern void sparse_remove_one_section(struct zone *zone, struct mem_section *ms);
Index: linux-3.7-rc6/mm/memory_hotplug.c
===================================================================
--- linux-3.7-rc6.orig/mm/memory_hotplug.c 2012-11-19 16:16:55.164912687 +0900
+++ linux-3.7-rc6/mm/memory_hotplug.c 2012-11-19 16:17:05.356912108 +0900
@@ -29,6 +29,7 @@
#include <linux/suspend.h>
#include <linux/mm_inline.h>
#include <linux/firmware-map.h>
+#include <linux/stop_machine.h>
#include <asm/tlbflush.h>
@@ -1652,7 +1653,58 @@ static int is_memblock_offlined_cb(struc
return ret;
}
-int __ref remove_memory(u64 start, u64 size)
+static int check_cpu_on_node(void *data)
+{
+ struct pglist_data *pgdat = data;
+ int cpu;
+
+ for_each_present_cpu(cpu) {
+ if (cpu_to_node(cpu) == pgdat->node_id)
+ /*
+ * the cpu on this node isn't removed, and we can't
+ * offline this node.
+ */
+ return -EBUSY;
+ }
+
+ return 0;
+}
+
+/* offline the node if all memory sections of this node are removed */
+static void try_offline_node(int nid)
+{
+ unsigned long start_pfn = NODE_DATA(nid)->node_start_pfn;
+ unsigned long end_pfn = start_pfn + NODE_DATA(nid)->node_spanned_pages;
+ unsigned long pfn;
+
+ for (pfn = start_pfn; pfn < end_pfn; pfn += PAGES_PER_SECTION) {
+ unsigned long section_nr = pfn_to_section_nr(pfn);
+
+ if (!present_section_nr(section_nr))
+ continue;
+
+ if (pfn_to_nid(pfn) != nid)
+ continue;
+
+ /*
+ * some memory sections of this node are not removed, and we
+ * can't offline node now.
+ */
+ return;
+ }
+
+ if (stop_machine(check_cpu_on_node, NODE_DATA(nid), NULL))
+ return;
+
+ /*
+ * all memory/cpu of this node are removed, we can offline this
+ * node now.
+ */
+ node_set_offline(nid);
+ unregister_one_node(nid);
+}
+
+int __ref remove_memory(int nid, u64 start, u64 size)
{
unsigned long start_pfn, end_pfn;
int ret = 0;
@@ -1699,6 +1751,8 @@ repeat:
arch_remove_memory(start, size);
+ try_offline_node(nid);
+
unlock_memory_hotplug();
return 0;
@@ -1708,7 +1762,7 @@ int offline_pages(unsigned long start_pf
{
return -EINVAL;
}
-int remove_memory(u64 start, u64 size)
+int remove_memory(int nid, u64 start, u64 size)
{
return -EINVAL;
}
next prev parent reply other threads:[~2012-11-19 10:08 UTC|newest]
Thread overview: 146+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-01 9:44 [PATCH v3 00/12] memory-hotplug: hot-remove physical memory Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` [PATCH v3 01/12] memory-hotplug: try to offline the memory twice to avoid dependence Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` [PATCH v3 02/12] memory-hotplug: check whether all memory blocks are offlined or not when removing memory Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` [PATCH v3 02/12] memory-hotplug: check whether all memory blocks are offlined or not when removing m Wen Congyang
2012-11-01 9:44 ` [PATCH v3 03/12] memory-hotplug: remove redundant codes Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` [PATCH v3 04/12] memory-hotplug: remove /sys/firmware/memmap/X sysfs Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` [PATCH v3 05/12] memory-hotplug: introduce new function arch_remove_memory() for removing page table depends on architecture Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` [PATCH v3 05/12] memory-hotplug: introduce new function arch_remove_memory() for removing page table Wen Congyang
2012-11-01 9:44 ` [PATCH v3 06/12] memory-hotplug: unregister memory section on SPARSEMEM_VMEMMAP Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-20 6:22 ` Jaegeuk Hanse
2012-11-20 6:22 ` Jaegeuk Hanse
2012-11-20 6:22 ` Jaegeuk Hanse
2012-11-20 6:22 ` Jaegeuk Hanse
2012-11-20 6:22 ` Jaegeuk Hanse
2012-11-20 6:55 ` Wen Congyang
2012-11-20 6:55 ` Wen Congyang
2012-11-20 6:55 ` Wen Congyang
2012-11-20 6:55 ` Wen Congyang
2012-11-20 6:58 ` Jaegeuk Hanse
2012-11-20 6:58 ` Jaegeuk Hanse
2012-11-20 6:58 ` Jaegeuk Hanse
2012-11-20 6:58 ` Jaegeuk Hanse
2012-11-20 9:37 ` Wen Congyang
2012-11-20 9:37 ` Wen Congyang
2012-11-20 9:37 ` Wen Congyang
2012-11-20 9:37 ` Wen Congyang
2012-11-20 11:03 ` Jaegeuk Hanse
2012-11-20 11:03 ` Jaegeuk Hanse
2012-11-20 11:03 ` Jaegeuk Hanse
2012-11-20 11:03 ` Jaegeuk Hanse
2012-11-20 11:16 ` Jaegeuk Hanse
2012-11-20 11:16 ` Jaegeuk Hanse
2012-11-20 11:16 ` Jaegeuk Hanse
2012-11-20 11:16 ` Jaegeuk Hanse
2012-11-20 11:16 ` Jaegeuk Hanse
2012-11-21 2:59 ` Wen Congyang
2012-11-21 3:05 ` Wen Congyang
2012-11-21 3:05 ` Wen Congyang
2012-11-21 3:05 ` Wen Congyang
2012-11-21 2:59 ` Wen Congyang
2012-11-21 2:59 ` Wen Congyang
2012-11-21 4:22 ` Jaegeuk Hanse
2012-11-21 4:22 ` Jaegeuk Hanse
2012-11-21 4:22 ` Jaegeuk Hanse
2012-11-21 4:22 ` Jaegeuk Hanse
2012-11-21 4:42 ` Wen Congyang
2012-11-21 4:42 ` Wen Congyang
2012-11-21 4:42 ` Wen Congyang
2012-11-21 4:42 ` Wen Congyang
2012-11-21 5:03 ` Jaegeuk Hanse
2012-11-21 5:03 ` Jaegeuk Hanse
2012-11-21 5:03 ` Jaegeuk Hanse
2012-11-21 5:03 ` Jaegeuk Hanse
2012-11-21 5:12 ` Wen Congyang
2012-11-21 5:12 ` Wen Congyang
2012-11-21 5:12 ` Wen Congyang
2012-11-21 5:12 ` Wen Congyang
2012-11-21 5:28 ` Wen Congyang
2012-11-21 5:28 ` Wen Congyang
2012-11-21 5:28 ` Wen Congyang
2012-11-21 5:28 ` Wen Congyang
2012-11-01 9:44 ` [PATCH v3 07/12] memory-hotplug: implement register_page_bootmem_info_section of sparse-vmemmap Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` [PATCH v3 08/12] memory-hotplug: remove memmap " Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-27 5:47 ` Jianguo Wu
2012-11-27 5:47 ` Jianguo Wu
2012-11-27 5:47 ` Jianguo Wu
2012-11-27 5:47 ` Jianguo Wu
2012-11-27 6:39 ` Wen Congyang
2012-11-27 6:39 ` Wen Congyang
2012-11-27 6:39 ` Wen Congyang
2012-11-27 6:39 ` Wen Congyang
2012-11-27 6:49 ` Wen Congyang
2012-11-27 6:49 ` Wen Congyang
2012-11-27 6:49 ` Wen Congyang
2012-11-27 6:49 ` Wen Congyang
2012-11-27 7:14 ` Jianguo Wu
2012-11-27 7:14 ` Jianguo Wu
2012-11-27 7:14 ` Jianguo Wu
2012-11-27 7:14 ` Jianguo Wu
2012-11-27 7:14 ` Jianguo Wu
2012-11-01 9:44 ` [PATCH v3 09/12] memory-hotplug: remove page table of x86_64 architecture Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` [PATCH v3 10/12] memory-hotplug: memory_hotplug: clear zone when removing the memory Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` [PATCH v3 11/12] memory-hotplug: remove sysfs file of node Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-19 10:08 ` Yasuaki Ishimatsu [this message]
2012-11-19 10:08 ` Yasuaki Ishimatsu
2012-11-19 10:08 ` Yasuaki Ishimatsu
2012-11-19 10:08 ` Yasuaki Ishimatsu
2012-11-19 10:08 ` Yasuaki Ishimatsu
2012-11-20 9:35 ` Wen Congyang
2012-11-20 9:35 ` Wen Congyang
2012-11-20 9:35 ` Wen Congyang
2012-11-20 9:35 ` Wen Congyang
2012-11-26 14:27 ` Jianguo Wu
2012-11-26 14:27 ` Jianguo Wu
2012-11-26 14:27 ` Jianguo Wu
2012-11-26 14:27 ` Jianguo Wu
2012-11-27 2:24 ` Wen Congyang
2012-11-27 2:24 ` Wen Congyang
2012-11-27 2:24 ` Wen Congyang
2012-11-27 2:24 ` Wen Congyang
2012-11-01 9:44 ` [PATCH v3 12/12] memory-hotplug: free node_data when a node is offlined Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-01 9:44 ` Wen Congyang
2012-11-16 11:55 ` [PATCH v3 00/12] memory-hotplug: hot-remove physical memory Wen Congyang
2012-11-16 11:55 ` Wen Congyang
2012-11-16 11:55 ` Wen Congyang
2012-11-16 11:55 ` Wen Congyang
2012-11-22 1:33 ` Yasuaki Ishimatsu
2012-11-22 1:33 ` Yasuaki Ishimatsu
2012-11-22 1:33 ` Yasuaki Ishimatsu
2012-11-22 1:33 ` Yasuaki Ishimatsu
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=50AA0537.1000501@jp.fujitsu.com \
--to=isimatu.yasuaki@jp.fujitsu.com \
--cc=akpm@linux-foundation.org \
--cc=benh@kernel.crashing.org \
--cc=cl@linux.com \
--cc=cmetcalf@tilera.com \
--cc=kosaki.motohiro@jp.fujitsu.com \
--cc=len.brown@intel.com \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-ia64@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-s390@vger.kernel.org \
--cc=linux-sh@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=liuj97@gmail.com \
--cc=minchan.kim@gmail.com \
--cc=paulus@samba.org \
--cc=rientjes@google.com \
--cc=sparclinux@vger.kernel.org \
--cc=wency@cn.fujitsu.com \
--cc=wujianguo@huawei.com \
--cc=x86@kernel.org \
/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.