From: Tang Chen <tangchen@cn.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>,
Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>,
Jianguo Wu <wujianguo@huawei.com>
Subject: Re: [Patch v4 11/12] memory-hotplug: remove sysfs file of node
Date: Tue, 04 Dec 2012 18:10:02 +0800 [thread overview]
Message-ID: <50BDCBFA.6000900@cn.fujitsu.com> (raw)
In-Reply-To: <1354010422-19648-12-git-send-email-wency@cn.fujitsu.com>
On 11/27/2012 06:00 PM, 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>
Reviewed-by: Tang Chen <tangchen@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 aa97d56..449663e 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>
>
> @@ -1288,7 +1289,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;
> @@ -1335,6 +1387,8 @@ repeat:
>
> arch_remove_memory(start, size);
>
> + try_offline_node(nid);
> +
> unlock_memory_hotplug();
>
> return 0;
> @@ -1344,7 +1398,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;
> }
--
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: Tang Chen <tangchen@cn.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>,
Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>,
Jianguo Wu <wujianguo@huawei.com>
Subject: Re: [Patch v4 11/12] memory-hotplug: remove sysfs file of node
Date: Tue, 04 Dec 2012 10:10:02 +0000 [thread overview]
Message-ID: <50BDCBFA.6000900@cn.fujitsu.com> (raw)
In-Reply-To: <1354010422-19648-12-git-send-email-wency@cn.fujitsu.com>
On 11/27/2012 06:00 PM, 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>
Reviewed-by: Tang Chen <tangchen@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 aa97d56..449663e 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>
>
> @@ -1288,7 +1289,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;
> @@ -1335,6 +1387,8 @@ repeat:
>
> arch_remove_memory(start, size);
>
> + try_offline_node(nid);
> +
> unlock_memory_hotplug();
>
> return 0;
> @@ -1344,7 +1398,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;
> }
WARNING: multiple messages have this Message-ID (diff)
From: Tang Chen <tangchen@cn.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,
Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>,
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 v4 11/12] memory-hotplug: remove sysfs file of node
Date: Tue, 04 Dec 2012 18:10:02 +0800 [thread overview]
Message-ID: <50BDCBFA.6000900@cn.fujitsu.com> (raw)
In-Reply-To: <1354010422-19648-12-git-send-email-wency@cn.fujitsu.com>
On 11/27/2012 06:00 PM, 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>
Reviewed-by: Tang Chen <tangchen@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 aa97d56..449663e 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>
>
> @@ -1288,7 +1289,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;
> @@ -1335,6 +1387,8 @@ repeat:
>
> arch_remove_memory(start, size);
>
> + try_offline_node(nid);
> +
> unlock_memory_hotplug();
>
> return 0;
> @@ -1344,7 +1398,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;
> }
WARNING: multiple messages have this Message-ID (diff)
From: Tang Chen <tangchen@cn.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>,
Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>,
Jianguo Wu <wujianguo@huawei.com>
Subject: Re: [Patch v4 11/12] memory-hotplug: remove sysfs file of node
Date: Tue, 04 Dec 2012 18:10:02 +0800 [thread overview]
Message-ID: <50BDCBFA.6000900@cn.fujitsu.com> (raw)
In-Reply-To: <1354010422-19648-12-git-send-email-wency@cn.fujitsu.com>
On 11/27/2012 06:00 PM, 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>
Reviewed-by: Tang Chen <tangchen@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 aa97d56..449663e 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>
>
> @@ -1288,7 +1289,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;
> @@ -1335,6 +1387,8 @@ repeat:
>
> arch_remove_memory(start, size);
>
> + try_offline_node(nid);
> +
> unlock_memory_hotplug();
>
> return 0;
> @@ -1344,7 +1398,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;
> }
next prev parent reply other threads:[~2012-12-04 10:10 UTC|newest]
Thread overview: 176+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-27 10:00 [Patch v4 00/12] memory-hotplug: hot-remove physical memory Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 9:58 ` [Patch v4 01/12] memory-hotplug: try to offline the memory twice to avoid dependence Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-12-04 9:17 ` Tang Chen
2012-12-04 9:17 ` Tang Chen
2012-12-04 9:17 ` Tang Chen
2012-12-04 9:17 ` Tang Chen
2012-11-27 9:58 ` [Patch v4 05/12] memory-hotplug: introduce new function arch_remove_memory() for removing page table Wen Congyang
2012-11-27 10:00 ` [Patch v4 05/12] memory-hotplug: introduce new function arch_remove_memory() for removing page table depends on architecture Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` [Patch v4 05/12] memory-hotplug: introduce new function arch_remove_memory() for removing page table Wen Congyang
2012-11-27 10:00 ` [Patch v4 05/12] memory-hotplug: introduce new function arch_remove_memory() for removing page table depends on architecture Wen Congyang
2012-11-27 9:59 ` [Patch v4 05/12] memory-hotplug: introduce new function arch_remove_memory() for removing page table Wen Congyang
2012-12-04 9:30 ` [Patch v4 05/12] memory-hotplug: introduce new function arch_remove_memory() for removing page table depends on architecture Tang Chen
2012-12-04 9:30 ` Tang Chen
2012-12-04 9:30 ` Tang Chen
2012-12-04 9:30 ` [Patch v4 05/12] memory-hotplug: introduce new function arch_remove_memory() for removing page t Tang Chen
2012-11-27 9:59 ` [Patch v4 12/12] memory-hotplug: free node_data when a node is offlined Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 9:59 ` Wen Congyang
2012-11-27 9:59 ` Wen Congyang
2012-12-04 10:10 ` Tang Chen
2012-12-04 10:10 ` Tang Chen
2012-12-04 10:10 ` Tang Chen
2012-12-04 10:10 ` Tang Chen
2012-11-27 9:59 ` [Patch v4 08/12] memory-hotplug: remove memmap of sparse-vmemmap Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-28 9:40 ` Jianguo Wu
2012-11-28 9:40 ` Jianguo Wu
2012-11-28 9:40 ` Jianguo Wu
2012-11-28 9:40 ` Jianguo Wu
2012-11-28 9:40 ` Jianguo Wu
2012-11-30 1:45 ` Wen Congyang
2012-11-30 1:45 ` Wen Congyang
2012-11-30 1:45 ` Wen Congyang
2012-11-30 1:45 ` Wen Congyang
2012-11-30 2:47 ` Jianguo Wu
2012-11-30 2:47 ` Jianguo Wu
2012-11-30 2:47 ` Jianguo Wu
2012-11-30 2:47 ` Jianguo Wu
2012-11-30 2:55 ` Yasuaki Ishimatsu
2012-11-30 2:55 ` Yasuaki Ishimatsu
2012-11-30 2:55 ` Yasuaki Ishimatsu
2012-11-30 2:55 ` Yasuaki Ishimatsu
2012-11-30 2:55 ` Yasuaki Ishimatsu
2012-12-03 2:23 ` Jianguo Wu
2012-12-03 2:23 ` Jianguo Wu
2012-12-03 2:23 ` Jianguo Wu
2012-12-03 2:23 ` Jianguo Wu
2012-12-03 2:23 ` Jianguo Wu
2012-12-04 9:13 ` Tang Chen
2012-12-04 9:13 ` Tang Chen
2012-12-04 9:13 ` Tang Chen
2012-12-04 9:13 ` Tang Chen
2012-12-04 12:20 ` Jianguo Wu
2012-12-04 12:20 ` Jianguo Wu
2012-12-04 12:20 ` Jianguo Wu
2012-12-04 12:20 ` Jianguo Wu
2012-12-04 12:20 ` Jianguo Wu
2012-12-05 2:07 ` Tang Chen
2012-12-05 2:07 ` Tang Chen
2012-12-05 2:07 ` Tang Chen
2012-12-05 2:07 ` Tang Chen
2012-12-05 3:23 ` Jianguo Wu
2012-12-05 3:23 ` Jianguo Wu
2012-12-05 3:23 ` Jianguo Wu
2012-12-05 3:23 ` Jianguo Wu
2012-12-05 3:23 ` Jianguo Wu
2012-12-07 1:42 ` Tang Chen
2012-12-07 1:42 ` Tang Chen
2012-12-07 1:42 ` Tang Chen
2012-12-07 1:42 ` Tang Chen
2012-12-07 2:20 ` Jianguo Wu
2012-12-07 2:20 ` Jianguo Wu
2012-12-07 2:20 ` Jianguo Wu
2012-12-07 2:20 ` Jianguo Wu
2012-12-07 2:20 ` Jianguo Wu
2012-12-04 9:47 ` Tang Chen
2012-12-04 9:47 ` Tang Chen
2012-12-04 9:47 ` Tang Chen
2012-12-04 9:47 ` Tang Chen
2012-11-27 9:59 ` [Patch v4 09/12] memory-hotplug: remove page table of x86_64 architecture Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 9:59 ` Wen Congyang
2012-12-07 6:43 ` Tang Chen
2012-12-07 6:43 ` Tang Chen
2012-12-07 6:43 ` Tang Chen
2012-12-07 6:43 ` Tang Chen
2012-12-07 7:06 ` Jianguo Wu
2012-12-07 7:06 ` Jianguo Wu
2012-12-07 7:06 ` Jianguo Wu
2012-12-07 7:06 ` Jianguo Wu
2012-12-07 7:06 ` Jianguo Wu
2012-11-27 10:00 ` [Patch v4 02/12] memory-hotplug: check whether all memory blocks are offlined or not when removing memory Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` [Patch v4 02/12] memory-hotplug: check whether all memory blocks are offlined or not when removing m Wen Congyang
2012-12-04 9:22 ` [Patch v4 02/12] memory-hotplug: check whether all memory blocks are offlined or not when removing memory Tang Chen
2012-12-04 9:22 ` Tang Chen
2012-12-04 9:22 ` Tang Chen
2012-12-04 9:22 ` [Patch v4 02/12] memory-hotplug: check whether all memory blocks are offlined or not when removi Tang Chen
2012-11-27 10:00 ` [Patch v4 03/12] memory-hotplug: remove redundant codes Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-12-04 9:22 ` Tang Chen
2012-12-04 9:22 ` Tang Chen
2012-12-04 9:22 ` Tang Chen
2012-12-04 9:22 ` Tang Chen
2012-12-04 10:31 ` Tang Chen
2012-12-04 10:31 ` Tang Chen
2012-12-04 10:31 ` Tang Chen
2012-12-04 10:31 ` Tang Chen
2012-11-27 10:00 ` [Patch v4 04/12] memory-hotplug: remove /sys/firmware/memmap/X sysfs Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` [Patch v4 06/12] memory-hotplug: unregister memory section on SPARSEMEM_VMEMMAP Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-12-04 9:34 ` Tang Chen
2012-12-04 9:34 ` Tang Chen
2012-12-04 9:34 ` Tang Chen
2012-12-04 9:34 ` Tang Chen
2012-11-27 10:00 ` [Patch v4 07/12] memory-hotplug: implement register_page_bootmem_info_section of sparse-vmemmap Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` [Patch v4 10/12] memory-hotplug: memory_hotplug: clear zone when removing the memory Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-12-04 10:09 ` Tang Chen
2012-12-04 10:09 ` Tang Chen
2012-12-04 10:09 ` Tang Chen
2012-12-04 10:09 ` Tang Chen
2012-11-27 10:00 ` [Patch v4 11/12] memory-hotplug: remove sysfs file of node Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-11-27 10:00 ` Wen Congyang
2012-12-04 10:10 ` Tang Chen [this message]
2012-12-04 10:10 ` Tang Chen
2012-12-04 10:10 ` Tang Chen
2012-12-04 10:10 ` Tang Chen
2012-11-27 19:27 ` [Patch v4 00/12] memory-hotplug: hot-remove physical memory Andrew Morton
2012-11-27 19:27 ` Andrew Morton
2012-11-27 19:27 ` Andrew Morton
2012-11-27 19:27 ` Andrew Morton
2012-11-27 19:38 ` Rafael J. Wysocki
2012-11-27 19:38 ` Rafael J. Wysocki
2012-11-27 19:38 ` Rafael J. Wysocki
2012-11-27 19:38 ` Rafael J. Wysocki
2012-11-28 0:43 ` Yasuaki Ishimatsu
2012-11-28 0:43 ` Yasuaki Ishimatsu
2012-11-28 0:43 ` Yasuaki Ishimatsu
2012-11-28 0:43 ` Yasuaki Ishimatsu
2012-11-28 0:43 ` Yasuaki Ishimatsu
2012-11-30 6:37 ` Tang Chen
2012-11-30 6:37 ` Tang Chen
2012-11-30 6:37 ` Tang Chen
2012-11-30 6:37 ` Tang Chen
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=50BDCBFA.6000900@cn.fujitsu.com \
--to=tangchen@cn.fujitsu.com \
--cc=akpm@linux-foundation.org \
--cc=benh@kernel.crashing.org \
--cc=cl@linux.com \
--cc=cmetcalf@tilera.com \
--cc=isimatu.yasuaki@jp.fujitsu.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.