diff options
Diffstat (limited to 'mm/vmscan.c')
-rw-r--r-- | mm/vmscan.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c index 9ca587c69274..5da4295e7d67 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -2143,7 +2143,7 @@ static int sleeping_prematurely(pg_data_t *pgdat, int order, long remaining) | |||
2143 | if (zone->all_unreclaimable) | 2143 | if (zone->all_unreclaimable) |
2144 | continue; | 2144 | continue; |
2145 | 2145 | ||
2146 | if (!zone_watermark_ok(zone, order, high_wmark_pages(zone), | 2146 | if (!zone_watermark_ok_safe(zone, order, high_wmark_pages(zone), |
2147 | 0, 0)) | 2147 | 0, 0)) |
2148 | return 1; | 2148 | return 1; |
2149 | } | 2149 | } |
@@ -2230,7 +2230,7 @@ loop_again: | |||
2230 | shrink_active_list(SWAP_CLUSTER_MAX, zone, | 2230 | shrink_active_list(SWAP_CLUSTER_MAX, zone, |
2231 | &sc, priority, 0); | 2231 | &sc, priority, 0); |
2232 | 2232 | ||
2233 | if (!zone_watermark_ok(zone, order, | 2233 | if (!zone_watermark_ok_safe(zone, order, |
2234 | high_wmark_pages(zone), 0, 0)) { | 2234 | high_wmark_pages(zone), 0, 0)) { |
2235 | end_zone = i; | 2235 | end_zone = i; |
2236 | break; | 2236 | break; |
@@ -2276,7 +2276,7 @@ loop_again: | |||
2276 | * We put equal pressure on every zone, unless one | 2276 | * We put equal pressure on every zone, unless one |
2277 | * zone has way too many pages free already. | 2277 | * zone has way too many pages free already. |
2278 | */ | 2278 | */ |
2279 | if (!zone_watermark_ok(zone, order, | 2279 | if (!zone_watermark_ok_safe(zone, order, |
2280 | 8*high_wmark_pages(zone), end_zone, 0)) | 2280 | 8*high_wmark_pages(zone), end_zone, 0)) |
2281 | shrink_zone(priority, zone, &sc); | 2281 | shrink_zone(priority, zone, &sc); |
2282 | reclaim_state->reclaimed_slab = 0; | 2282 | reclaim_state->reclaimed_slab = 0; |
@@ -2297,7 +2297,7 @@ loop_again: | |||
2297 | total_scanned > sc.nr_reclaimed + sc.nr_reclaimed / 2) | 2297 | total_scanned > sc.nr_reclaimed + sc.nr_reclaimed / 2) |
2298 | sc.may_writepage = 1; | 2298 | sc.may_writepage = 1; |
2299 | 2299 | ||
2300 | if (!zone_watermark_ok(zone, order, | 2300 | if (!zone_watermark_ok_safe(zone, order, |
2301 | high_wmark_pages(zone), end_zone, 0)) { | 2301 | high_wmark_pages(zone), end_zone, 0)) { |
2302 | all_zones_ok = 0; | 2302 | all_zones_ok = 0; |
2303 | /* | 2303 | /* |
@@ -2305,7 +2305,7 @@ loop_again: | |||
2305 | * means that we have a GFP_ATOMIC allocation | 2305 | * means that we have a GFP_ATOMIC allocation |
2306 | * failure risk. Hurry up! | 2306 | * failure risk. Hurry up! |
2307 | */ | 2307 | */ |
2308 | if (!zone_watermark_ok(zone, order, | 2308 | if (!zone_watermark_ok_safe(zone, order, |
2309 | min_wmark_pages(zone), end_zone, 0)) | 2309 | min_wmark_pages(zone), end_zone, 0)) |
2310 | has_under_min_watermark_zone = 1; | 2310 | has_under_min_watermark_zone = 1; |
2311 | } else { | 2311 | } else { |
@@ -2448,7 +2448,9 @@ static int kswapd(void *p) | |||
2448 | */ | 2448 | */ |
2449 | if (!sleeping_prematurely(pgdat, order, remaining)) { | 2449 | if (!sleeping_prematurely(pgdat, order, remaining)) { |
2450 | trace_mm_vmscan_kswapd_sleep(pgdat->node_id); | 2450 | trace_mm_vmscan_kswapd_sleep(pgdat->node_id); |
2451 | restore_pgdat_percpu_threshold(pgdat); | ||
2451 | schedule(); | 2452 | schedule(); |
2453 | reduce_pgdat_percpu_threshold(pgdat); | ||
2452 | } else { | 2454 | } else { |
2453 | if (remaining) | 2455 | if (remaining) |
2454 | count_vm_event(KSWAPD_LOW_WMARK_HIT_QUICKLY); | 2456 | count_vm_event(KSWAPD_LOW_WMARK_HIT_QUICKLY); |
@@ -2487,16 +2489,17 @@ void wakeup_kswapd(struct zone *zone, int order) | |||
2487 | if (!populated_zone(zone)) | 2489 | if (!populated_zone(zone)) |
2488 | return; | 2490 | return; |
2489 | 2491 | ||
2490 | pgdat = zone->zone_pgdat; | 2492 | if (!cpuset_zone_allowed_hardwall(zone, GFP_KERNEL)) |
2491 | if (zone_watermark_ok(zone, order, low_wmark_pages(zone), 0, 0)) | ||
2492 | return; | 2493 | return; |
2494 | pgdat = zone->zone_pgdat; | ||
2493 | if (pgdat->kswapd_max_order < order) | 2495 | if (pgdat->kswapd_max_order < order) |
2494 | pgdat->kswapd_max_order = order; | 2496 | pgdat->kswapd_max_order = order; |
2495 | trace_mm_vmscan_wakeup_kswapd(pgdat->node_id, zone_idx(zone), order); | ||
2496 | if (!cpuset_zone_allowed_hardwall(zone, GFP_KERNEL)) | ||
2497 | return; | ||
2498 | if (!waitqueue_active(&pgdat->kswapd_wait)) | 2497 | if (!waitqueue_active(&pgdat->kswapd_wait)) |
2499 | return; | 2498 | return; |
2499 | if (zone_watermark_ok_safe(zone, order, low_wmark_pages(zone), 0, 0)) | ||
2500 | return; | ||
2501 | |||
2502 | trace_mm_vmscan_wakeup_kswapd(pgdat->node_id, zone_idx(zone), order); | ||
2500 | wake_up_interruptible(&pgdat->kswapd_wait); | 2503 | wake_up_interruptible(&pgdat->kswapd_wait); |
2501 | } | 2504 | } |
2502 | 2505 | ||