aboutsummaryrefslogtreecommitdiffstats
path: root/mm/ksm.c
diff options
context:
space:
mode:
authorAndrea Arcangeli <aarcange@redhat.com>2011-01-13 18:47:10 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2011-01-13 20:32:46 -0500
commit878aee7d6b5504e01b9caffce080e792b6b8d090 (patch)
treec4a01a78885c25b6b3b1e0c74af7cb83c98a07c5 /mm/ksm.c
parent8ee53820edfd1f3b6554c593f337148dd3d7fc91 (diff)
thp: freeze khugepaged and ksmd
It's unclear why schedule friendly kernel threads can't be taken away by the CPU through the scheduler itself. It's safer to stop them as they can trigger memory allocation, if kswapd also freezes itself to avoid generating I/O they have too. Signed-off-by: Andrea Arcangeli <aarcange@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
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 }