diff options
Diffstat (limited to 'mm/vmscan.c')
-rw-r--r-- | mm/vmscan.c | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c index 777af57fd8c8..d0a631a428a0 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -2173,6 +2173,7 @@ static int kswapd(void *p) | |||
2173 | order = 0; | 2173 | order = 0; |
2174 | for ( ; ; ) { | 2174 | for ( ; ; ) { |
2175 | unsigned long new_order; | 2175 | unsigned long new_order; |
2176 | int ret; | ||
2176 | 2177 | ||
2177 | prepare_to_wait(&pgdat->kswapd_wait, &wait, TASK_INTERRUPTIBLE); | 2178 | prepare_to_wait(&pgdat->kswapd_wait, &wait, TASK_INTERRUPTIBLE); |
2178 | new_order = pgdat->kswapd_max_order; | 2179 | new_order = pgdat->kswapd_max_order; |
@@ -2184,19 +2185,23 @@ static int kswapd(void *p) | |||
2184 | */ | 2185 | */ |
2185 | order = new_order; | 2186 | order = new_order; |
2186 | } else { | 2187 | } else { |
2187 | if (!freezing(current)) | 2188 | if (!freezing(current) && !kthread_should_stop()) |
2188 | schedule(); | 2189 | schedule(); |
2189 | 2190 | ||
2190 | order = pgdat->kswapd_max_order; | 2191 | order = pgdat->kswapd_max_order; |
2191 | } | 2192 | } |
2192 | finish_wait(&pgdat->kswapd_wait, &wait); | 2193 | finish_wait(&pgdat->kswapd_wait, &wait); |
2193 | 2194 | ||
2194 | if (!try_to_freeze()) { | 2195 | ret = try_to_freeze(); |
2195 | /* We can speed up thawing tasks if we don't call | 2196 | if (kthread_should_stop()) |
2196 | * balance_pgdat after returning from the refrigerator | 2197 | break; |
2197 | */ | 2198 | |
2199 | /* | ||
2200 | * We can speed up thawing tasks if we don't call balance_pgdat | ||
2201 | * after returning from the refrigerator | ||
2202 | */ | ||
2203 | if (!ret) | ||
2198 | balance_pgdat(pgdat, order); | 2204 | balance_pgdat(pgdat, order); |
2199 | } | ||
2200 | } | 2205 | } |
2201 | return 0; | 2206 | return 0; |
2202 | } | 2207 | } |
@@ -2451,6 +2456,17 @@ int kswapd_run(int nid) | |||
2451 | return ret; | 2456 | return ret; |
2452 | } | 2457 | } |
2453 | 2458 | ||
2459 | /* | ||
2460 | * Called by memory hotplug when all memory in a node is offlined. | ||
2461 | */ | ||
2462 | void kswapd_stop(int nid) | ||
2463 | { | ||
2464 | struct task_struct *kswapd = NODE_DATA(nid)->kswapd; | ||
2465 | |||
2466 | if (kswapd) | ||
2467 | kthread_stop(kswapd); | ||
2468 | } | ||
2469 | |||
2454 | static int __init kswapd_init(void) | 2470 | static int __init kswapd_init(void) |
2455 | { | 2471 | { |
2456 | int nid; | 2472 | int nid; |