linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* Re: [PATCH V6] mm: memory hot-add: memory can not be added to movable zone defaultly
@ 2015-10-10  9:27 Hillf Danton
  2015-10-10 10:39 ` Changsheng Liu
  0 siblings, 1 reply; 8+ messages in thread
From: Hillf Danton @ 2015-10-10  9:27 UTC (permalink / raw)
  To: 'Changsheng Liu'
  Cc: Andrew Morton, isimatu.yasuaki, vbabka, yasu.isimatu, tangchen,
	linux-kernel, linux-mm

> 
> From: Changsheng Liu <liuchangcheng@inspur.com>
> 
> 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 <liuchangsheng@inspur.com>
> Signed-off-by: Xiaofeng Yan <yanxiaofeng@inspur.com>
> Tested-by: Dongdong Fan <fandd@inspur.com>
> Cc: Wang Nan <wangnan0@huawei.com>
> Cc: Zhang Yanfei <zhangyanfei@cn.fujitsu.com>
> Cc: Dave Hansen <dave.hansen@intel.com>
> Cc: Yinghai Lu <yinghai@kernel.org>
> Cc: Tang Chen <tangchen@cn.fujitsu.com>
> Cc: Hu Tao <hutao@cn.fujitsu.com>
> Cc: Lai Jiangshan <laijs@cn.fujitsu.com>
> Cc: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
> Cc: Gu Zheng <guz.fnst@cn.fujitsu.com>
> Cc: Toshi Kani <toshi.kani@hp.com>
> Cc: Xishi Qiu <qiuxishi@huawei.com>
> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

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

--
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>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH V6] mm: memory hot-add: memory can not be added to movable zone defaultly
  2015-10-10  9:27 [PATCH V6] mm: memory hot-add: memory can not be added to movable zone defaultly Hillf Danton
@ 2015-10-10 10:39 ` Changsheng Liu
  0 siblings, 0 replies; 8+ messages in thread
From: Changsheng Liu @ 2015-10-10 10:39 UTC (permalink / raw)
  To: Hillf Danton
  Cc: Andrew Morton, isimatu.yasuaki, vbabka, yasu.isimatu, tangchen,
	linux-kernel, linux-mm

[-- Attachment #1: Type: text/plain, Size: 6546 bytes --]



a?? 2015/10/10 17:27, Hillf Danton a??e??:
>> From: Changsheng Liu <liuchangcheng@inspur.com>
>>
>> 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 <liuchangsheng@inspur.com>
>> Signed-off-by: Xiaofeng Yan <yanxiaofeng@inspur.com>
>> Tested-by: Dongdong Fan <fandd@inspur.com>
>> Cc: Wang Nan <wangnan0@huawei.com>
>> Cc: Zhang Yanfei <zhangyanfei@cn.fujitsu.com>
>> Cc: Dave Hansen <dave.hansen@intel.com>
>> Cc: Yinghai Lu <yinghai@kernel.org>
>> Cc: Tang Chen <tangchen@cn.fujitsu.com>
>> Cc: Hu Tao <hutao@cn.fujitsu.com>
>> Cc: Lai Jiangshan <laijs@cn.fujitsu.com>
>> Cc: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
>> Cc: Gu Zheng <guz.fnst@cn.fujitsu.com>
>> Cc: Toshi Kani <toshi.kani@hp.com>
>> Cc: Xishi Qiu <qiuxishi@huawei.com>
>> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
> Hm...  by AKPM, Advanced kernel Programming Master, really?
    Sorry about my negligence,I will update the patch.Thanks for 
reminding me.
>> ---
>>   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
> .
>


[-- Attachment #2: Type: text/html, Size: 9276 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH V6] mm: memory hot-add: memory can not be added to movable zone defaultly
  2015-10-12  1:45     ` Tang Chen
@ 2015-10-12  6:04       ` Changsheng Liu
  0 siblings, 0 replies; 8+ messages in thread
From: Changsheng Liu @ 2015-10-12  6:04 UTC (permalink / raw)
  To: Tang Chen, Yasuaki Ishimatsu
  Cc: akpm, isimatu.yasuaki, vbabka, linux-mm, linux-kernel, wangnan0,
	dave.hansen, yinghai, toshi.kani, qiuxishi, wunan, yanxiaofeng,
	fandd, Changsheng Liu



a?? 2015/10/12 9:45, Tang Chen a??e??:
> Hi Ishimatsu,
>
> On 10/10/2015 02:13 AM, Yasuaki Ishimatsu wrote:
>> Hi Tang,
>>
>> On Fri, 9 Oct 2015 15:59:38 +0800
>> Tang Chen <tangchen@cn.fujitsu.com> wrote:
>>
>>> Hi,
>>>
>>> I don't mean to offend, but I really think it is not necessary to do 
>>> this.
>>>
>>> hot-added memory will be added to ZONE_NORMAL by default. You can
>>> modify it when you online memory. I think it is enough for users.
>> But we cannot automatically create movable memory even if we use udev 
>> rules.
>> Thus user must create original scrip to online memory as movable.
>>
>> Do you think every user understand the rule that ZONE_NORMAL must be 
>> on the
>> left side of ZONE_MOVABLE?
>
> I think memory hotplug users should understand this.
>
>>
>> If we can change the behavir of kernel by sysctl, user can create
>> movable memory by only the following udev rule.
>>
>> SUBSYSTEM=="memory", ACTION=="add", ATTR{state}=="offline", 
>> ATTR{state}="online"
>
> OK, that is fine. And I think it is better to add this to the commit 
> message.
     Thanks, I will update the patch.
>
> Thanks.
>
>>
>> Thanks,
>> Yasuaki Ishimatsu
>>
>>> And a sysctl interface is also unnecessary. I think one default 
>>> behaviour
>>> is enough for kernel. We'd better keep it in the current way, or 
>>> change it
>>> and document it. It just makes no sense to enable users to modify it.
>>> Can you please share any use case of this sysctl interface ?
>>>
>>> I suggest just keep the current implement. But I'm OK with that if 
>>> other
>>> reviewers or users could clarify it is useful. :)
>>>
>>> And BTW, please don't cc the following reviewers. Their email addresses
>>> have changed.
>>>
>>> Cc: Zhang Yanfei<zhangyanfei@cn.fujitsu.com>
>>> Cc: Hu Tao<hutao@cn.fujitsu.com>
>>> Cc: Lai Jiangshan<laijs@cn.fujitsu.com>
>>> Cc: Gu Zheng<guz.fnst@cn.fujitsu.com>
>>>
>>>
>>> Thanks. :)
>>>
>>> On 10/09/2015 03:12 PM, Changsheng Liu wrote:
>>>> From: Changsheng Liu <liuchangcheng@inspur.com>
>>>>
>>>> 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 <liuchangsheng@inspur.com>
>>>> Signed-off-by: Xiaofeng Yan <yanxiaofeng@inspur.com>
>>>> Tested-by: Dongdong Fan <fandd@inspur.com>
>>>> Cc: Wang Nan <wangnan0@huawei.com>
>>>> Cc: Zhang Yanfei <zhangyanfei@cn.fujitsu.com>
>>>> Cc: Dave Hansen <dave.hansen@intel.com>
>>>> Cc: Yinghai Lu <yinghai@kernel.org>
>>>> Cc: Tang Chen <tangchen@cn.fujitsu.com>
>>>> Cc: Hu Tao <hutao@cn.fujitsu.com>
>>>> Cc: Lai Jiangshan <laijs@cn.fujitsu.com>
>>>> Cc: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
>>>> Cc: Gu Zheng <guz.fnst@cn.fujitsu.com>
>>>> Cc: Toshi Kani <toshi.kani@hp.com>
>>>> Cc: Xishi Qiu <qiuxishi@huawei.com>
>>>> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
>>>> ---
>>>>    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;
>>> -- 
>>> 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>
>> .
>>
>
> .
>

--
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>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH V6] mm: memory hot-add: memory can not be added to movable zone defaultly
  2015-10-09 18:13   ` Yasuaki Ishimatsu
@ 2015-10-12  1:45     ` Tang Chen
  2015-10-12  6:04       ` Changsheng Liu
  0 siblings, 1 reply; 8+ messages in thread
From: Tang Chen @ 2015-10-12  1:45 UTC (permalink / raw)
  To: Yasuaki Ishimatsu
  Cc: Changsheng Liu, akpm, isimatu.yasuaki, vbabka, linux-mm,
	linux-kernel, wangnan0, dave.hansen, yinghai, toshi.kani,
	qiuxishi, wunan, yanxiaofeng, fandd, Changsheng Liu, tangchen

Hi Ishimatsu,

On 10/10/2015 02:13 AM, Yasuaki Ishimatsu wrote:
> Hi Tang,
>
> On Fri, 9 Oct 2015 15:59:38 +0800
> Tang Chen <tangchen@cn.fujitsu.com> wrote:
>
>> Hi,
>>
>> I don't mean to offend, but I really think it is not necessary to do this.
>>
>> hot-added memory will be added to ZONE_NORMAL by default. You can
>> modify it when you online memory. I think it is enough for users.
> But we cannot automatically create movable memory even if we use udev rules.
> Thus user must create original scrip to online memory as movable.
>
> Do you think every user understand the rule that ZONE_NORMAL must be on the
> left side of ZONE_MOVABLE?

I think memory hotplug users should understand this.

>
> If we can change the behavir of kernel by sysctl, user can create
> movable memory by only the following udev rule.
>
> SUBSYSTEM=="memory", ACTION=="add", ATTR{state}=="offline", ATTR{state}="online"

OK, that is fine. And I think it is better to add this to the commit 
message.

Thanks.

>
> Thanks,
> Yasuaki Ishimatsu
>
>> And a sysctl interface is also unnecessary. I think one default behaviour
>> is enough for kernel. We'd better keep it in the current way, or change it
>> and document it. It just makes no sense to enable users to modify it.
>> Can you please share any use case of this sysctl interface ?
>>
>> I suggest just keep the current implement. But I'm OK with that if other
>> reviewers or users could clarify it is useful. :)
>>
>> And BTW, please don't cc the following reviewers. Their email addresses
>> have changed.
>>
>> Cc: Zhang Yanfei<zhangyanfei@cn.fujitsu.com>
>> Cc: Hu Tao<hutao@cn.fujitsu.com>
>> Cc: Lai Jiangshan<laijs@cn.fujitsu.com>
>> Cc: Gu Zheng<guz.fnst@cn.fujitsu.com>
>>
>>
>> Thanks. :)
>>
>> On 10/09/2015 03:12 PM, Changsheng Liu wrote:
>>> From: Changsheng Liu <liuchangcheng@inspur.com>
>>>
>>> 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 <liuchangsheng@inspur.com>
>>> Signed-off-by: Xiaofeng Yan <yanxiaofeng@inspur.com>
>>> Tested-by: Dongdong Fan <fandd@inspur.com>
>>> Cc: Wang Nan <wangnan0@huawei.com>
>>> Cc: Zhang Yanfei <zhangyanfei@cn.fujitsu.com>
>>> Cc: Dave Hansen <dave.hansen@intel.com>
>>> Cc: Yinghai Lu <yinghai@kernel.org>
>>> Cc: Tang Chen <tangchen@cn.fujitsu.com>
>>> Cc: Hu Tao <hutao@cn.fujitsu.com>
>>> Cc: Lai Jiangshan <laijs@cn.fujitsu.com>
>>> Cc: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
>>> Cc: Gu Zheng <guz.fnst@cn.fujitsu.com>
>>> Cc: Toshi Kani <toshi.kani@hp.com>
>>> Cc: Xishi Qiu <qiuxishi@huawei.com>
>>> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
>>> ---
>>>    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;
>> --
>> 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>
> .
>

--
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>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH V6] mm: memory hot-add: memory can not be added to movable zone defaultly
  2015-10-09  7:12 Changsheng Liu
  2015-10-09  7:59 ` Tang Chen
@ 2015-10-09 19:06 ` kbuild test robot
  1 sibling, 0 replies; 8+ messages in thread
From: kbuild test robot @ 2015-10-09 19:06 UTC (permalink / raw)
  To: Changsheng Liu
  Cc: kbuild-all, akpm, isimatu.yasuaki, vbabka, yasu.isimatu,
	tangchen, linux-mm, linux-kernel, wangnan0, zhangyanfei,
	dave.hansen, yinghai, hutao, laijs, guz.fnst, toshi.kani,
	qiuxishi, wunan, yanxiaofeng, fandd, Changsheng Liu

[-- Attachment #1: Type: text/plain, Size: 539 bytes --]

Hi Changsheng,

[auto build test ERROR on v4.3-rc4 -- if it's inappropriate base, please ignore]

config: x86_64-randconfig-s1-10100137 (attached as .config)
reproduce:
        # save the attached .config to linux build tree
        make ARCH=x86_64 

All errors (new ones prefixed by >>):

>> kernel/built-in.o:(.data+0x21e8): undefined reference to `hotadd_memory_as_movable'

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/octet-stream, Size: 21834 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH V6] mm: memory hot-add: memory can not be added to movable zone defaultly
  2015-10-09  7:59 ` Tang Chen
@ 2015-10-09 18:13   ` Yasuaki Ishimatsu
  2015-10-12  1:45     ` Tang Chen
  0 siblings, 1 reply; 8+ messages in thread
From: Yasuaki Ishimatsu @ 2015-10-09 18:13 UTC (permalink / raw)
  To: Tang Chen
  Cc: Changsheng Liu, akpm, isimatu.yasuaki, vbabka, linux-mm,
	linux-kernel, wangnan0, dave.hansen, yinghai, toshi.kani,
	qiuxishi, wunan, yanxiaofeng, fandd, Changsheng Liu

Hi Tang,

On Fri, 9 Oct 2015 15:59:38 +0800
Tang Chen <tangchen@cn.fujitsu.com> wrote:

> Hi,
> 
> I don't mean to offend, but I really think it is not necessary to do this.
> 

> hot-added memory will be added to ZONE_NORMAL by default. You can
> modify it when you online memory. I think it is enough for users.

But we cannot automatically create movable memory even if we use udev rules.
Thus user must create original scrip to online memory as movable.

Do you think every user understand the rule that ZONE_NORMAL must be on the
left side of ZONE_MOVABLE?

If we can change the behavir of kernel by sysctl, user can create
movable memory by only the following udev rule.

SUBSYSTEM=="memory", ACTION=="add", ATTR{state}=="offline", ATTR{state}="online"

Thanks,
Yasuaki Ishimatsu

> 
> And a sysctl interface is also unnecessary. I think one default behaviour
> is enough for kernel. We'd better keep it in the current way, or change it
> and document it. It just makes no sense to enable users to modify it.
> Can you please share any use case of this sysctl interface ?
> 
> I suggest just keep the current implement. But I'm OK with that if other
> reviewers or users could clarify it is useful. :)
> 
> And BTW, please don't cc the following reviewers. Their email addresses
> have changed.
> 
> Cc: Zhang Yanfei<zhangyanfei@cn.fujitsu.com>
> Cc: Hu Tao<hutao@cn.fujitsu.com>
> Cc: Lai Jiangshan<laijs@cn.fujitsu.com>
> Cc: Gu Zheng<guz.fnst@cn.fujitsu.com>
> 
> 
> Thanks. :)
> 
> On 10/09/2015 03:12 PM, Changsheng Liu wrote:
> > From: Changsheng Liu <liuchangcheng@inspur.com>
> >
> > 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 <liuchangsheng@inspur.com>
> > Signed-off-by: Xiaofeng Yan <yanxiaofeng@inspur.com>
> > Tested-by: Dongdong Fan <fandd@inspur.com>
> > Cc: Wang Nan <wangnan0@huawei.com>
> > Cc: Zhang Yanfei <zhangyanfei@cn.fujitsu.com>
> > Cc: Dave Hansen <dave.hansen@intel.com>
> > Cc: Yinghai Lu <yinghai@kernel.org>
> > Cc: Tang Chen <tangchen@cn.fujitsu.com>
> > Cc: Hu Tao <hutao@cn.fujitsu.com>
> > Cc: Lai Jiangshan <laijs@cn.fujitsu.com>
> > Cc: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
> > Cc: Gu Zheng <guz.fnst@cn.fujitsu.com>
> > Cc: Toshi Kani <toshi.kani@hp.com>
> > Cc: Xishi Qiu <qiuxishi@huawei.com>
> > Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
> > ---
> >   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;
> 
> --
> 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>

--
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>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH V6] mm: memory hot-add: memory can not be added to movable zone defaultly
  2015-10-09  7:12 Changsheng Liu
@ 2015-10-09  7:59 ` Tang Chen
  2015-10-09 18:13   ` Yasuaki Ishimatsu
  2015-10-09 19:06 ` kbuild test robot
  1 sibling, 1 reply; 8+ messages in thread
From: Tang Chen @ 2015-10-09  7:59 UTC (permalink / raw)
  To: Changsheng Liu, akpm, isimatu.yasuaki, vbabka, yasu.isimatu
  Cc: linux-mm, linux-kernel, wangnan0, tangchen, dave.hansen, yinghai,
	toshi.kani, qiuxishi, wunan, yanxiaofeng, fandd, Changsheng Liu

Hi,

I don't mean to offend, but I really think it is not necessary to do this.

hot-added memory will be added to ZONE_NORMAL by default. You can
modify it when you online memory. I think it is enough for users.

And a sysctl interface is also unnecessary. I think one default behaviour
is enough for kernel. We'd better keep it in the current way, or change it
and document it. It just makes no sense to enable users to modify it.
Can you please share any use case of this sysctl interface ?

I suggest just keep the current implement. But I'm OK with that if other
reviewers or users could clarify it is useful. :)

And BTW, please don't cc the following reviewers. Their email addresses
have changed.

Cc: Zhang Yanfei<zhangyanfei@cn.fujitsu.com>
Cc: Hu Tao<hutao@cn.fujitsu.com>
Cc: Lai Jiangshan<laijs@cn.fujitsu.com>
Cc: Gu Zheng<guz.fnst@cn.fujitsu.com>


Thanks. :)

On 10/09/2015 03:12 PM, Changsheng Liu wrote:
> From: Changsheng Liu <liuchangcheng@inspur.com>
>
> 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 <liuchangsheng@inspur.com>
> Signed-off-by: Xiaofeng Yan <yanxiaofeng@inspur.com>
> Tested-by: Dongdong Fan <fandd@inspur.com>
> Cc: Wang Nan <wangnan0@huawei.com>
> Cc: Zhang Yanfei <zhangyanfei@cn.fujitsu.com>
> Cc: Dave Hansen <dave.hansen@intel.com>
> Cc: Yinghai Lu <yinghai@kernel.org>
> Cc: Tang Chen <tangchen@cn.fujitsu.com>
> Cc: Hu Tao <hutao@cn.fujitsu.com>
> Cc: Lai Jiangshan <laijs@cn.fujitsu.com>
> Cc: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
> Cc: Gu Zheng <guz.fnst@cn.fujitsu.com>
> Cc: Toshi Kani <toshi.kani@hp.com>
> Cc: Xishi Qiu <qiuxishi@huawei.com>
> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
> ---
>   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;

--
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>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH V6] mm: memory hot-add: memory can not be added to movable zone defaultly
@ 2015-10-09  7:12 Changsheng Liu
  2015-10-09  7:59 ` Tang Chen
  2015-10-09 19:06 ` kbuild test robot
  0 siblings, 2 replies; 8+ messages in thread
From: Changsheng Liu @ 2015-10-09  7:12 UTC (permalink / raw)
  To: akpm, isimatu.yasuaki, vbabka, yasu.isimatu, tangchen
  Cc: linux-mm, linux-kernel, wangnan0, zhangyanfei, dave.hansen,
	yinghai, hutao, laijs, guz.fnst, toshi.kani, qiuxishi, wunan,
	yanxiaofeng, liuchangsheng, fandd, Changsheng Liu

From: Changsheng Liu <liuchangcheng@inspur.com>

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 <liuchangsheng@inspur.com>
Signed-off-by: Xiaofeng Yan <yanxiaofeng@inspur.com>
Tested-by: Dongdong Fan <fandd@inspur.com>
Cc: Wang Nan <wangnan0@huawei.com>
Cc: Zhang Yanfei <zhangyanfei@cn.fujitsu.com>
Cc: Dave Hansen <dave.hansen@intel.com>
Cc: Yinghai Lu <yinghai@kernel.org>
Cc: Tang Chen <tangchen@cn.fujitsu.com>
Cc: Hu Tao <hutao@cn.fujitsu.com>
Cc: Lai Jiangshan <laijs@cn.fujitsu.com>
Cc: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
Cc: Gu Zheng <guz.fnst@cn.fujitsu.com>
Cc: Toshi Kani <toshi.kani@hp.com>
Cc: Xishi Qiu <qiuxishi@huawei.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---
 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

--
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>

^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2015-10-12  6:05 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-10-10  9:27 [PATCH V6] mm: memory hot-add: memory can not be added to movable zone defaultly Hillf Danton
2015-10-10 10:39 ` Changsheng Liu
  -- strict thread matches above, loose matches on Subject: below --
2015-10-09  7:12 Changsheng Liu
2015-10-09  7:59 ` Tang Chen
2015-10-09 18:13   ` Yasuaki Ishimatsu
2015-10-12  1:45     ` Tang Chen
2015-10-12  6:04       ` Changsheng Liu
2015-10-09 19:06 ` kbuild test robot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).