From: "David Hildenbrand (Arm)" <david@kernel.org>
To: kasong@tencent.com, linux-mm@kvack.org
Cc: linux-kernel@vger.kernel.org,
Andrew Morton <akpm@linux-foundation.org>,
Lorenzo Stoakes <ljs@kernel.org>, Zi Yan <ziy@nvidia.com>,
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>,
Kairui Song <ryncsn@gmail.com>
Subject: Re: [PATCH v3 04/18] mm/huge_memory: split the routine for splitting anon and file folio
Date: Thu, 27 Aug 2026 18:19:14 +0200 [thread overview]
Message-ID: <e156c931-69b4-48d6-84bf-c06df134c9da@kernel.org> (raw)
In-Reply-To: <20260821-swap-thp-cleanup-v3-4-9b43f5163238@tencent.com>
On 8/20/26 20:55, Kairui Song via B4 Relay wrote:
> From: Kairui Song <kasong@tencent.com>
>
> 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.
Splitting that up makes sense.
>
> 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]
> Signed-off-by: Kairui Song <kasong@tencent.com>
> ---
> mm/huge_memory.c | 119 +++++++++++++++++++++++++++++++++++--------------------
> 1 file changed, 75 insertions(+), 44 deletions(-)
>
> diff --git a/mm/huge_memory.c b/mm/huge_memory.c
> index 7fb603ac500f..c3fd6757c14c 100644
> --- a/mm/huge_memory.c
> +++ b/mm/huge_memory.c
> @@ -3933,11 +3933,9 @@ static unsigned int folio_cache_ref_count(const struct folio *folio)
> return folio_nr_pages(folio);
> }
>
> -static int __folio_freeze_and_split_unmapped(struct folio *folio, unsigned int new_order,
> - struct page *split_at, struct xa_state *xas,
> - struct address_space *mapping, bool do_lru,
> - struct list_head *list, enum split_type split_type,
> - pgoff_t end, int *nr_shmem_dropped)
> +static int __folio_freeze_split_unmapped_anon(struct folio *folio, unsigned int new_order,
> + struct page *split_at, bool do_lru,
> + struct list_head *list, enum split_type split_type)
Switch to double tab indentation instead while at it. Same for the other function.
> {
> struct folio *end_folio = folio_next(folio);
> struct swap_cluster_info *ci = NULL;
> @@ -3948,7 +3946,6 @@ static int __folio_freeze_and_split_unmapped(struct folio *folio, unsigned int n
> bool dequeue_deferred;
> int ret = 0;
>
> - VM_WARN_ON_ONCE(!mapping && end);
> /*
> * If this folio can be on the deferred split queue, lock out
> * the shrinker before freezing the ref. If the shrinker sees
> @@ -3956,7 +3953,7 @@ static int __folio_freeze_and_split_unmapped(struct folio *folio, unsigned int n
> * lock and must clean up the LRU state - the same dequeue we
> * will do below as part of the split.
> */
> - dequeue_deferred = folio_test_anon(folio) && old_order > 1;
> + dequeue_deferred = old_order > 1;
> if (dequeue_deferred) {
> struct mem_cgroup *memcg;
>
> @@ -3986,24 +3983,72 @@ static int __folio_freeze_and_split_unmapped(struct folio *folio, unsigned int n
> rcu_read_unlock();
> }
>
> - if (mapping) {
> + if (folio_test_swapcache(folio))
> + ci = swap_cluster_get_and_lock(folio);
> +
> + if (do_lru)
> + lruvec = folio_lruvec_lock(folio);
> +
> + ret = __split_unmapped_folio(folio, new_order, split_at, NULL,
> + NULL, split_type);
> +
> + /*
> + * Unfreeze the post-split folios and put them back to the right
Why call it "post-split" here when it's "after-split" in the other comment?
> + * place. Keep the head @folio frozen until the end: sub entries
> + * in swap cache must be updated first, so a concurrent
> + * swap_cache_get_folio() cannot return the head folio for a sub
> + * entry (folio_try_get() will fail on the head @folio until unfreeze).
> + */
> + for (new_folio = folio_next(folio); new_folio != end_folio;
> + new_folio = next) {
> + next = folio_next(new_folio);
> + zone_device_private_split_cb(folio, new_folio);
> + folio_ref_unfreeze(new_folio,
> + folio_cache_ref_count(new_folio) + 1);
> + if (do_lru)
> + lru_add_split_folio(folio, new_folio, lruvec, list);
> + if (ci)
> + __swap_cache_replace_folio(ci, folio, new_folio);
> + }
This smells like duplicate code now. That should better be factored out?
[...]
> - zone_device_private_split_cb(folio, NULL);
> /*
> * Unfreeze @folio only after all page cache entries, which
> * used to point to it, have been updated with new folios.
> @@ -4075,8 +4105,6 @@ static int __folio_freeze_and_split_unmapped(struct folio *folio, unsigned int n
>
> if (do_lru)
> lruvec_unlock(lruvec);
> - if (ci)
> - swap_cluster_unlock(ci);
>
> return ret;
> }
> @@ -4230,10 +4258,14 @@ static int __folio_split(struct folio *folio, unsigned int new_order,
> ret = -EAGAIN;
> goto fail;
> }
> + ret = __folio_freeze_split_unmapped_file(folio, new_order, split_at, &xas, mapping,
> + true, list, split_type, end,
> + &nr_shmem_dropped);
> + } else {
> + ret = __folio_freeze_split_unmapped_anon(folio, new_order, split_at, true,
> + list, split_type);
> }
I was briefly wondering whether shmem folios in the swapcache would now go
through __folio_freeze_split_unmapped_anon(). But folio_check_splittable()
rejects them.
I think we should consider changing all the "if (mapping)" checks there to
"is_anon" instead.
is_anon implies no mapping and !is_anon implies that we need a mapping.
This patch LGTM, but I think we should clean up __folio_split() further. Maybe
taht happens in the next patches in this series :)
Acked-by: David Hildenbrand (Arm) <david@kernel.org>
--
Cheers,
David
next prev parent reply other threads:[~2026-08-27 16:19 UTC|newest]
Thread overview: 99+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-20 18:55 [PATCH v3 00/18] mm/huge_memory: clean up folio split and lift swapcache split limits Kairui Song via B4 Relay
2026-08-20 18:55 ` Kairui Song
2026-08-20 18:55 ` [PATCH v3 01/18] mm/swap: fix off-by-one in swap cache replace sanity check Kairui Song via B4 Relay
2026-08-20 18:55 ` Kairui Song
2026-08-23 8:53 ` Barry Song
2026-08-27 14:13 ` Kiryl Shutsemau
2026-08-27 15:57 ` David Hildenbrand (Arm)
2026-08-20 18:55 ` [PATCH v3 02/18] mm/huge_memory: fix rejection of swap cache folios with a mapping Kairui Song via B4 Relay
2026-08-20 18:55 ` Kairui Song
2026-08-27 8:46 ` Barry Song
2026-08-27 9:31 ` Kairui Song
2026-08-27 14:33 ` Kiryl Shutsemau
2026-08-27 15:58 ` David Hildenbrand (Arm)
2026-08-27 14:36 ` Kiryl Shutsemau
2026-08-27 16:01 ` David Hildenbrand (Arm)
2026-08-27 16:00 ` David Hildenbrand (Arm)
2026-08-27 17:02 ` Kiryl Shutsemau
2026-08-27 17:11 ` David Hildenbrand (Arm)
2026-08-27 17:07 ` Kairui Song
2026-08-20 18:55 ` [PATCH v3 03/18] mm/huge_memory: invert folio_ref_freeze() check to reduce indentation Kairui Song via B4 Relay
2026-08-20 18:55 ` Kairui Song
2026-08-27 9:05 ` Barry Song
2026-08-27 14:39 ` Kiryl Shutsemau
2026-08-27 16:02 ` David Hildenbrand (Arm)
2026-08-20 18:55 ` [PATCH v3 04/18] mm/huge_memory: split the routine for splitting anon and file folio Kairui Song via B4 Relay
2026-08-20 18:55 ` Kairui Song
2026-08-26 1:31 ` Zi Yan
2026-08-27 14:58 ` Kiryl Shutsemau
2026-08-27 17:19 ` Kairui Song
2026-08-27 16:19 ` David Hildenbrand (Arm) [this message]
2026-08-27 17:17 ` Kairui Song
2026-08-27 19:05 ` David Hildenbrand (Arm)
2026-08-20 18:55 ` [PATCH v3 05/18] mm/huge_memory: rename __split_unmapped_folio() to __split_frozen_folio() Kairui Song via B4 Relay
2026-08-20 18:55 ` Kairui Song
2026-08-27 15:06 ` Kiryl Shutsemau
2026-08-27 16:22 ` David Hildenbrand (Arm)
2026-08-27 17:21 ` Kairui Song
2026-08-20 18:55 ` [PATCH v3 06/18] mm/huge_memory: consolidate irq and locking for folio split Kairui Song via B4 Relay
2026-08-20 18:55 ` Kairui Song
2026-08-27 15:15 ` Kiryl Shutsemau
2026-08-27 16:24 ` David Hildenbrand (Arm)
2026-08-20 18:55 ` [PATCH v3 07/18] mm/huge_memory: move EOF trimming into the file split helper Kairui Song via B4 Relay
2026-08-20 18:55 ` Kairui Song
2026-08-27 16:25 ` David Hildenbrand (Arm)
2026-08-31 1:08 ` Kiryl Shutsemau
2026-08-20 18:55 ` [PATCH v3 08/18] mm/huge_memory: move unmap and remap into the split helpers Kairui Song via B4 Relay
2026-08-20 18:55 ` Kairui Song
2026-08-27 16:32 ` David Hildenbrand (Arm)
2026-08-27 17:35 ` Kairui Song
2026-08-27 19:09 ` David Hildenbrand (Arm)
2026-08-20 18:55 ` [PATCH v3 09/18] mm/huge_memory: move anon_vma and filemap management into " Kairui Song via B4 Relay
2026-08-20 18:55 ` Kairui Song
2026-08-27 16:36 ` David Hildenbrand (Arm)
2026-08-27 17:37 ` Kairui Song
2026-08-30 15:23 ` Kairui Song
2026-09-07 12:36 ` David Hildenbrand (Arm)
2026-09-07 17:55 ` Kairui Song
2026-09-07 19:56 ` David Hildenbrand (Arm)
2026-08-20 18:55 ` [PATCH v3 10/18] mm/huge_memory: move memcg switch into the file split helper Kairui Song via B4 Relay
2026-08-20 18:55 ` Kairui Song
2026-08-27 16:37 ` David Hildenbrand (Arm)
2026-08-20 18:55 ` [PATCH v3 11/18] mm/huge_memory: allow splitting mappingless swap cache folios Kairui Song via B4 Relay
2026-08-20 18:55 ` Kairui Song
2026-08-26 1:55 ` Zi Yan
2026-08-27 16:41 ` David Hildenbrand (Arm)
2026-08-27 17:41 ` Kairui Song
2026-08-27 19:16 ` David Hildenbrand (Arm)
2026-08-27 19:29 ` David Hildenbrand (Arm)
2026-08-20 18:55 ` [PATCH v3 12/18] mm/huge_memory: add kerneldoc for the split helpers Kairui Song via B4 Relay
2026-08-20 18:55 ` Kairui Song
2026-08-26 1:57 ` Zi Yan
2026-08-27 16:45 ` David Hildenbrand (Arm)
2026-08-27 17:43 ` Kairui Song
2026-08-20 18:55 ` [PATCH v3 13/18] mm/huge_memory: drop the unused do_lru argument of the file split helper Kairui Song via B4 Relay
2026-08-20 18:55 ` Kairui Song
2026-08-26 1:57 ` Zi Yan
2026-08-27 16:45 ` David Hildenbrand (Arm)
2026-08-20 18:55 ` [PATCH v3 14/18] mm/huge_memory: clean up after-split folio freeing in __folio_split Kairui Song via B4 Relay
2026-08-20 18:55 ` Kairui Song
2026-08-27 16:48 ` David Hildenbrand (Arm)
2026-08-27 17:47 ` Kairui Song
2026-08-27 19:33 ` David Hildenbrand (Arm)
2026-08-20 18:55 ` [PATCH v3 15/18] mm/huge_memory: lift order-0 restriction for swapcache split Kairui Song via B4 Relay
2026-08-20 18:55 ` Kairui Song
2026-08-27 16:51 ` David Hildenbrand (Arm)
2026-08-27 17:48 ` Kairui Song
2026-08-27 20:22 ` David Hildenbrand (Arm)
2026-08-30 13:19 ` Kairui Song
2026-08-20 18:55 ` [PATCH v3 16/18] mm/huge_memory: clarify supported split orders in comment Kairui Song via B4 Relay
2026-08-20 18:55 ` Kairui Song
2026-08-26 2:02 ` Zi Yan
2026-08-27 17:48 ` Kairui Song
2026-08-27 16:54 ` David Hildenbrand (Arm)
2026-08-20 18:55 ` [PATCH v3 17/18] mm/huge_memory: count only swap cache refs in anon folio split Kairui Song via B4 Relay
2026-08-20 18:55 ` Kairui Song
2026-08-20 18:55 ` [PATCH v3 18/18] mm/huge_memory: drop the redundant mapping argument of __split_frozen_folio Kairui Song via B4 Relay
2026-08-20 18:55 ` Kairui Song
2026-08-26 2:06 ` Zi Yan
2026-08-27 12:19 ` [PATCH v3 00/18] mm/huge_memory: clean up folio split and lift swapcache split limits Yeoreum Yun
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=e156c931-69b4-48d6-84bf-c06df134c9da@kernel.org \
--to=david@kernel.org \
--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=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 \
--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.