aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mm/vmscan.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c
index a3d669f8e25e..9789a2c92563 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -2635,10 +2635,19 @@ static int __zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order)
2635 * Note that shrink_slab will free memory on all zones and may 2635 * Note that shrink_slab will free memory on all zones and may
2636 * take a long time. 2636 * take a long time.
2637 */ 2637 */
2638 while (shrink_slab(sc.nr_scanned, gfp_mask, order) && 2638 for (;;) {
2639 (zone_page_state(zone, NR_SLAB_RECLAIMABLE) + nr_pages > 2639 unsigned long lru_pages = zone_reclaimable_pages(zone);
2640 nr_slab_pages0)) 2640
2641 ; 2641 /* No reclaimable slab or very low memory pressure */
2642 if (!shrink_slab(sc.nr_scanned, gfp_mask, lru_pages))
2643 break;
2644
2645 /* Freed enough memory */
2646 nr_slab_pages1 = zone_page_state(zone,
2647 NR_SLAB_RECLAIMABLE);
2648 if (nr_slab_pages1 + nr_pages <= nr_slab_pages0)
2649 break;
2650 }
2642 2651
2643 /* 2652 /*
2644 * Update nr_reclaimed by the number of slab pages we 2653 * Update nr_reclaimed by the number of slab pages we