diff options
Diffstat (limited to 'mm/vmscan.c')
-rw-r--r-- | mm/vmscan.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c index 75c29974e878..f90b76086ffa 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -1034,6 +1034,31 @@ int isolate_lru_page(struct page *page) | |||
1034 | } | 1034 | } |
1035 | 1035 | ||
1036 | /* | 1036 | /* |
1037 | * Are there way too many processes in the direct reclaim path already? | ||
1038 | */ | ||
1039 | static int too_many_isolated(struct zone *zone, int file, | ||
1040 | struct scan_control *sc) | ||
1041 | { | ||
1042 | unsigned long inactive, isolated; | ||
1043 | |||
1044 | if (current_is_kswapd()) | ||
1045 | return 0; | ||
1046 | |||
1047 | if (!scanning_global_lru(sc)) | ||
1048 | return 0; | ||
1049 | |||
1050 | if (file) { | ||
1051 | inactive = zone_page_state(zone, NR_INACTIVE_FILE); | ||
1052 | isolated = zone_page_state(zone, NR_ISOLATED_FILE); | ||
1053 | } else { | ||
1054 | inactive = zone_page_state(zone, NR_INACTIVE_ANON); | ||
1055 | isolated = zone_page_state(zone, NR_ISOLATED_ANON); | ||
1056 | } | ||
1057 | |||
1058 | return isolated > inactive; | ||
1059 | } | ||
1060 | |||
1061 | /* | ||
1037 | * shrink_inactive_list() is a helper for shrink_zone(). It returns the number | 1062 | * shrink_inactive_list() is a helper for shrink_zone(). It returns the number |
1038 | * of reclaimed pages | 1063 | * of reclaimed pages |
1039 | */ | 1064 | */ |
@@ -1048,6 +1073,14 @@ static unsigned long shrink_inactive_list(unsigned long max_scan, | |||
1048 | struct zone_reclaim_stat *reclaim_stat = get_reclaim_stat(zone, sc); | 1073 | struct zone_reclaim_stat *reclaim_stat = get_reclaim_stat(zone, sc); |
1049 | int lumpy_reclaim = 0; | 1074 | int lumpy_reclaim = 0; |
1050 | 1075 | ||
1076 | while (unlikely(too_many_isolated(zone, file, sc))) { | ||
1077 | congestion_wait(WRITE, HZ/10); | ||
1078 | |||
1079 | /* We are about to die and free our memory. Return now. */ | ||
1080 | if (fatal_signal_pending(current)) | ||
1081 | return SWAP_CLUSTER_MAX; | ||
1082 | } | ||
1083 | |||
1051 | /* | 1084 | /* |
1052 | * If we need a large contiguous chunk of memory, or have | 1085 | * If we need a large contiguous chunk of memory, or have |
1053 | * trouble getting a small set of contiguous pages, we | 1086 | * trouble getting a small set of contiguous pages, we |