linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Wei Yang <richard.weiyang@gmail.com>
To: Wei Yang <richard.weiyang@gmail.com>
Cc: Zi Yan <ziy@nvidia.com>,
	akpm@linux-foundation.org, david@kernel.org,
	lorenzo.stoakes@oracle.com, baolin.wang@linux.alibaba.com,
	Liam.Howlett@oracle.com, npache@redhat.com, ryan.roberts@arm.com,
	dev.jain@arm.com, baohua@kernel.org, lance.yang@linux.dev,
	linux-mm@kvack.org
Subject: Re: [Patch v3 2/2] mm/huge_memory: merge uniform_split_supported() and non_uniform_split_supported()
Date: Fri, 14 Nov 2025 03:03:01 +0000	[thread overview]
Message-ID: <20251114030301.hkestzrk534ik7q4@master> (raw)
In-Reply-To: <20251107072944.zvqvr4kyibyofhuw@master>

On Fri, Nov 07, 2025 at 07:29:44AM +0000, Wei Yang wrote:
>On Thu, Nov 06, 2025 at 10:21:21PM -0500, Zi Yan wrote:
>>On 6 Nov 2025, at 21:49, Wei Yang wrote:
>>
>>> On Thu, Nov 06, 2025 at 09:07:22PM -0500, Zi Yan wrote:
>>>> On 6 Nov 2025, at 20:17, Wei Yang wrote:
>>>>
>>>>> On Thu, Nov 06, 2025 at 07:46:14PM -0500, Zi Yan wrote:
>>>>>> On 5 Nov 2025, at 22:41, Wei Yang wrote:
>>>>>>
>>>>>>> The functions uniform_split_supported() and
>>>>>>> non_uniform_split_supported() share significantly similar logic.
>>>>>>>
>>>>>>> The only functional difference is that uniform_split_supported()
>>>>>>> includes an additional check on the requested @new_order.
>>>>>>>
>>>>>>> The reason for this check comes from the following two aspects:
>>>>>>>
>>>>>>>   * some file system or swap cache just supports order-0 folio
>>>>>>>   * the behavioral difference between uniform/non-uniform split
>>>>>>>
>>>>>>> The behavioral difference between uniform split and non-uniform:
>>>>>>>
>>>>>>>   * uniform split splits folio directly to @new_order
>>>>>>>   * non-uniform split creates after-split folios with orders from
>>>>>>>     folio_order(folio) - 1 to new_order.
>>>>>>>
>>>>>>> This means for non-uniform split or !new_order split we should check the
>>>>>>> file system and swap cache respectively.
>>>>>>>
>>>>>>> This commit unifies the logic and merge the two functions into a single
>>>>>>> combined helper, removing redundant code and simplifying the split
>>>>>>> support checking mechanism.
>>>>>>>
>>>>>>> Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
>>>>>>> Cc: Zi Yan <ziy@nvidia.com>
>>>>>>> Cc: "David Hildenbrand (Red Hat)" <david@kernel.org>
>>>>>>>
>>>>>>> ---
>>>>>>> v3:
>>>>>>>   * adjust to use split_type
>>>>>>>   * rebase on Zi Yan fix lkml.kernel.org/r/20251105162910.752266-1-ziy@nvidia.com
>>>>>>> v2:
>>>>>>>   * remove need_check
>>>>>>>   * update comment
>>>>>>>   * add more explanation in change log
>>>>>>> ---
>>>>>>>  include/linux/huge_mm.h |  8 ++---
>>>>>>>  mm/huge_memory.c        | 71 +++++++++++++++++------------------------
>>>>>>>  2 files changed, 33 insertions(+), 46 deletions(-)
>>>>>>>
>>>>>> LGTM. Thanks. Reviewed-by: Zi Yan <ziy@nvidia.com>
>>>>>
>>>>> Hi, Zi
>>>>>
>>>>> I am thinking whether it is proper to move the check (new_order < min_order)
>>>>> from __folio_split() to folio_split_supported(). So that we could bail out
>>>>> early if file system couldn't split to new_order.
>>>>>
>>>>> Not sure you like it or not.
>>>>
>>>> It sounds reasonable. My only concern is that that might add another
>>>> indentation to the else branch in folio_split_supported().
>>>>
>>>> You can send a patch, so we can see how it looks.
>>>>
>>>
>>> Here is what come up my mind.
>>>
>>> If !CONFIG_READ_ONLY_THP_FOR_FS, we directly compare new_order and min_order.
>>>
>>> If CONFIG_READ_ONLY_THP_FOR_FS, one thing I am not sure is for the khugepaged
>>> collapsed THP. If its min_order is 0, it looks we can cover it with following
>>> check.
>>
>>1. mapping_large_folio_support() checks if mapping_max_folio_order() > 0, meaning
>>   !mapping_large_folio_support() is mapping_max_folio_order() == 0,
>>2. mapping_max_folio_order() >= mapping_min_folio_order(),
>>3. combining 1) and 2) means
>>   mapping_min_folio_order() <= mapping_max_folio_order() == 0,
>>   meaning mapping_min_folio_order() == 0.
>>
>>so a FS without large folio support always has min_order == 0.
>>
>>>
>>> Look forward your insight.
>>>
>>> diff --git a/mm/huge_memory.c b/mm/huge_memory.c
>>> index dee416b3f6ed..ef05f246df73 100644
>>> --- a/mm/huge_memory.c
>>> +++ b/mm/huge_memory.c
>>> @@ -3704,8 +3704,8 @@ bool folio_split_supported(struct folio *folio, unsigned int new_order,
>>>  		if (new_order == 1)
>>>  			return false;
>>>  	} else if (split_type == SPLIT_TYPE_NON_UNIFORM || new_order) {
>>> -		if (IS_ENABLED(CONFIG_READ_ONLY_THP_FOR_FS) &&
>>> -		    !mapping_large_folio_support(folio->mapping)) {
>>> +		unsigned int min_order = mapping_min_folio_order(folio->mapping);
>>> +		if (new_order < min_order) {
>>
>>This check is good for !CONFIG_READ_ONLY_THP_FOR_FS, but
>>for CONFIG_READ_ONLY_THP_FOR_FS and !mapping_large_folio_support(),
>>min_order is always 0, how can new_order be smaller than min_order
>>to trigger the warning below? You will need to check new_order against
>>mapping_max_folio_order().
>>
>>OK, basically the check should be:
>>
>
>Thanks for your analysis.
>
>>if (new_order < mapping_min_folio_order() || new_order > mapping_max_folio_order()).
>>
>
>This reminds me one thing, we don't check on max_order now.
>
>For example, the supported split order is [3, 5]. But new_order is set to 6.
>
>In current kernel, we don't do this. try_folio_split_or_unmap() pass
>min_order. But selftest will split from pmd_order - 1.
>
>>Then, you might want to add a helper function mapping_folio_order_supported()
>>instead and change the warning message below to "Cannot split file folio to
>>unsupported order [%d, %d]", min_order, max_order (showing min/max order
>>is optional since it kinda defeat the purpose of having the helper function).
>>Of course, the comment needs to be changed.
>>
>>Hmm, but still how could the above check to trigger the warning when
>>split_type == SPLIT_TYPE_NON_UNIFORM and new_order is 0? It will not
>>trigger, since new_order (as 0) is supported by the mapping.
>>
>>I guess the min_order check code has to be in the else branch along
>>with the existing "if (split_type == SPLIT_TYPE_NON_UNIFORM || new_order)".
>>
>
>I am trying to think another way.
>
>For uniform split, after-split folio order is new_order.
>For non-uniform split, after-split folio order is [new_order, old_order - 1].
>
>So I come up following draft change.
>
>diff --git a/mm/huge_memory.c b/mm/huge_memory.c
>index dee416b3f6ed..873680ab4cbb 100644
>--- a/mm/huge_memory.c
>+++ b/mm/huge_memory.c
>@@ -3703,28 +3703,18 @@ bool folio_split_supported(struct folio *folio, unsigned int new_order,
> 				"Cannot split to order-1 folio");
> 		if (new_order == 1)
> 			return false;
>-	} else if (split_type == SPLIT_TYPE_NON_UNIFORM || new_order) {
>-		if (IS_ENABLED(CONFIG_READ_ONLY_THP_FOR_FS) &&
>-		    !mapping_large_folio_support(folio->mapping)) {
>-			/*
>-			 * We can always split a folio down to a single page
>-			 * (new_order == 0) uniformly.
>-			 *
>-			 * For any other scenario
>-			 *   a) uniform split targeting a large folio
>-			 *      (new_order > 0)
>-			 *   b) any non-uniform split
>-			 * we must confirm that the file system supports large
>-			 * folios.
>-			 *
>-			 * Note that we might still have THPs in such
>-			 * mappings, which is created from khugepaged when
>-			 * CONFIG_READ_ONLY_THP_FOR_FS is enabled. But in that
>-			 * case, the mapping does not actually support large
>-			 * folios properly.
>-			 */
>+	} else {
>+		/*
>+		 * Some explanation here.
>+		 */
>+		if (new_order && !mapping_folio_order_supported(new_order)) {
>+			VM_WARN_ONCE(warns,
>+				"Cannot split file folio to unsupported order: %d", new_order);
>+			return false;
>+		}
>+		if (split_type == SPLIT_TYPE_NON_UNIFORM && !mapping_folio_order_supported(old_order - 1)) {
> 			VM_WARN_ONCE(warns,
>-				"Cannot split file folio to non-0 order");
>+				"Cannot split file folio to unsupported order: %d", old_order - 1);
> 			return false;
> 		}
> 	}

Hi, Zi Yan

Does it look good to you?

-- 
Wei Yang
Help you, Help me


  reply	other threads:[~2025-11-14  3:03 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-11-06  3:41 [Patch v3 0/2] mm/huge_memory: Define split_type and consolidate split support checks Wei Yang
2025-11-06  3:41 ` [Patch v3 1/2] mm/huge_memory: introduce enum split_type for clarity Wei Yang
2025-11-06 10:17   ` David Hildenbrand (Red Hat)
2025-11-06 14:57     ` Wei Yang
2025-11-07  0:44   ` Zi Yan
2025-11-06  3:41 ` [Patch v3 2/2] mm/huge_memory: merge uniform_split_supported() and non_uniform_split_supported() Wei Yang
2025-11-06 10:20   ` David Hildenbrand (Red Hat)
2025-11-07  0:46   ` Zi Yan
2025-11-07  1:17     ` Wei Yang
2025-11-07  2:07       ` Zi Yan
2025-11-07  2:49         ` Wei Yang
2025-11-07  3:21           ` Zi Yan
2025-11-07  7:29             ` Wei Yang
2025-11-14  3:03               ` Wei Yang [this message]
2025-11-17  1:22   ` Wei Yang
2025-11-17 15:56     ` Zi Yan
2025-11-18  2:10       ` Wei Yang
2025-11-18  3:33       ` Wei Yang
2025-11-18  4:10         ` Zi Yan

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=20251114030301.hkestzrk534ik7q4@master \
    --to=richard.weiyang@gmail.com \
    --cc=Liam.Howlett@oracle.com \
    --cc=akpm@linux-foundation.org \
    --cc=baohua@kernel.org \
    --cc=baolin.wang@linux.alibaba.com \
    --cc=david@kernel.org \
    --cc=dev.jain@arm.com \
    --cc=lance.yang@linux.dev \
    --cc=linux-mm@kvack.org \
    --cc=lorenzo.stoakes@oracle.com \
    --cc=npache@redhat.com \
    --cc=ryan.roberts@arm.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;
as well as URLs for NNTP newsgroup(s).