From: "Zi Yan" <ziy@nvidia.com>
To: "Kairui Song" <ryncsn@gmail.com>, <kasong@tencent.com>
Cc: <linux-mm@kvack.org>, <linux-kernel@vger.kernel.org>,
"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>,
"Lance Yang" <lance.yang@linux.dev>,
"Usama Arif" <usama.arif@linux.dev>,
"Vlastimil Babka" <vbabka@kernel.org>,
"Mike Rapoport" <rppt@kernel.org>,
"Suren Baghdasaryan" <surenb@google.com>,
"Michal Hocko" <mhocko@suse.com>, "Chris Li" <chrisl@kernel.org>,
"Kemeng Shi" <shikemeng@huaweicloud.com>,
"Nhat Pham" <nphamcs@gmail.com>,
"Baoquan He" <baoquan.he@linux.dev>,
"Barry Song" <baohua@kernel.org>,
"Youngjun Park" <youngjun.park@lge.com>,
"Shivam Kalra" <shivamkalra98@zohomail.in>
Subject: Re: [PATCH v2 04/17] mm/huge_memory: split the routine for splitting anon and file folio
Date: Fri, 14 Aug 2026 22:37:50 -0400 [thread overview]
Message-ID: <DKP62VXU37II.ATZ38Y3PAIE2@nvidia.com> (raw)
In-Reply-To: <CAMgjq7DD=xZutuKuL8+zVnBAaWMO2DHi9kbvHzXaDPZ4JLqt+Q@mail.gmail.com>
On Thu Aug 13, 2026 at 2:11 PM EDT, Kairui Song wrote:
> Sashiko reports (a valid case this time):
>
> --- Patch [4]: [PATCH v2 04/17] mm/huge_memory: split the routine for
> splitting anon and file folio ---
> commit 249f031b2182770a8cf754edfb3833e148a033df
> Author: Kairui Song <kasong@tencent.com>
>
> mm/huge_memory: split the routine for splitting anon and file folio
>
> No functional change intended. Before adding more logic, split
> __folio_freeze_and_split_unmapped() into an anon and a file variant so
> each path can evolve independently. The two paths shared little beyond
> the folio freeze call, the LRU locking, and the unfreeze skeleton, but
> differed in all other per-folio bookkeeping and routines.
>
> While splitting, some cleanups become easy to apply, and helped drop a
> few now-redundant checks. Also introduce a folio iteration helper to
> avoid a common pitfall of iterating post-split sub-folios: a sub folio
> might get freed mid-iteration as pointed out by Zi [1].
>
> Link: https://lore.kernel.org/linux-mm/DKJSFCLP967N.YBR4DNK1NM2N@nvidia.com/ [1]
>
>> diff --git a/mm/huge_memory.c b/mm/huge_memory.c
>> index 7fb603ac500f6..7587eeb09e4a6 100644
>> --- a/mm/huge_memory.c
>> +++ b/mm/huge_memory.c
>
> [ ... ]
>
>> @@ -3634,6 +3634,18 @@ static bool page_range_has_hwpoisoned(struct page *page, long nr_pages)
>> return false;
>> }
>>
>> +/**
>> + * for_each_folio_safe - iterate over contiguous folios safe against folio free
>> + * @start: the first folio to iterate
>> + * @end: sentinel, folio_next() of the last folio to iterate
>> + * @sub_folio: struct folio * to use as the loop cursor
>> + * @next: struct folio * used as temporary storage
>> + */
>> +#define for_each_folio_safe(start, end, sub_folio, next) \
>> + for (sub_folio = (start), next = folio_next(sub_folio); \
>> + sub_folio != (end); \
>> + sub_folio = next, next = folio_next(next))
>
> Does this macro unconditionally dereference the sentinel pointer?
>
> When the loop increment step executes, it evaluates both sub_folio = next
> and next = folio_next(next). If next has reached the end sentinel, calling
> folio_next(next) will dereference the sentinel pointer to read its metadata.
>
> If the split large folio happens to be located at the end of a populated
> memory section, the sentinel pointer (end) could point to the next section's
> vmemmap. If that next section is unpopulated, this out-of-bounds read will
> trigger a fatal kernel page fault.
>
> ---
>
> Right, I actually hesitated on that but forgot about it midway. I
> think I'll just change back to the opencoded style, it's easier to
> understand that way.
Let's open code it. I also tried a similar macro when I was developing
folio_split(), but got convinced it buys nothing.
If the motivation comes my prior comment on code duplication, feel free
to ignore that. If we over engineer it, like different function pointers
for anon/swapcache and file, it might be doable. But that might kill
readability.
What I mean is something like:
__folio_freeze_and_split_unmapped(func_t pre_freeze_func, func_t
unfreeze_func, func_t post_freeze_func)
{
pre_freeze_func();
for () {
unfreeze_func();
}
post_freeze_func();
}
for anon/swapcache:
__folio_freeze_and_split_unmapped(anon_swapcache_pre_freeze,
anon_swapcache_unfreeze, anon_swapcache_post_freeze);
for file:
__folio_freeze_and_split_unmapped(file_pre_freeze, file_unfreeze,
file_post_freeze);
--
Best Regards,
Yan, Zi
next prev parent reply other threads:[~2026-08-15 2:38 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-12 18:48 [PATCH v2 00/17] mm/huge_memory: clean up folio split and lift swapcache split limits Kairui Song via B4 Relay
2026-08-12 18:48 ` [PATCH v2 01/17] mm/swap: fix off-by-one in swap cache replace sanity check Kairui Song via B4 Relay
2026-08-12 18:48 ` [PATCH v2 02/17] mm/huge_memory: fix rejection of swap cache folios with a mapping Kairui Song via B4 Relay
2026-08-13 16:54 ` Kairui Song
2026-08-15 2:25 ` Zi Yan
2026-08-12 18:48 ` [PATCH v2 03/17] mm/huge_memory: invert folio_ref_freeze() check to reduce indentation Kairui Song via B4 Relay
2026-08-12 18:48 ` [PATCH v2 04/17] mm/huge_memory: split the routine for splitting anon and file folio Kairui Song via B4 Relay
2026-08-13 18:11 ` Kairui Song
2026-08-15 2:37 ` Zi Yan [this message]
2026-08-12 18:48 ` [PATCH v2 05/17] mm/huge_memory: rename __split_unmapped_folio() to __split_frozen_folio() Kairui Song via B4 Relay
2026-08-15 2:38 ` Zi Yan
2026-08-12 18:48 ` [PATCH v2 06/17] mm/huge_memory: consolidate irq and locking for folio split Kairui Song via B4 Relay
2026-08-15 2:49 ` Zi Yan
2026-08-12 18:48 ` [PATCH v2 07/17] mm/huge_memory: move EOF trimming into the file split helper Kairui Song via B4 Relay
2026-08-12 18:48 ` [PATCH v2 08/17] mm/huge_memory: move unmap and remap into the split helpers Kairui Song via B4 Relay
2026-08-12 18:48 ` [PATCH v2 09/17] mm/huge_memory: move anon_vma and filemap management into " Kairui Song via B4 Relay
2026-08-12 18:48 ` [PATCH v2 10/17] mm/huge_memory: move memcg switch into the file split helper Kairui Song via B4 Relay
2026-08-12 18:48 ` [PATCH v2 11/17] mm/huge_memory: allow splitting mappingless swap cache folios Kairui Song via B4 Relay
2026-08-12 18:48 ` [PATCH v2 12/17] mm/huge_memory: add kerneldoc for the split helpers Kairui Song via B4 Relay
2026-08-12 18:48 ` [PATCH v2 13/17] mm/huge_memory: drop the unused do_lru argument of the file split helper Kairui Song via B4 Relay
2026-08-13 18:02 ` Kairui Song
2026-08-12 18:48 ` [PATCH v2 14/17] mm/huge_memory: clean up after-split folio freeing in __folio_split Kairui Song via B4 Relay
2026-08-13 17:04 ` Kairui Song
2026-08-12 18:48 ` [PATCH v2 15/17] mm/huge_memory: lift order-0 restriction for swapcache split Kairui Song via B4 Relay
2026-08-12 18:48 ` [PATCH v2 16/17] mm/huge_memory: clarify supported split orders in comment Kairui Song via B4 Relay
2026-08-12 18:48 ` [PATCH v2 17/17] mm/huge_memory: count only swap cache refs in anon folio split Kairui Song via B4 Relay
2026-08-13 19:35 ` [PATCH v2 00/17] mm/huge_memory: clean up folio split and lift swapcache split limits David Hildenbrand (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=DKP62VXU37II.ATZ38Y3PAIE2@nvidia.com \
--to=ziy@nvidia.com \
--cc=akpm@linux-foundation.org \
--cc=baohua@kernel.org \
--cc=baolin.wang@linux.alibaba.com \
--cc=baoquan.he@linux.dev \
--cc=chrisl@kernel.org \
--cc=david@kernel.org \
--cc=dev.jain@arm.com \
--cc=kasong@tencent.com \
--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=nphamcs@gmail.com \
--cc=rppt@kernel.org \
--cc=ryan.roberts@arm.com \
--cc=ryncsn@gmail.com \
--cc=shikemeng@huaweicloud.com \
--cc=shivamkalra98@zohomail.in \
--cc=surenb@google.com \
--cc=usama.arif@linux.dev \
--cc=vbabka@kernel.org \
--cc=youngjun.park@lge.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