Dave Jones 2205c1a
From: Andrea Arcangeli <aarcange@redhat.com>
Dave Jones 2205c1a
Subject: thp: reduce khugepaged freezing latency
Dave Jones 2205c1a
Dave Jones 2205c1a
Use wait_event_freezable_timeout() instead of
Dave Jones 2205c1a
schedule_timeout_interruptible() to avoid missing freezer wakeups. A
Dave Jones 2205c1a
try_to_freeze() would have been needed in the
Dave Jones 2205c1a
khugepaged_alloc_hugepage tight loop too in case of the allocation
Dave Jones 2205c1a
failing repeatedly, and wait_event_freezable_timeout will provide it
Dave Jones 2205c1a
too.
Dave Jones 2205c1a
Dave Jones 2205c1a
khugepaged would still freeze just fine by trying again the next
Dave Jones 2205c1a
minute but it's better if it freezes immediately.
Dave Jones 2205c1a
Dave Jones 2205c1a
Reported-by: Jiri Slaby <jslaby@suse.cz>
Dave Jones 2205c1a
Signed-off-by: Andrea Arcangeli <aarcange@redhat.com>
Dave Jones 2205c1a
Dave Jones 2205c1a
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
Dave Jones 2205c1a
index 4298aba..fd925d0 100644
Dave Jones 2205c1a
--- a/mm/huge_memory.c
Dave Jones 2205c1a
+++ b/mm/huge_memory.c
Dave Jones 2205c1a
@@ -2259,12 +2259,9 @@ static void khugepaged_do_scan(struct page **hpage)
Dave Jones 2205c1a
 
Dave Jones 2205c1a
 static void khugepaged_alloc_sleep(void)
Dave Jones 2205c1a
 {
Dave Jones 2205c1a
-	DEFINE_WAIT(wait);
Dave Jones 2205c1a
-	add_wait_queue(&khugepaged_wait, &wait);
Dave Jones 2205c1a
-	schedule_timeout_interruptible(
Dave Jones 2205c1a
-		msecs_to_jiffies(
Dave Jones 2205c1a
-			khugepaged_alloc_sleep_millisecs));
Dave Jones 2205c1a
-	remove_wait_queue(&khugepaged_wait, &wait);
Dave Jones 2205c1a
+	wait_event_freezable_timeout(khugepaged_wait, false,
Dave Jones 2205c1a
+				     msecs_to_jiffies(
Dave Jones 2205c1a
+					     khugepaged_alloc_sleep_millisecs));
Dave Jones 2205c1a
 }
Dave Jones 2205c1a
 
Dave Jones 2205c1a
 #ifndef CONFIG_NUMA
Dave Jones 2205c1a
@@ -2313,14 +2310,11 @@ static void khugepaged_loop(void)
Dave Jones 2205c1a
 		if (unlikely(kthread_should_stop()))
Dave Jones 2205c1a
 			break;
Dave Jones 2205c1a
 		if (khugepaged_has_work()) {
Dave Jones 2205c1a
-			DEFINE_WAIT(wait);
Dave Jones 2205c1a
 			if (!khugepaged_scan_sleep_millisecs)
Dave Jones 2205c1a
 				continue;
Dave Jones 2205c1a
-			add_wait_queue(&khugepaged_wait, &wait);
Dave Jones 2205c1a
-			schedule_timeout_interruptible(
Dave Jones 2205c1a
+			wait_event_freezable_timeout(khugepaged_wait, false,
Dave Jones 2205c1a
 				msecs_to_jiffies(
Dave Jones 2205c1a
 					khugepaged_scan_sleep_millisecs));
Dave Jones 2205c1a
-			remove_wait_queue(&khugepaged_wait, &wait);
Dave Jones 2205c1a
 		} else if (khugepaged_enabled())
Dave Jones 2205c1a
 			wait_event_freezable(khugepaged_wait,
Dave Jones 2205c1a
 					     khugepaged_wait_event());
Dave Jones 2205c1a
Dave Jones 2205c1a