From: Johannes Weiner <hannes@cmpxchg.org>
To: Zi Yan <ziy@nvidia.com>
Cc: Nimrod Oren <noren@nvidia.com>,
Andrew Morton <akpm@linux-foundation.org>,
David Hildenbrand <david@kernel.org>,
Lorenzo Stoakes <ljs@kernel.org>,
Baolin Wang <baolin.wang@linux.alibaba.com>,
"Liam R. Howlett" <liam@infradead.org>,
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>,
Vlastimil Babka <vbabka@kernel.org>,
Mike Rapoport <rppt@kernel.org>,
Suren Baghdasaryan <surenb@google.com>,
Michal Hocko <mhocko@suse.com>,
Brendan Jackman <brendan.jackman@linux.dev>,
Hugh Dickins <hughd@google.com>, Nirmoy Das <nirmoyd@nvidia.com>,
Dragos Tatulea <dtatulea@nvidia.com>,
linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3] mm: remove min_free_kbytes adjustment for THP
Date: Wed, 2 Sep 2026 12:04:17 -0400 [thread overview]
Message-ID: <20260902160417.GN3004@cmpxchg.org> (raw)
In-Reply-To: <69C018F5-A1C8-47AD-9567-3497AA6808EC@nvidia.com>
On Tue, Sep 01, 2026 at 09:49:58PM -0400, Zi Yan wrote:
> On 1 Sep 2026, at 18:09, Johannes Weiner wrote:
>
> > On Tue, Sep 01, 2026 at 05:09:52PM -0400, Zi Yan wrote:
> >> On 1 Sep 2026, at 16:44, Johannes Weiner wrote:
> >>
> >>> On Tue, Sep 01, 2026 at 10:01:23PM +0300, Nimrod Oren wrote:
> >>>> When THP is enabled, set_recommended_min_free_kbytes() may raise
> >>>> min_free_kbytes using a heuristic that scales with pageblock_nr_pages.
> >>>> Commit f000565adb77 ("thp: set recommended min free kbytes") added this
> >>>> heuristic to help keep pageblocks free and reduce fragmentation for THP
> >>>> allocations.
> >>>
> >>> We've had problems with compaction before when min_free_kbytes was too
> >>> small on large machines. Competing free space scanners do a lot of
> >>> work only to fight over a very small set of possible target pages.
> >>>
> >>> So I'm a bit uneasy that you didn't include any benchmark numbers with
> >>> this that prove basic functionality on larger hosts isn't regressed.
> >>>
> >>>> The recommendation scales poorly with larger base page sizes. With the
> >>>> default arm64 pageblock sizes, the contribution per eligible zone
> >>>> before applying the existing cap of 5% of low memory is:
> >>>>
> >>>> 4 KiB pages: 2 MiB pageblock, 22 MiB per zone
> >>>> 16 KiB pages: 32 MiB pageblock, 352 MiB per zone
> >>>> 64 KiB pages: 512 MiB pageblock, 5.5 GiB per zone
> >>>
> >>> I question whether pageblocks need to be 512M on those machines to
> >>> begin with. After this patch, you're still asking the page allocator
> >>> to optimize grouping such that 512M pages can be allocated at
> >>> runtime. Only now you took away part of the mechanism to do so.
> >>>
> >>> If you're using 512M THPs, I would kind of assume it's on machines
> >>> with a memory size where 5.5G for defrag purposes isn't devastating.
> >>>
> >>> And if you're not, it would make more sense to lower the pageblock
> >>> size to the mTHP size you're actually using. And that would fix the
> >>> "excessive" min_free_kbytes issue as well.
> >>
> >> But lowering pageblock size requires a kernel compilation. That means
> >> maintaining two sets of kernels for different needs.
> >
> > That depends on whether anyone actually wants 512M pageblocks...
> >
> >> The ultimate solution is to enable better compaction to generate
> >> THPs bigger than a pageblock size, like Rik's super-pageblock
> >> proposal.
> >
> > ...or whether we can say, at that point, use gigablocks/cma+hugetlb.
> >
> > And then the static pageblock size for the fallback logic etc. can be
> > a smaller, saner default for everybody.
> >
> > Because the point you didn't address: it doesn't make really sense to
> > have 512M pageblocks on smaller machines, beyond the min_free_kbytes
> > issue: Fragmentation events will poison half a gig at once,
> > should_try_claim_block() becomes harder which results in less
> > conversions and more allocations falling through to stealing, page
> > isolation is more likely to fail, compaction locks and operates on
> > oversized chunks which is bad for latency and concurrency...
>
> I actually wonder why such a big pageblock would still result in a lot
> of fallbacks.
If you look at try_to_claim_block(), you need half of a block to be
free or compatible with the requested migratetype in order to convert
it. When memory is full, LRU pages are scattered all over, and
compaction is not involved (order-0), this gets more difficult the
bigger the block is. You can get into a situation where LRU reclaim
will not clear sufficient room for conversion in any given pageblock
anymore and you're stuck with the type distribution. A large share of
buddy requests then go permanently through the slower fallback path.
Usama knows more about this, but we have seen this on GB300 hosts, and
have JUST started to deploy kernels with smaller pageblocks (2M).
> Basically it indicates at some point kernel allocates a lot of
> unmovable pages that use many 512MB pageblocks and the life time of
> these unmovable pages are so diverse, leading to all these
> pageblocks remain unmovable and free pages spread across all these
> pageblocks. I thought bigger pageblocks can keep unmovable pages
> constrained within fewer pageblocks, leaving more contiguous free
> memory.
The idea is that the pageblock maintains contiguity for the largest
size you routinely expect to allocate.
The page allocator is very passive right now, and it doesn't work
super reliably. But even in the current regime, smaller blocks have a
better chance of containment.
For example, when the ever-growing page cache runs out of movable
block space, it spills into unmovable free space. When the next
unmovable request finds no space, it runs LRU reclaim - which is more
likely to free space in one of the many movable blocks. And so the
next block is poisoned. Smaller blocks have a better chance of filling
up natively, means less pressure to spill into incompatible ones.
And the higher min_free_kbytes, the more likely there are still native
options when the zones are down to the watermarks. E.g. better odds
there is still unmovable free space, you just need to reclaim some
movable/reclaimable space elsewhere to satisfy the watermarks.
I've been working on making this more robust with the huge page
allocator / defrag_mode stuff: instead of falling back and poisoning a
block, invoke reclaim/compaction to produce a neutral block that can
be converted entirely.
It's the same idea as the higher min_free_kbytes and watermark
boosting, but it is more targeted at the end result: readily available
space in compatible or convertible blocks.
But with that active regime, oversized pageblocks are even
worse. You'd pay ongoing compaction work to produce a level of
contiguity that you don't actually need.
> > Seems to me the excessive min_free_kbytes is just a symptom of a
> > deeper problem.
>
> Yes, our anti-fragmentation mechanism does not work as we expected,
> so that we need an excessive min_free_kbytes to get khugepaged working.
> I wonder why reclaim cannot get the extra free memory instead of
> reserving it via min_free_kbytes. Maybe we need a watermark boost
> when some consecutive THP allocations are seen to achieve similar
> effect of boosting min_free_kbytes?
I'm just wondering what the easiest way forward is to fix the ARM 64k
page problem.
Yes, optimally, reclaim would work to satisfy compaction space by
itself. We've seen it fail at that before, though.
How critical set_recommended_min_free_kbytes() is today is a question
that neither of us has a clear answer to. It's from 2011 and a lot has
changed. However, knowing Andrea, I'm willing to bet he added this
based on seeing a need in testing data. And I would actually expect it
to work better now with proactive compaction, since that has a better
chance of turning low-order chunks of that volume into pageblocks that
can be converted instead of needing a poisoning steal.
It's a change of long-standing behavior for everybody. It has a
regression risk and requires careful evaluation and testing.
Meanwhile, adjusting the pageblock size on 64k page arm configs has a
much smaller blast radius, appears to be the right move ANYWAY given
what pageblocks are for, and makes the min_free_kbytes a non-issue.
next prev parent reply other threads:[~2026-09-02 16:04 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-01 19:01 [PATCH v3] mm: remove min_free_kbytes adjustment for THP Nimrod Oren
2026-09-01 19:12 ` Michal Hocko
2026-09-01 20:01 ` Zi Yan
2026-09-01 20:44 ` Johannes Weiner
2026-09-01 21:09 ` Zi Yan
2026-09-01 22:09 ` Johannes Weiner
2026-09-02 1:49 ` Zi Yan
2026-09-02 13:02 ` Lorenzo Stoakes (ARM)
2026-09-02 16:04 ` Johannes Weiner [this message]
2026-09-02 16:47 ` Usama Arif
2026-09-02 17:02 ` Zi Yan
2026-09-02 17:24 ` Usama Arif
2026-09-02 17:13 ` Lorenzo Stoakes (ARM)
2026-09-03 18:58 ` Zi Yan
2026-09-04 15:20 ` Johannes Weiner
2026-09-02 12:07 ` Nirmoy Das
2026-09-02 13:46 ` Lorenzo Stoakes (ARM)
2026-09-02 16:23 ` Johannes Weiner
2026-09-02 17:00 ` Lorenzo Stoakes (ARM)
2026-09-02 18:37 ` Johannes Weiner
2026-09-03 15:46 ` Lorenzo Stoakes (ARM)
2026-09-04 15:43 ` Johannes Weiner
2026-09-04 16:46 ` Lorenzo Stoakes (ARM)
2026-09-03 12:52 ` Michal Hocko
2026-09-02 16:41 ` Usama Arif
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=20260902160417.GN3004@cmpxchg.org \
--to=hannes@cmpxchg.org \
--cc=akpm@linux-foundation.org \
--cc=baohua@kernel.org \
--cc=baolin.wang@linux.alibaba.com \
--cc=brendan.jackman@linux.dev \
--cc=david@kernel.org \
--cc=dev.jain@arm.com \
--cc=dtatulea@nvidia.com \
--cc=hughd@google.com \
--cc=kas@kernel.org \
--cc=lance.yang@linux.dev \
--cc=liam@infradead.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=nirmoyd@nvidia.com \
--cc=noren@nvidia.com \
--cc=rppt@kernel.org \
--cc=ryan.roberts@arm.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox