60 lines
2.2 KiB
Diff
60 lines
2.2 KiB
Diff
|
From e2db8ce3c52c7bd37e93728d6c12a483f17634bc Mon Sep 17 00:00:00 2001
|
||
|
From: "Jan Alexander Steffens (heftig)" <jan.steffens@gmail.com>
|
||
|
Date: Mon, 27 Jan 2020 18:21:09 +0100
|
||
|
Subject: ZEN: INTERACTIVE: Enable background reclaim of hugepages
|
||
|
|
||
|
Use [defer+madvise] as default khugepaged defrag strategy:
|
||
|
|
||
|
For some reason, the default strategy to respond to THP fault fallbacks
|
||
|
is still just madvise, meaning stall if the program wants transparent
|
||
|
hugepages, but don't trigger a background reclaim / compaction if THP
|
||
|
begins to fail allocations. This creates a snowball affect where we
|
||
|
still use the THP code paths, but we almost always fail once a system
|
||
|
has been active and busy for a while.
|
||
|
|
||
|
The option "defer" was created for interactive systems where THP can
|
||
|
still improve performance. If we have to fallback to a regular page due
|
||
|
to an allocation failure or anything else, we will trigger a background
|
||
|
reclaim and compaction so future THP attempts succeed and previous
|
||
|
attempts eventually have their smaller pages combined without stalling
|
||
|
running applications.
|
||
|
|
||
|
We still want madvise to stall applications that explicitely want THP,
|
||
|
so defer+madvise _does_ make a ton of sense. Make it the default for
|
||
|
interactive systems, especially if the kernel maintainer left
|
||
|
transparent hugepages on "always".
|
||
|
|
||
|
Reasoning and details in the original patch: https://lwn.net/Articles/711248/
|
||
|
---
|
||
|
init/Kconfig | 4 ++++
|
||
|
mm/huge_memory.c | 4 ++++
|
||
|
2 files changed, 8 insertions(+)
|
||
|
|
||
|
--- a/init/Kconfig
|
||
|
+++ b/init/Kconfig
|
||
|
@@ -145,6 +145,10 @@ config ZEN_INTERACTIVE
|
||
|
Default scheduler for SQ..: mq-deadline -> bfq
|
||
|
Default scheduler for MQ..: none -> kyber
|
||
|
|
||
|
+ --- Virtual Memory Subsystem ---------------------------
|
||
|
+
|
||
|
+ Background-reclaim hugepages...: no -> yes
|
||
|
+
|
||
|
config BROKEN
|
||
|
bool
|
||
|
|
||
|
--- a/mm/huge_memory.c
|
||
|
+++ b/mm/huge_memory.c
|
||
|
@@ -64,7 +64,11 @@ unsigned long transparent_hugepage_flags
|
||
|
#ifdef CONFIG_TRANSPARENT_HUGEPAGE_MADVISE
|
||
|
(1<<TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG)|
|
||
|
#endif
|
||
|
+#ifdef CONFIG_ZEN_INTERACTIVE
|
||
|
+ (1<<TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLAG)|
|
||
|
+#else
|
||
|
(1<<TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG)|
|
||
|
+#endif
|
||
|
(1<<TRANSPARENT_HUGEPAGE_DEFRAG_KHUGEPAGED_FLAG)|
|
||
|
(1<<TRANSPARENT_HUGEPAGE_USE_ZERO_PAGE_FLAG);
|
||
|
|