Re: [PATCH v3] mm: remove min_free_kbytes adjustment for THP
From: Usama Arif
Date: Wed Sep 02 2026 - 13:03:58 EST
On 02/09/2026 17:04, Johannes Weiner wrote:
> 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).
Yes, just to confirm above, unfortunately, there were too many problems
we were seeing in Meta production with 512M pageblock size for arm 64K
base page size and just had to switch to 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.