Re: [RFC PATCH v2 2/2] mm: improve large folio reuse for LRU-cached folios

"David Hildenbrand (Arm)" <[email protected]> Mon, 3 Aug 2026 10:03:29 +0200
Newsgroups org.kvack.linux-mm,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
On 8/3/26 09:24, Barry Song wrote:
> On Wed, Jul 29, 2026 at 8:11 PM David Hildenbrand (Arm)
> <[email protected]> wrote:
>>
>> On 7/9/26 10:15, Barry Song (Xiaomi) wrote:
>>> Large folios may now reside in the per-CPU LRU cache. Before
>>> attempting to reuse them, drain the local LRU cache, which
>>> can still be beneficial in cases where the folios are likely
>>> to remain in this CPU's LRU cache:
>>>
>>> int main(int argc, char *argv[])
>>> {
>>>     int i;
>>>     while (1) {
>>>         volatile int *p = mmap(0, SIZE, PROT_READ | PROT_WRITE,
>>>                                MAP_PRIVATE | MAP_ANONYMOUS,
>>>                                -1, 0);
>>>         for (int i = 0; i < SIZE / sizeof(int); i++)
>>>             p[i] = i;
>>>         madvise((void *)p, SIZE, MADV_PAGEOUT);
>>>         if (!fork())
>>>             _exit(0);
>>>         for (int i = 0; i < SIZE / sizeof(int); i++)
>>>             p[i] = i;
>>>         munmap((void *)p, SIZE);
>>>     }
>>>     return 0;
>>> }
>>>
>>> Signed-off-by: Barry Song (Xiaomi) <[email protected]>
>>> ---
>>>  mm/memory.c | 13 +++++++++++++
>>>  1 file changed, 13 insertions(+)
>>>
>>> diff --git a/mm/memory.c b/mm/memory.c
>>> index 5689b7cff76c..1d08ed5ba99b 100644
>>> --- a/mm/memory.c
>>> +++ b/mm/memory.c
>>> @@ -4136,6 +4136,19 @@ static bool __wp_can_reuse_large_anon_folio(struct folio *folio,
>>>               folio_unlock(folio);
>>>       }
>>>
>>> +     if (folio_may_be_lru_cached(folio) && !folio_test_lru(folio)) {
>>> +             if (folio_ref_count(folio) > folio_large_mapcount(folio) + 1)
>>
>> I assume that can just be a "!=".
> 
> I was trying to guard against the case where a folio is not on
> the LRU but also does not hold an extra reference. For example,
> the folio is off the LRU, yet
> folio_ref_count(folio) == folio_large_mapcount(folio).
> 
> In that case, we could simply reuse !folio_test_lru(folio).
> 
> Maybe such a case cannot actually happen, since paths like
> isolate_folio() take an extra reference before removing the
> folio from the LRU.
> 
> So we should be ok to just use folio_ref_count(folio) !=
> folio_large_mapcount(folio) +1
I just stumbled into something nasty last week:

https://lore.kernel.org/r/20260731-check_and_migrate_movable_folios-v1-1-e0002d7b791e@kernel.org

For an mTHP, if we end up pinning multiple pages, calculating pin_refs is problematic and
might require us to batch over multiple pages.

But there are some nasty corner cases when just batching contiguous pages.

-- 
Cheers,

David