From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751884AbbJJJeY (ORCPT ); Sat, 10 Oct 2015 05:34:24 -0400 Received: from mail113-248.mail.alibaba.com ([205.204.113.248]:58011 "EHLO us-alimail-mta1.hst.scl.en.alidc.net" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751804AbbJJJeK (ORCPT ); Sat, 10 Oct 2015 05:34:10 -0400 X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R101e4;FP=0|-1|-1|-1|0|-1|-1|-1;HT=e02c03305;MF=hillf.zj@alibaba-inc.com;NM=1;PH=DS;RN=8;SR=0; Reply-To: "Hillf Danton" From: "Hillf Danton" To: "'Changsheng Liu'" Cc: "Andrew Morton" , , , , , "linux-kernel" , Subject: Re: [PATCH V6] mm: memory hot-add: memory can not be added to movable zone defaultly Date: Sat, 10 Oct 2015 17:27:45 +0800 Message-ID: <078801d1033d$ec65fbd0$c531f370$@alibaba-inc.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-Index: AdEDPW24TTwabeZ6SVKXpAp8nt2hIA== Content-Language: zh-cn Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org > > From: Changsheng Liu > > After the user config CONFIG_MOVABLE_NODE, > When the memory is hot added, should_add_memory_movable() return 0 > because all zones including movable zone are empty, > so the memory that was hot added will be added to the normal zone > and the normal zone will be created firstly. > But we want the whole node to be added to movable zone defaultly. > > So we change should_add_memory_movable(): if the user config > CONFIG_MOVABLE_NODE and sysctl parameter hotadd_memory_as_movable and > the ZONE_NORMAL is empty or the pfn of the hot-added memory > is after the end of the ZONE_NORMAL it will always return 1 > and all zones is empty at the same time, > so that the movable zone will be created firstly > and then the whole node will be added to movable zone defaultly. > If we want the node to be added to normal zone, > we can do it as follows: > "echo online_kernel > /sys/devices/system/memory/memoryXXX/state" > > Signed-off-by: Changsheng Liu > Signed-off-by: Xiaofeng Yan > Tested-by: Dongdong Fan > Cc: Wang Nan > Cc: Zhang Yanfei > Cc: Dave Hansen > Cc: Yinghai Lu > Cc: Tang Chen > Cc: Hu Tao > Cc: Lai Jiangshan > Cc: Yasuaki Ishimatsu > Cc: Gu Zheng > Cc: Toshi Kani > Cc: Xishi Qiu > Signed-off-by: Andrew Morton Hm... by AKPM, Advanced kernel Programming Master, really? > --- > Documentation/memory-hotplug.txt | 5 ++++- > kernel/sysctl.c | 15 +++++++++++++++ > mm/memory_hotplug.c | 23 +++++++++++++++++++++++ > 3 files changed, 42 insertions(+), 1 deletions(-) > > diff --git a/Documentation/memory-hotplug.txt b/Documentation/memory-hotplug.txt > index ce2cfcf..7e6b4f4 100644 > --- a/Documentation/memory-hotplug.txt > +++ b/Documentation/memory-hotplug.txt > @@ -277,7 +277,7 @@ And if the memory block is in ZONE_MOVABLE, you can change it to ZONE_NORMAL: > After this, memory block XXX's state will be 'online' and the amount of > available memory will be increased. > > -Currently, newly added memory is added as ZONE_NORMAL (for powerpc, ZONE_DMA). > +Currently, newly added memory is added as ZONE_NORMAL or ZONE_MOVABLE (for powerpc, ZONE_DMA). > This may be changed in future. > > > @@ -319,6 +319,9 @@ creates ZONE_MOVABLE as following. > Size of memory not for movable pages (not for offline) is TOTAL - ZZZZ. > Size of memory for movable pages (for offline) is ZZZZ. > > +And a sysctl parameter for assigning the hot added memory to ZONE_MOVABLE is > +supported. If the value of "kernel/hotadd_memory_as_movable" is 1,the hot added > +memory will be assigned to ZONE_MOVABLE defautly. > > Note: Unfortunately, there is no information to show which memory block belongs > to ZONE_MOVABLE. This is TBD. > diff --git a/kernel/sysctl.c b/kernel/sysctl.c > index 19b62b5..855c48e 100644 > --- a/kernel/sysctl.c > +++ b/kernel/sysctl.c > @@ -166,6 +166,10 @@ extern int unaligned_dump_stack; > extern int no_unaligned_warning; > #endif > > +#ifdef CONFIG_MOVABLE_NODE > +extern int hotadd_memory_as_movable; > +#endif > + > #ifdef CONFIG_PROC_SYSCTL > > #define SYSCTL_WRITES_LEGACY -1 > @@ -1139,6 +1143,17 @@ static struct ctl_table kern_table[] = { > .proc_handler = timer_migration_handler, > }, > #endif > +/*If the value of "kernel/hotadd_memory_as_movable" is 1,the hot added > + * memory will be assigned to ZONE_MOVABLE defautly.*/ > +#ifdef CONFIG_MOVABLE_NODE > + { > + .procname = "hotadd_memory_as_movable", > + .data = &hotadd_memory_as_movable, > + .maxlen = sizeof(int), > + .mode = 0644, > + .proc_handler = proc_dointvec, > + }, > +#endif > { } > }; > > diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c > index 26fbba7..5bcaf74 100644 > --- a/mm/memory_hotplug.c > +++ b/mm/memory_hotplug.c > @@ -37,6 +37,10 @@ > > #include "internal.h" > > +/*If the global variable value is 1, > + * the hot added memory will be assigned to ZONE_MOVABLE defautly*/ > +int hotadd_memory_as_movable; > + > /* > * online_page_callback contains pointer to current page onlining function. > * Initially it is generic_online_page(). If it is required it could be > @@ -1190,6 +1194,9 @@ static int check_hotplug_memory_range(u64 start, u64 size) > /* > * If movable zone has already been setup, newly added memory should be check. > * If its address is higher than movable zone, it should be added as movable. > + * And if system config CONFIG_MOVABLE_NODE and set the sysctl parameter > + * "hotadd_memory_as_movable" and added memory does not overlap the zone > + * before MOVABLE_ZONE,the memory is added as movable. > * Without this check, movable zone may overlap with other zone. > */ > static int should_add_memory_movable(int nid, u64 start, u64 size) > @@ -1197,6 +1204,22 @@ static int should_add_memory_movable(int nid, u64 start, u64 size) > unsigned long start_pfn = start >> PAGE_SHIFT; > pg_data_t *pgdat = NODE_DATA(nid); > struct zone *movable_zone = pgdat->node_zones + ZONE_MOVABLE; > + struct zone *pre_zone = pgdat->node_zones + (ZONE_MOVABLE - 1); > + /* > + * The system configs CONFIG_MOVABLE_NODE to assign a node > + * which has only movable memory,so the hot-added memory should > + * be assigned to ZONE_MOVABLE defaultly, > + * but the function zone_for_memory() assign the hot-added memory > + * to ZONE_NORMAL(x86_64) defaultly.Kernel does not allow to > + * create ZONE_MOVABLE before ZONE_NORMAL,so If the value of > + * sysctl parameter "hotadd_memory_as_movable" is 1 > + * and the ZONE_NORMAL is empty or the pfn of the hot-added memory > + * is after the end of the ZONE_NORMAL > + * the hot-added memory will be assigned to ZONE_MOVABLE. > + */ > + if (hotadd_memory_as_movable > + && (zone_is_empty(pre_zone) || zone_end_pfn(pre_zone) <= start_pfn)) > + return 1; > > if (zone_is_empty(movable_zone)) > return 0; > -- > 1.7.1