Messages in this thread Patch in this message | | | Date | Sun, 04 May 2008 21:58:13 +0900 | From | KOSAKI Motohiro <> | Subject | [-mm][PATCH 3/5] change function prototype of shrink_zone() |
| |
change function return type for following enhancement. this patch have no behaver change.
Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
--- mm/vmscan.c | 47 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 15 deletions(-)
Index: b/mm/vmscan.c =================================================================== --- a/mm/vmscan.c 2008-05-02 23:46:25.000000000 +0900 +++ b/mm/vmscan.c 2008-05-03 00:00:32.000000000 +0900 @@ -51,6 +51,9 @@ struct scan_control { /* Incremented by the number of inactive pages that were scanned */ unsigned long nr_scanned; + /* number of reclaimed pages by this scanning */ + unsigned long nr_reclaimed; + /* This context's GFP mask */ gfp_t gfp_mask; @@ -1177,8 +1180,8 @@ static void shrink_active_list(unsigned /* * This is a basic per-zone page freer. Used by both kswapd and direct reclaim. */ -static unsigned long shrink_zone(int priority, struct zone *zone, - struct scan_control *sc) +static int shrink_zone(int priority, struct zone *zone, + struct scan_control *sc) { unsigned long nr_active; unsigned long nr_inactive; @@ -1236,8 +1239,9 @@ static unsigned long shrink_zone(int pri } } + sc->nr_reclaimed += nr_reclaimed; throttle_vm_writeout(sc->gfp_mask); - return nr_reclaimed; + return 0; } /* @@ -1251,18 +1255,23 @@ static unsigned long shrink_zone(int pri * b) The zones may be over pages_high but they must go *over* pages_high to * satisfy the `incremental min' zone defense algorithm. * - * Returns the number of reclaimed pages. + * @priority: reclaim priority + * @zonelist: list of shrinking zones + * @sc: scan control context + * @ret_reclaimed: the number of reclaimed pages. + * + * Returns zonzero if error happend. * * If a zone is deemed to be full of pinned pages then just give it a light * scan then give up on it. */ -static unsigned long shrink_zones(int priority, struct zonelist *zonelist, - struct scan_control *sc) +static int shrink_zones(int priority, struct zonelist *zonelist, + struct scan_control *sc) { enum zone_type high_zoneidx = gfp_zone(sc->gfp_mask); - unsigned long nr_reclaimed = 0; struct zoneref *z; struct zone *zone; + int ret = 0; sc->all_unreclaimable = 1; for_each_zone_zonelist(zone, z, zonelist, high_zoneidx) { @@ -1291,10 +1300,13 @@ static unsigned long shrink_zones(int pr priority); } - nr_reclaimed += shrink_zone(priority, zone, sc); + ret = shrink_zone(priority, zone, sc); + if (ret) + goto out; } - return nr_reclaimed; +out: + return ret; } /* @@ -1319,12 +1331,12 @@ static unsigned long do_try_to_free_page int priority; int ret = 0; unsigned long total_scanned = 0; - unsigned long nr_reclaimed = 0; struct reclaim_state *reclaim_state = current->reclaim_state; unsigned long lru_pages = 0; struct zoneref *z; struct zone *zone; enum zone_type high_zoneidx = gfp_zone(sc->gfp_mask); + int err; if (scan_global_lru(sc)) count_vm_event(ALLOCSTALL); @@ -1346,7 +1358,12 @@ static unsigned long do_try_to_free_page sc->nr_scanned = 0; if (!priority) disable_swap_token(); - nr_reclaimed += shrink_zones(priority, zonelist, sc); + err = shrink_zones(priority, zonelist, sc); + if (err == -EAGAIN) { + ret = 1; + goto out; + } + /* * Don't shrink slabs when reclaiming memory from * over limit cgroups @@ -1354,13 +1371,13 @@ static unsigned long do_try_to_free_page if (scan_global_lru(sc)) { shrink_slab(sc->nr_scanned, sc->gfp_mask, lru_pages); if (reclaim_state) { - nr_reclaimed += reclaim_state->reclaimed_slab; + sc->nr_reclaimed += reclaim_state->reclaimed_slab; reclaim_state->reclaimed_slab = 0; } } total_scanned += sc->nr_scanned; - if (nr_reclaimed >= sc->swap_cluster_max) { - ret = nr_reclaimed; + if (sc->nr_reclaimed >= sc->swap_cluster_max) { + ret = sc->nr_reclaimed; goto out; } @@ -1383,7 +1400,7 @@ static unsigned long do_try_to_free_page } /* top priority shrink_caches still had more to do? don't OOM, then */ if (!sc->all_unreclaimable && scan_global_lru(sc)) - ret = nr_reclaimed; + ret = sc->nr_reclaimed; out: /* * Now that we've scanned all the zones at this priority level, note
| |