lkml.org 
[lkml]   [2013]   [Oct]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH part2 v2 8/8] x86, numa, acpi, memory-hotplug: Make movable_node have higher priority
    From: Tang Chen <tangchen@cn.fujitsu.com>

    If users specify the original movablecore=nn@ss boot option, the kernel will
    arrange [ss, ss+nn) as ZONE_MOVABLE. The kernelcore=nn@ss boot option is similar
    except it specifies ZONE_NORMAL ranges.

    Now, if users specify "movable_node" in kernel commandline, the kernel will
    arrange hotpluggable memory in SRAT as ZONE_MOVABLE. And if users do this, all
    the other movablecore=nn@ss and kernelcore=nn@ss options should be ignored.

    For those who don't want this, just specify nothing. The kernel will act as
    before.

    Signed-off-by: Tang Chen <tangchen@cn.fujitsu.com>
    Signed-off-by: Zhang Yanfei <zhangyanfei@cn.fujitsu.com>
    Reviewed-by: Wanpeng Li <liwanp@linux.vnet.ibm.com>
    ---
    mm/page_alloc.c | 28 ++++++++++++++++++++++++++--
    1 files changed, 26 insertions(+), 2 deletions(-)

    diff --git a/mm/page_alloc.c b/mm/page_alloc.c
    index dd886fa..768ea0e 100644
    --- a/mm/page_alloc.c
    +++ b/mm/page_alloc.c
    @@ -5021,9 +5021,33 @@ static void __init find_zone_movable_pfns_for_nodes(void)
    nodemask_t saved_node_state = node_states[N_MEMORY];
    unsigned long totalpages = early_calculate_totalpages();
    int usable_nodes = nodes_weight(node_states[N_MEMORY]);
    + struct memblock_type *type = &memblock.memory;
    +
    + /* Need to find movable_zone earlier when movable_node is specified. */
    + find_usable_zone_for_movable();
    +
    + /*
    + * If movable_node is specified, ignore kernelcore and movablecore
    + * options.
    + */
    + if (movable_node_is_enabled()) {
    + for (i = 0; i < type->cnt; i++) {
    + if (!memblock_is_hotpluggable(&type->regions[i]))
    + continue;
    +
    + nid = type->regions[i].nid;
    +
    + usable_startpfn = PFN_DOWN(type->regions[i].base);
    + zone_movable_pfn[nid] = zone_movable_pfn[nid] ?
    + min(usable_startpfn, zone_movable_pfn[nid]) :
    + usable_startpfn;
    + }
    +
    + goto out2;
    + }

    /*
    - * If movablecore was specified, calculate what size of
    + * If movablecore=nn[KMG] was specified, calculate what size of
    * kernelcore that corresponds so that memory usable for
    * any allocation type is evenly spread. If both kernelcore
    * and movablecore are specified, then the value of kernelcore
    @@ -5049,7 +5073,6 @@ static void __init find_zone_movable_pfns_for_nodes(void)
    goto out;

    /* usable_startpfn is the lowest possible pfn ZONE_MOVABLE can be at */
    - find_usable_zone_for_movable();
    usable_startpfn = arch_zone_lowest_possible_pfn[movable_zone];

    restart:
    @@ -5140,6 +5163,7 @@ restart:
    if (usable_nodes && required_kernelcore > usable_nodes)
    goto restart;

    +out2:
    /* Align start of ZONE_MOVABLE on all nids to MAX_ORDER_NR_PAGES */
    for (nid = 0; nid < MAX_NUMNODES; nid++)
    zone_movable_pfn[nid] =
    --
    1.7.1

    \
     
     \ /
      Last update: 2013-10-12 08:21    [W:2.350 / U:0.340 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site