From: Nimrod Oren <noren@nvidia.com>
To: Andrew Morton <akpm@linux-foundation.org>,
David Hildenbrand <david@kernel.org>,
Lorenzo Stoakes <ljs@kernel.org>,
"Liam R. Howlett" <liam@infradead.org>,
Vlastimil Babka <vbabka@kernel.org>,
Mike Rapoport <rppt@kernel.org>,
Suren Baghdasaryan <surenb@google.com>,
Michal Hocko <mhocko@suse.com>, Jonathan Corbet <corbet@lwn.net>
Cc: Shuah Khan <skhan@linuxfoundation.org>,
Randy Dunlap <rdunlap@infradead.org>, Zi Yan <ziy@nvidia.com>,
Baolin Wang <baolin.wang@linux.alibaba.com>,
Nico Pache <nico.pache@linux.dev>,
"Ryan Roberts" <ryan.roberts@arm.com>,
Dev Jain <dev.jain@arm.com>, Barry Song <baohua@kernel.org>,
Lance Yang <lance.yang@linux.dev>,
Usama Arif <usama.arif@linux.dev>,
Kiryl Shutsemau <kas@kernel.org>,
Brendan Jackman <brendan.jackman@linux.dev>,
Johannes Weiner <hannes@cmpxchg.org>,
"David Laight" <david.laight.linux@gmail.com>,
<linux-mm@kvack.org>, <linux-doc@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, Nimrod Oren <noren@nvidia.com>
Subject: [PATCH] mm: stop recalculating min_free_kbytes once set by userspace
Date: Wed, 14 Oct 2026 17:08:59 +0300 [thread overview]
Message-ID: <20261014140859.1006967-1-noren@nvidia.com> (raw)
min_free_kbytes is recalculated on memory hotplug and on THP sysfs
writes. The new value comes from calculate_min_free_kbytes() or, while
THP is enabled, from set_recommended_min_free_kbytes(). A value written
to the vm.min_free_kbytes sysctl is replaced whenever the new value is
higher, so a lower value does not stick. This matters most when THP is
enabled on configurations with large pageblocks, where the new value
can be excessive [1].
Stop recalculating min_free_kbytes once a value has been written to the
sysctl. Systems where the sysctl is never written keep the current
behavior.
Link: https://lore.kernel.org/r/20260716173504.760369-1-noren@nvidia.com/ [1]
Suggested-by: Vlastimil Babka (SUSE) <vbabka@kernel.org>
Link: https://lore.kernel.org/r/d202dcc3-d7d7-4e98-a9a5-3137cfbfd041@kernel.org/
Signed-off-by: Nimrod Oren <noren@nvidia.com>
---
Documentation/admin-guide/sysctl/vm.rst | 7 +++++++
mm/khugepaged.c | 7 +------
mm/page_alloc.c | 6 +-----
3 files changed, 9 insertions(+), 11 deletions(-)
diff --git a/Documentation/admin-guide/sysctl/vm.rst b/Documentation/admin-guide/sysctl/vm.rst
index 5b318d17aa4b..189fc57dac5f 100644
--- a/Documentation/admin-guide/sysctl/vm.rst
+++ b/Documentation/admin-guide/sysctl/vm.rst
@@ -539,6 +539,13 @@ watermark[WMARK_MIN] value for each lowmem zone in the system.
Each lowmem zone gets a number of reserved free pages based
proportionally on its size.
+By default, the kernel sets this value based on the amount of lowmem
+and recalculates it on memory hotplug. When Transparent Hugepage (THP)
+support is enabled through global or per-size controls, the kernel may
+also raise it to help keep pageblocks free and reduce fragmentation for
+THP allocations. Once a value is written to this file, the kernel no
+longer adjusts it automatically.
+
Some minimal amount of memory is needed to satisfy PF_MEMALLOC
allocations; if you set this to lower than 1024KB, your system will
become subtly broken, and prone to deadlock under high loads.
diff --git a/mm/khugepaged.c b/mm/khugepaged.c
index dbae78b68dd8..3fd209f9377d 100644
--- a/mm/khugepaged.c
+++ b/mm/khugepaged.c
@@ -3148,13 +3148,8 @@ void set_recommended_min_free_kbytes(void)
(unsigned long) nr_free_buffer_pages() / 20);
recommended_min <<= (PAGE_SHIFT-10);
- if (recommended_min > min_free_kbytes) {
- if (user_min_free_kbytes >= 0)
- pr_info_ratelimited("raising min_free_kbytes from %d to %lu to help transparent hugepage allocations\n",
- min_free_kbytes, recommended_min);
-
+ if (user_min_free_kbytes < 0 && recommended_min > min_free_kbytes)
min_free_kbytes = recommended_min;
- }
update_wmarks:
setup_per_zone_wmarks();
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 6ed36ba4d055..57a33da2562d 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -6737,12 +6737,8 @@ void calculate_min_free_kbytes(void)
lowmem_kbytes = nr_free_buffer_pages() * (PAGE_SIZE >> 10);
new_min_free_kbytes = int_sqrt(lowmem_kbytes * 16);
- if (new_min_free_kbytes > user_min_free_kbytes)
+ if (user_min_free_kbytes < 0)
min_free_kbytes = clamp(new_min_free_kbytes, 128, 262144);
- else
- pr_warn_ratelimited("min_free_kbytes is not updated to %d because user defined value %d is preferred\n",
- new_min_free_kbytes, user_min_free_kbytes);
-
}
int __meminit init_per_zone_wmark_min(void)
--
2.45.0
next reply other threads:[~2026-10-14 14:09 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-14 14:08 Nimrod Oren [this message]
2026-10-14 20:32 ` [PATCH] mm: stop recalculating min_free_kbytes once set by userspace Johannes Weiner
2026-10-14 20:34 ` Zi Yan
2026-10-14 21:48 ` Andrew Morton
2026-10-15 16:16 ` Nimrod Oren
2026-10-16 0:38 ` Andrew Morton
2026-10-15 7:10 ` Vlastimil Babka (SUSE)
2026-10-15 9:19 ` Lorenzo Stoakes (ARM)
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=20261014140859.1006967-1-noren@nvidia.com \
--to=noren@nvidia.com \
--cc=akpm@linux-foundation.org \
--cc=baohua@kernel.org \
--cc=baolin.wang@linux.alibaba.com \
--cc=brendan.jackman@linux.dev \
--cc=corbet@lwn.net \
--cc=david.laight.linux@gmail.com \
--cc=david@kernel.org \
--cc=dev.jain@arm.com \
--cc=hannes@cmpxchg.org \
--cc=kas@kernel.org \
--cc=lance.yang@linux.dev \
--cc=liam@infradead.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=ljs@kernel.org \
--cc=mhocko@suse.com \
--cc=nico.pache@linux.dev \
--cc=rdunlap@infradead.org \
--cc=rppt@kernel.org \
--cc=ryan.roberts@arm.com \
--cc=skhan@linuxfoundation.org \
--cc=surenb@google.com \
--cc=usama.arif@linux.dev \
--cc=vbabka@kernel.org \
--cc=ziy@nvidia.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.