From: Ryan Roberts <ryan.roberts@arm.com>
To: Andrew Morton <akpm@linux-foundation.org>,
Hugh Dickins <hughd@google.com>, Jonathan Corbet <corbet@lwn.net>,
"Matthew Wilcox (Oracle)" <willy@infradead.org>,
David Hildenbrand <david@redhat.com>,
Barry Song <baohua@kernel.org>, Lance Yang <ioworker0@gmail.com>,
Baolin Wang <baolin.wang@linux.alibaba.com>,
Gavin Shan <gshan@redhat.com>,
Pankaj Raghav <kernel@pankajraghav.com>,
Daniel Gomez <da.gomez@samsung.com>
Cc: Ryan Roberts <ryan.roberts@arm.com>,
linux-kernel@vger.kernel.org, linux-mm@kvack.org
Subject: [RFC PATCH v1 4/4] mm: Override mTHP "file_enabled" defaults at kernel cmdline
Date: Wed, 17 Jul 2024 08:12:56 +0100 [thread overview]
Message-ID: <20240717071257.4141363-5-ryan.roberts@arm.com> (raw)
In-Reply-To: <20240717071257.4141363-1-ryan.roberts@arm.com>
Add thp_file= cmdline parameter to allow specifying the default
enablement of each supported file-backed THP size. The parameter accepts
the following format and can be provided multiple times to configure
each size:
thp_file=<size>[KMG]:<value>
See Documentation/admin-guide/mm/transhuge.rst for more details.
Configuring the defaults at boot time is often necessary because its not
always possible to drop active executable pages from the page cache,
especially if they are well used like libc. The command line parameter
allows configuring the values before the first page is installed in the
page cache.
Signed-off-by: Ryan Roberts <ryan.roberts@arm.com>
---
.../admin-guide/kernel-parameters.txt | 8 ++++
Documentation/admin-guide/mm/transhuge.rst | 13 ++++++
mm/huge_memory.c | 45 ++++++++++++++++++-
3 files changed, 65 insertions(+), 1 deletion(-)
diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index 48443ad12e3f..e3e99def5691 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -6600,6 +6600,14 @@
See Documentation/admin-guide/mm/transhuge.rst for more
details.
+ thp_file= [KNL]
+ Format: <size>[KMG]:always|always+exec|never
+ Can be used to control the default behavior of the
+ system with respect to file-backed transparent hugepages.
+ Can be used multiple times for multiple file-backed THP
+ sizes. See Documentation/admin-guide/mm/transhuge.rst
+ for more details.
+
threadirqs [KNL,EARLY]
Force threading of all interrupt handlers except those
marked explicitly IRQF_NO_THREAD.
diff --git a/Documentation/admin-guide/mm/transhuge.rst b/Documentation/admin-guide/mm/transhuge.rst
index f53d43d986e2..2379ed4ad085 100644
--- a/Documentation/admin-guide/mm/transhuge.rst
+++ b/Documentation/admin-guide/mm/transhuge.rst
@@ -333,6 +333,19 @@ required. If ``thp_anon=`` is specified at least once, any anon THP sizes
not explicitly configured on the command line are implicitly set to
``never``.
+Each supported file-backed THP size can be controlled by passing
+``thp_file=<size>[KMG]:<state>``, where ``<size>`` is the THP size and
+``<state>`` is one of ``always``, ``always+exec`` or ``never``.
+
+For example, the following will set 64K THP to ``always+exec``::
+
+ thp_file=64K:always+exec
+
+``thp_file=`` may be specified multiple times to configure all THP sizes as
+required. If ``thp_file=`` is specified at least once, any file-backed THP
+sizes not explicitly configured on the command line are implicitly set to
+``never``.
+
Hugepages in tmpfs/shmem
========================
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index 794d2790d90d..4d963dde7aea 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -83,6 +83,7 @@ unsigned long huge_anon_orders_inherit __read_mostly;
unsigned long huge_file_orders_always __read_mostly;
int huge_file_exec_order __read_mostly = -1;
static bool anon_orders_configured;
+static bool file_orders_configured;
unsigned long __thp_vma_allowable_orders(struct vm_area_struct *vma,
unsigned long vm_flags,
@@ -774,7 +775,10 @@ static int __init hugepage_init_sysfs(struct kobject **hugepage_kobj)
* (and therefore THP_ORDERS_ALL_FILE_DEFAULT) isn't a compile-time
* constant so we have to do this here.
*/
- huge_file_orders_always = THP_ORDERS_ALL_FILE_DEFAULT;
+ if (!file_orders_configured) {
+ huge_file_orders_always = THP_ORDERS_ALL_FILE_DEFAULT;
+ file_orders_configured = true;
+ }
*hugepage_kobj = kobject_create_and_add("transparent_hugepage", mm_kobj);
if (unlikely(!*hugepage_kobj)) {
@@ -1008,6 +1012,45 @@ static int __init setup_thp_anon(char *str)
}
__setup("thp_anon=", setup_thp_anon);
+static int __init setup_thp_file(char *str)
+{
+ unsigned long size;
+ char *state;
+ int order;
+ int ret = 0;
+
+ if (!str)
+ goto out;
+
+ size = (unsigned long)memparse(str, &state);
+ order = ilog2(size >> PAGE_SHIFT);
+ if (*state != ':' || !is_power_of_2(size) || size <= PAGE_SIZE ||
+ !(BIT(order) & THP_ORDERS_ALL_FILE_DEFAULT))
+ goto out;
+
+ state++;
+
+ if (!strcmp(state, "always")) {
+ set_bit(order, &huge_file_orders_always);
+ ret = 1;
+ } else if (!strcmp(state, "always+exec")) {
+ set_bit(order, &huge_file_orders_always);
+ huge_file_exec_order = order;
+ ret = 1;
+ } else if (!strcmp(state, "never")) {
+ clear_bit(order, &huge_file_orders_always);
+ ret = 1;
+ }
+
+ if (ret)
+ file_orders_configured = true;
+out:
+ if (!ret)
+ pr_warn("thp_file=%s: cannot parse, ignored\n", str);
+ return ret;
+}
+__setup("thp_file=", setup_thp_file);
+
pmd_t maybe_pmd_mkwrite(pmd_t pmd, struct vm_area_struct *vma)
{
if (likely(vma->vm_flags & VM_WRITE))
--
2.43.0
next prev parent reply other threads:[~2024-07-17 7:13 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-17 7:12 [RFC PATCH v1 0/4] Control folio sizes used for page cache memory Ryan Roberts
2024-07-17 7:12 ` [RFC PATCH v1 1/4] mm: mTHP user controls to configure pagecache large folio sizes Ryan Roberts
2024-07-17 7:12 ` [RFC PATCH v1 2/4] mm: Introduce "always+exec" for mTHP file_enabled control Ryan Roberts
2024-07-17 17:10 ` Ryan Roberts
2024-07-17 7:12 ` [RFC PATCH v1 3/4] mm: Override mTHP "enabled" defaults at kernel cmdline Ryan Roberts
2024-07-19 0:46 ` Barry Song
2024-07-19 7:47 ` Ryan Roberts
2024-07-19 7:52 ` Barry Song
2024-07-19 8:18 ` Ryan Roberts
2024-07-19 8:29 ` David Hildenbrand
2024-07-22 9:13 ` Daniel Gomez
2024-07-22 9:36 ` Ryan Roberts
2024-07-22 14:10 ` Ryan Roberts
2024-07-17 7:12 ` Ryan Roberts [this message]
2024-07-17 10:31 ` [RFC PATCH v1 0/4] Control folio sizes used for page cache memory David Hildenbrand
2024-07-17 10:45 ` Ryan Roberts
2024-07-17 14:25 ` David Hildenbrand
2024-07-22 9:35 ` Daniel Gomez
2024-07-22 9:43 ` Ryan Roberts
[not found] ` <480f34d0-a943-40da-9c69-2353fe311cf7@arm.com>
2024-09-19 8:20 ` Barry Song
2024-09-19 17:21 ` Ryan Roberts
2024-12-06 5:09 ` Barry Song
2024-12-06 5:29 ` Baolin Wang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240717071257.4141363-5-ryan.roberts@arm.com \
--to=ryan.roberts@arm.com \
--cc=akpm@linux-foundation.org \
--cc=baohua@kernel.org \
--cc=baolin.wang@linux.alibaba.com \
--cc=corbet@lwn.net \
--cc=da.gomez@samsung.com \
--cc=david@redhat.com \
--cc=gshan@redhat.com \
--cc=hughd@google.com \
--cc=ioworker0@gmail.com \
--cc=kernel@pankajraghav.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox