• Yasuaki Ishimatsu's avatar
    memory_hotplug: make zone_can_shift() return a boolean value · 143a9ad4
    Yasuaki Ishimatsu authored
    commit 8a1f780e upstream.
    
    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 are two 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
    online operation fails when memory zone cannot be changed as follows:
    
    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
    
    Fixes: df429ac0 ("memory-hotplug: more general validation of zone during online")
    Link: http://lkml.kernel.org/r/2f9c3837-33d7-b6e5-59c0-6ca4372b2d84@gmail.comSigned-off-by: default avatarYasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
    Reviewed-by: default avatarReza Arbab <arbab@linux.vnet.ibm.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    143a9ad4
memory.c 19.7 KB