mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
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

  parent reply	other threads:[~2026-08-27 16:19 UTC|newest]

Thread overview: 74+ 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 ` [PATCH v3 01/18] mm/swap: fix off-by-one in swap cache replace sanity check Kairui Song via B4 Relay
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-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-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-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-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-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-27 16:25   ` David Hildenbrand (Arm)
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-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-27 16:36   ` David Hildenbrand (Arm)
2026-08-27 17:37     ` Kairui Song
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-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-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-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-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-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-27 16:51   ` David Hildenbrand (Arm)
2026-08-27 17:48     ` Kairui Song
2026-08-27 20:22       ` David Hildenbrand (Arm)
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-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 ` [PATCH v3 18/18] mm/huge_memory: drop the redundant mapping argument of __split_frozen_folio Kairui Song via B4 Relay
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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®