diff options
Diffstat (limited to 'mm/ksm.c')
-rw-r--r-- | mm/ksm.c | 8 |
1 files changed, 6 insertions, 2 deletions
@@ -34,6 +34,7 @@ | |||
34 | #include <linux/swap.h> | 34 | #include <linux/swap.h> |
35 | #include <linux/ksm.h> | 35 | #include <linux/ksm.h> |
36 | #include <linux/hash.h> | 36 | #include <linux/hash.h> |
37 | #include <linux/freezer.h> | ||
37 | 38 | ||
38 | #include <asm/tlbflush.h> | 39 | #include <asm/tlbflush.h> |
39 | #include "internal.h" | 40 | #include "internal.h" |
@@ -1365,7 +1366,7 @@ static void ksm_do_scan(unsigned int scan_npages) | |||
1365 | struct rmap_item *rmap_item; | 1366 | struct rmap_item *rmap_item; |
1366 | struct page *uninitialized_var(page); | 1367 | struct page *uninitialized_var(page); |
1367 | 1368 | ||
1368 | while (scan_npages--) { | 1369 | while (scan_npages-- && likely(!freezing(current))) { |
1369 | cond_resched(); | 1370 | cond_resched(); |
1370 | rmap_item = scan_get_next_rmap_item(&page); | 1371 | rmap_item = scan_get_next_rmap_item(&page); |
1371 | if (!rmap_item) | 1372 | if (!rmap_item) |
@@ -1383,6 +1384,7 @@ static int ksmd_should_run(void) | |||
1383 | 1384 | ||
1384 | static int ksm_scan_thread(void *nothing) | 1385 | static int ksm_scan_thread(void *nothing) |
1385 | { | 1386 | { |
1387 | set_freezable(); | ||
1386 | set_user_nice(current, 5); | 1388 | set_user_nice(current, 5); |
1387 | 1389 | ||
1388 | while (!kthread_should_stop()) { | 1390 | while (!kthread_should_stop()) { |
@@ -1391,11 +1393,13 @@ static int ksm_scan_thread(void *nothing) | |||
1391 | ksm_do_scan(ksm_thread_pages_to_scan); | 1393 | ksm_do_scan(ksm_thread_pages_to_scan); |
1392 | mutex_unlock(&ksm_thread_mutex); | 1394 | mutex_unlock(&ksm_thread_mutex); |
1393 | 1395 | ||
1396 | try_to_freeze(); | ||
1397 | |||
1394 | if (ksmd_should_run()) { | 1398 | if (ksmd_should_run()) { |
1395 | schedule_timeout_interruptible( | 1399 | schedule_timeout_interruptible( |
1396 | msecs_to_jiffies(ksm_thread_sleep_millisecs)); | 1400 | msecs_to_jiffies(ksm_thread_sleep_millisecs)); |
1397 | } else { | 1401 | } else { |
1398 | wait_event_interruptible(ksm_thread_wait, | 1402 | wait_event_freezable(ksm_thread_wait, |
1399 | ksmd_should_run() || kthread_should_stop()); | 1403 | ksmd_should_run() || kthread_should_stop()); |
1400 | } | 1404 | } |
1401 | } | 1405 | } |