diff options
-rw-r--r-- | mm/vmscan.c | 17 |
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 |