lkml.org 
[lkml]   [2008]   [Sep]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 19/42] mm: make setup_zone_migrate_reserve() aware of overlapping nodes
    2.6.26-stable review patch.  If anyone has any objections, please let us know.

    ------------------

    From: Adam Litke <agl@us.ibm.com>

    commit 344c790e3821dac37eb742ddd0b611a300f78b9a upstream

    I have gotten to the root cause of the hugetlb badness I reported back on
    August 15th. My system has the following memory topology (note the
    overlapping node):

    Node 0 Memory: 0x8000000-0x44000000
    Node 1 Memory: 0x0-0x8000000 0x44000000-0x80000000

    setup_zone_migrate_reserve() scans the address range 0x0-0x8000000 looking
    for a pageblock to move onto the MIGRATE_RESERVE list. Finding no
    candidates, it happily continues the scan into 0x8000000-0x44000000. When
    a pageblock is found, the pages are moved to the MIGRATE_RESERVE list on
    the wrong zone. Oops.

    setup_zone_migrate_reserve() should skip pageblocks in overlapping nodes.

    Signed-off-by: Adam Litke <agl@us.ibm.com>
    Acked-by: Mel Gorman <mel@csn.ul.ie>
    Cc: Dave Hansen <dave@linux.vnet.ibm.com>
    Cc: Nishanth Aravamudan <nacc@us.ibm.com>
    Cc: Andy Whitcroft <apw@shadowen.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    mm/page_alloc.c | 7 +++++++
    1 file changed, 7 insertions(+)

    --- a/mm/page_alloc.c
    +++ b/mm/page_alloc.c
    @@ -693,6 +693,9 @@ int move_freepages(struct zone *zone,
    #endif

    for (page = start_page; page <= end_page;) {
    + /* Make sure we are not inadvertently changing nodes */
    + VM_BUG_ON(page_to_nid(page) != zone_to_nid(zone));
    +
    if (!pfn_valid_within(page_to_pfn(page))) {
    page++;
    continue;
    @@ -2475,6 +2478,10 @@ static void setup_zone_migrate_reserve(s
    continue;
    page = pfn_to_page(pfn);

    + /* Watch out for overlapping nodes */
    + if (page_to_nid(page) != zone_to_nid(zone))
    + continue;
    +
    /* Blocks with reserved pages will never free, skip them. */
    if (PageReserved(page))
    continue;
    --


    \
     
     \ /
      Last update: 2008-09-03 19:43    [W:4.123 / U:0.068 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site