lkml.org 
[lkml]   [2009]   [Nov]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch -mm] mm: slab allocate memory section nodemask for large systems
    Nodemasks should not be allocated on the stack for large systems (when it
    is larger than 256 bytes) since there is a threat of overflow.

    This patch causes the unregister_mem_sect_under_nodes() nodemask to be
    allocated on the stack for smaller systems and be allocated by slab for
    larger systems.

    GFP_KERNEL is used since remove_memory_block() can block.

    Cc: Gary Hade <garyhade@us.ibm.com>
    Cc: Badari Pulavarty <pbadari@us.ibm.com>
    Cc: Alex Chiang <achiang@hp.com>
    Signed-off-by: David Rientjes <rientjes@google.com>
    ---
    drivers/base/node.c | 13 +++++++++----
    1 files changed, 9 insertions(+), 4 deletions(-)

    diff --git a/drivers/base/node.c b/drivers/base/node.c
    --- a/drivers/base/node.c
    +++ b/drivers/base/node.c
    @@ -363,12 +363,16 @@ int register_mem_sect_under_node(struct memory_block *mem_blk, int nid)
    /* unregister memory section under all nodes that it spans */
    int unregister_mem_sect_under_nodes(struct memory_block *mem_blk)
    {
    - nodemask_t unlinked_nodes;
    + NODEMASK_ALLOC(nodemask_t, unlinked_nodes, GFP_KERNEL);
    unsigned long pfn, sect_start_pfn, sect_end_pfn;

    - if (!mem_blk)
    + if (!mem_blk) {
    + NODEMASK_FREE(unlinked_nodes);
    return -EFAULT;
    - nodes_clear(unlinked_nodes);
    + }
    + if (!unlinked_nodes)
    + return -ENOMEM;
    + nodes_clear(*unlinked_nodes);
    sect_start_pfn = section_nr_to_pfn(mem_blk->phys_index);
    sect_end_pfn = sect_start_pfn + PAGES_PER_SECTION - 1;
    for (pfn = sect_start_pfn; pfn <= sect_end_pfn; pfn++) {
    @@ -379,13 +383,14 @@ int unregister_mem_sect_under_nodes(struct memory_block *mem_blk)
    continue;
    if (!node_online(nid))
    continue;
    - if (node_test_and_set(nid, unlinked_nodes))
    + if (node_test_and_set(nid, *unlinked_nodes))
    continue;
    sysfs_remove_link(&node_devices[nid].sysdev.kobj,
    kobject_name(&mem_blk->sysdev.kobj));
    sysfs_remove_link(&mem_blk->sysdev.kobj,
    kobject_name(&node_devices[nid].sysdev.kobj));
    }
    + NODEMASK_FREE(unlinked_nodes);
    return 0;
    }


    \
     
     \ /
      Last update: 2009-11-18 01:21    [W:0.025 / U:1.672 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site