aboutsummaryrefslogtreecommitdiffstats
path: root/mm/ksm.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/ksm.c')
-rw-r--r--mm/ksm.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/mm/ksm.c b/mm/ksm.c
index 5e7d5d35ea82..e2b0afd0a031 100644
--- a/mm/ksm.c
+++ b/mm/ksm.c
@@ -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
1384static int ksm_scan_thread(void *nothing) 1385static 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 }