diff options
Diffstat (limited to 'mm/vmscan.c')
-rw-r--r-- | mm/vmscan.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c index ba18d0c36b83..8f35d7d585cb 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -697,6 +697,11 @@ done: | |||
697 | return nr_reclaimed; | 697 | return nr_reclaimed; |
698 | } | 698 | } |
699 | 699 | ||
700 | static inline int zone_is_near_oom(struct zone *zone) | ||
701 | { | ||
702 | return zone->pages_scanned >= (zone->nr_active + zone->nr_inactive)*3; | ||
703 | } | ||
704 | |||
700 | /* | 705 | /* |
701 | * This moves pages from the active list to the inactive list. | 706 | * This moves pages from the active list to the inactive list. |
702 | * | 707 | * |
@@ -732,6 +737,9 @@ static void shrink_active_list(unsigned long nr_pages, struct zone *zone, | |||
732 | long distress; | 737 | long distress; |
733 | long swap_tendency; | 738 | long swap_tendency; |
734 | 739 | ||
740 | if (zone_is_near_oom(zone)) | ||
741 | goto force_reclaim_mapped; | ||
742 | |||
735 | /* | 743 | /* |
736 | * `distress' is a measure of how much trouble we're having | 744 | * `distress' is a measure of how much trouble we're having |
737 | * reclaiming pages. 0 -> no problems. 100 -> great trouble. | 745 | * reclaiming pages. 0 -> no problems. 100 -> great trouble. |
@@ -767,6 +775,7 @@ static void shrink_active_list(unsigned long nr_pages, struct zone *zone, | |||
767 | * memory onto the inactive list. | 775 | * memory onto the inactive list. |
768 | */ | 776 | */ |
769 | if (swap_tendency >= 100) | 777 | if (swap_tendency >= 100) |
778 | force_reclaim_mapped: | ||
770 | reclaim_mapped = 1; | 779 | reclaim_mapped = 1; |
771 | } | 780 | } |
772 | 781 | ||
@@ -1161,7 +1170,7 @@ scan: | |||
1161 | if (zone->all_unreclaimable) | 1170 | if (zone->all_unreclaimable) |
1162 | continue; | 1171 | continue; |
1163 | if (nr_slab == 0 && zone->pages_scanned >= | 1172 | if (nr_slab == 0 && zone->pages_scanned >= |
1164 | (zone->nr_active + zone->nr_inactive) * 4) | 1173 | (zone->nr_active + zone->nr_inactive) * 6) |
1165 | zone->all_unreclaimable = 1; | 1174 | zone->all_unreclaimable = 1; |
1166 | /* | 1175 | /* |
1167 | * If we've done a decent amount of scanning and | 1176 | * If we've done a decent amount of scanning and |