[kernel/f15] thp: reduce khugepaged freezing latency (rhbz 771006)

Dave Jones davej at fedoraproject.org
Tue Jan 3 15:23:48 UTC 2012


commit 2ec5a5f81db09785dfb4e47d0d5324016a6c02f4
Author: Dave Jones <davej at redhat.com>
Date:   Tue Jan 3 10:21:36 2012 -0500

    thp: reduce khugepaged freezing latency (rhbz 771006)

 kernel.spec                                  |    9 ++++
 thp-reduce-khugepaged-freezing-latency.patch |   54 ++++++++++++++++++++++++++
 2 files changed, 63 insertions(+), 0 deletions(-)
---
diff --git a/kernel.spec b/kernel.spec
index 7d60696..2b66d7f 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -724,6 +724,9 @@ Patch21047: iwlwifi-allow-to-switch-to-HT40-if-not-associated.patch
 #rhbz 741117
 Patch21048: b44-Use-dev_kfree_skb_irq-in-b44_tx.patch
 
+#rhbz 771006
+Patch21050: thp-reduce-khugepaged-freezing-latency.patch
+
 Patch22000: route-cache-garbage-collector.patch
 
 %endif
@@ -1345,6 +1348,9 @@ ApplyPatch iwlwifi-allow-to-switch-to-HT40-if-not-associated.patch
 #rhbz 741117
 ApplyPatch b44-Use-dev_kfree_skb_irq-in-b44_tx.patch
 
+#rhbz 771006
+ApplyPatch thp-reduce-khugepaged-freezing-latency.patch
+
 ApplyPatch route-cache-garbage-collector.patch
 
 # END OF PATCH APPLICATIONS
@@ -1994,6 +2000,9 @@ fi
 # and build.
 
 %changelog
+* Tue Jan 03 2012 Dave Jones <davej at redhat.com>
+- thp: reduce khugepaged freezing latency (rhbz 771006)
+
 * Wed Dec 21 2011 Dave Jones <davej at redhat.com> 2.6.41.6-1
 - Linux 3.1.6 (Fedora 2.6.31.6)
 
diff --git a/thp-reduce-khugepaged-freezing-latency.patch b/thp-reduce-khugepaged-freezing-latency.patch
new file mode 100644
index 0000000..b7b2051
--- /dev/null
+++ b/thp-reduce-khugepaged-freezing-latency.patch
@@ -0,0 +1,54 @@
+From: Andrea Arcangeli <aarcange at redhat.com>
+Subject: thp: reduce khugepaged freezing latency
+
+Use wait_event_freezable_timeout() instead of
+schedule_timeout_interruptible() to avoid missing freezer wakeups. A
+try_to_freeze() would have been needed in the
+khugepaged_alloc_hugepage tight loop too in case of the allocation
+failing repeatedly, and wait_event_freezable_timeout will provide it
+too.
+
+khugepaged would still freeze just fine by trying again the next
+minute but it's better if it freezes immediately.
+
+Reported-by: Jiri Slaby <jslaby at suse.cz>
+Signed-off-by: Andrea Arcangeli <aarcange at redhat.com>
+
+diff --git a/mm/huge_memory.c b/mm/huge_memory.c
+index 4298aba..fd925d0 100644
+--- a/mm/huge_memory.c
++++ b/mm/huge_memory.c
+@@ -2259,12 +2259,9 @@ static void khugepaged_do_scan(struct page **hpage)
+ 
+ static void khugepaged_alloc_sleep(void)
+ {
+-	DEFINE_WAIT(wait);
+-	add_wait_queue(&khugepaged_wait, &wait);
+-	schedule_timeout_interruptible(
+-		msecs_to_jiffies(
+-			khugepaged_alloc_sleep_millisecs));
+-	remove_wait_queue(&khugepaged_wait, &wait);
++	wait_event_freezable_timeout(khugepaged_wait, false,
++				     msecs_to_jiffies(
++					     khugepaged_alloc_sleep_millisecs));
+ }
+ 
+ #ifndef CONFIG_NUMA
+@@ -2313,14 +2310,11 @@ static void khugepaged_loop(void)
+ 		if (unlikely(kthread_should_stop()))
+ 			break;
+ 		if (khugepaged_has_work()) {
+-			DEFINE_WAIT(wait);
+ 			if (!khugepaged_scan_sleep_millisecs)
+ 				continue;
+-			add_wait_queue(&khugepaged_wait, &wait);
+-			schedule_timeout_interruptible(
++			wait_event_freezable_timeout(khugepaged_wait, false,
+ 				msecs_to_jiffies(
+ 					khugepaged_scan_sleep_millisecs));
+-			remove_wait_queue(&khugepaged_wait, &wait);
+ 		} else if (khugepaged_enabled())
+ 			wait_event_freezable(khugepaged_wait,
+ 					     khugepaged_wait_event());
+
+  


More information about the scm-commits mailing list