lkml.org 
[lkml]   [2009]   [Jun]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 27/30] mm: fix handling of pagesets for downed cpus
    2.6.27-stable review patch.  If anyone has any objections, please let us know.

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

    From: Dimitri Sivanich <sivanich@sgi.com>

    commit 364df0ebfbbb1330bfc6ca159f4d6020efc15a12 upstream.

    After downing/upping a cpu, an attempt to set
    /proc/sys/vm/percpu_pagelist_fraction results in an oops in
    percpu_pagelist_fraction_sysctl_handler().

    If a processor is downed then we need to set the pageset pointer back to
    the boot pageset.

    Updates of the high water marks should not access pagesets of unpopulated
    zones (those pointer go to the boot pagesets which would be no longer
    functional if their size would be increased beyond zero).

    Signed-off-by: Dimitri Sivanich <sivanich@sgi.com>
    Signed-off-by: Christoph Lameter <cl@linux-foundation.org>
    Reviewed-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
    Cc: Nick Piggin <nickpiggin@yahoo.com.au>
    Cc: Mel Gorman <mel@csn.ul.ie>
    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 | 6 ++++--
    1 file changed, 4 insertions(+), 2 deletions(-)

    --- a/mm/page_alloc.c
    +++ b/mm/page_alloc.c
    @@ -2764,7 +2764,7 @@ bad:
    if (dzone == zone)
    break;
    kfree(zone_pcp(dzone, cpu));
    - zone_pcp(dzone, cpu) = NULL;
    + zone_pcp(dzone, cpu) = &boot_pageset[cpu];
    }
    return -ENOMEM;
    }
    @@ -2779,7 +2779,7 @@ static inline void free_zone_pagesets(in
    /* Free per_cpu_pageset if it is slab allocated */
    if (pset != &boot_pageset[cpu])
    kfree(pset);
    - zone_pcp(zone, cpu) = NULL;
    + zone_pcp(zone, cpu) = &boot_pageset[cpu];
    }
    }

    @@ -4409,6 +4409,8 @@ int percpu_pagelist_fraction_sysctl_hand
    if (!write || (ret == -EINVAL))
    return ret;
    for_each_zone(zone) {
    + if (!populated_zone(zone))
    + continue;
    for_each_online_cpu(cpu) {
    unsigned long high;
    high = zone->present_pages / percpu_pagelist_fraction;



    \
     
     \ /
      Last update: 2009-07-01 02:45    [W:4.229 / U:0.132 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site