aboutsummaryrefslogtreecommitdiffstats
path: root/mm/vmscan.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/vmscan.c')
-rw-r--r--mm/vmscan.c23
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