Re: [PATCH v2] memory_hotplug: zone_can_shift() returns boolean value

From: Yasuaki Ishimatsu
Date: Wed Jan 11 2017 - 11:42:05 EST


Hi Andrew

On 01/09/2017 06:27 PM, Andrew Morton wrote:
On Tue, 13 Dec 2016 15:29:49 -0500 Yasuaki Ishimatsu <yasu.isimatu@xxxxxxxxx> wrote:

online_{kernel|movable} is used to change the memory zone to
ZONE_{NORMAL|MOVABLE} and online the memory.

To check that memory zone can be changed, zone_can_shift() is used.
Currently the function returns minus integer value, plus integer
value and 0. When the function returns minus or plus integer value,
it means that the memory zone can be changed to ZONE_{NORNAL|MOVABLE}.

But when the function returns 0, there is 2 meanings.

One of the meanings is that the memory zone does not need to be changed.
For example, when memory is in ZONE_NORMAL and onlined by online_kernel
the memory zone does not need to be changed.

Another meaning is that the memory zone cannot be changed. When memory
is in ZONE_NORMAL and onlined by online_movable, the memory zone may
not be changed to ZONE_MOVALBE due to memory online limitation(see
Documentation/memory-hotplug.txt). In this case, memory must not be
onlined.

The patch changes the return type of zone_can_shift() so that memory
is not onlined when memory zone cannot be changed.

What are the user-visible runtime effects of this fix?

The user-visible runtime effects of the fix are here:

Before applying patch:
# grep -A 35 "Node 2" /proc/zoneinfo
Node 2, zone Normal
<snip>
node_scanned 0
spanned 8388608
present 7864320
managed 7864320
# echo online_movable > memory4097/state
# grep -A 35 "Node 2" /proc/zoneinfo
Node 2, zone Normal
<snip>
node_scanned 0
spanned 8388608
present 8388608
managed 8388608

online_movable operation succeeded. But memory is onlined as
ZONE_NORMAL, not ZONE_MOVABLE.

After applying patch:
# grep -A 35 "Node 2" /proc/zoneinfo
Node 2, zone Normal
<snip>
node_scanned 0
spanned 8388608
present 7864320
managed 7864320
# echo online_movable > memory4097/state
bash: echo: write error: Invalid argument
# grep -A 35 "Node 2" /proc/zoneinfo
Node 2, zone Normal
<snip>
node_scanned 0
spanned 8388608
present 7864320
managed 7864320

online_movable operation failed because of failure of changing
the memory zone from ZONE_NORMAL to ZONE_MOVABLE

Please always include this info when fixing bugs - it is required so
that others can decide which kernel version(s) need the fix.

I'll add the above information and resend the patch as v3.

Thanks,
Yasuaki Ishimatsu

Thanks.