From 5132289f2bbcfb36c11eb4d181e555b91c1a7b57 Mon Sep 17 00:00:00 2001 From: KOSAKI Motohiro Date: Mon, 9 Aug 2010 17:19:54 -0700 Subject: [PATCH] --- yaml --- r: 207272 b: refs/heads/master c: 4dc4b3d971b23e12d483ba9f3b93b648c54b298a h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/mm/vmscan.c | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index d1171238678e..63a15a4405bb 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 57250a5bf0f6ff68dc339572adbd881a11f366fa +refs/heads/master: 4dc4b3d971b23e12d483ba9f3b93b648c54b298a diff --git a/trunk/mm/vmscan.c b/trunk/mm/vmscan.c index a3d669f8e25e..9789a2c92563 100644 --- a/trunk/mm/vmscan.c +++ b/trunk/mm/vmscan.c @@ -2635,10 +2635,19 @@ static int __zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order) * Note that shrink_slab will free memory on all zones and may * take a long time. */ - while (shrink_slab(sc.nr_scanned, gfp_mask, order) && - (zone_page_state(zone, NR_SLAB_RECLAIMABLE) + nr_pages > - nr_slab_pages0)) - ; + for (;;) { + unsigned long lru_pages = zone_reclaimable_pages(zone); + + /* No reclaimable slab or very low memory pressure */ + if (!shrink_slab(sc.nr_scanned, gfp_mask, lru_pages)) + break; + + /* Freed enough memory */ + nr_slab_pages1 = zone_page_state(zone, + NR_SLAB_RECLAIMABLE); + if (nr_slab_pages1 + nr_pages <= nr_slab_pages0) + break; + } /* * Update nr_reclaimed by the number of slab pages we