linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios
@ 2024-06-04  5:47 xu.xin16
  2024-06-04  7:57 ` David Hildenbrand
  2024-06-05  9:06 ` Barry Song
  0 siblings, 2 replies; 12+ messages in thread
From: xu.xin16 @ 2024-06-04  5:47 UTC (permalink / raw)
  To: akpm, ziy
  Cc: v-songbaohua, mhocko, david, linux-mm, linux-kernel, xu.xin16,
	yang.yang29

From: Ran Xiaokai <ran.xiaokai@zte.com.cn>

When I did a large folios split test, a WARNING
"[ 5059.122759][  T166] Cannot split file folio to non-0 order"
was triggered. But my test cases are only for anonmous folios. 
while mapping_large_folio_support() is only reasonable for page
cache folios. 

In split_huge_page_to_list_to_order(), the folio passed to
mapping_large_folio_support() maybe anonmous folio. The
folio_test_anon() check is missing. So the split of the anonmous THP
is failed. This is also the same for shmem_mapping(). We'd better add
a check for both. But the shmem_mapping() in __split_huge_page() is
not involved, as for anonmous folios, the end parameter is set to -1, so
(head[i].index >= end) is always false. shmem_mapping() is not called.

Using /sys/kernel/debug/split_huge_pages to verify this, with this
patch, large anon THP is successfully split and the warning is ceased.

Signed-off-by: Ran Xiaokai <ran.xiaokai@zte.com.cn>
Cc: xu xin <xu.xin16@zte.com.cn>
Cc: Yang Yang <yang.yang29@zte.com.cn>
---
 mm/huge_memory.c | 38 ++++++++++++++++++++------------------
 1 file changed, 20 insertions(+), 18 deletions(-)

diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index 317de2afd371..4c9c7e5ea20c 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -3009,31 +3009,33 @@ int split_huge_page_to_list_to_order(struct page *page, struct list_head *list,
 	if (new_order >= folio_order(folio))
 		return -EINVAL;

-	/* Cannot split anonymous THP to order-1 */
-	if (new_order == 1 && folio_test_anon(folio)) {
-		VM_WARN_ONCE(1, "Cannot split to order-1 folio");
-		return -EINVAL;
-	}
-
 	if (new_order) {
 		/* Only swapping a whole PMD-mapped folio is supported */
 		if (folio_test_swapcache(folio))
 			return -EINVAL;
-		/* Split shmem folio to non-zero order not supported */
-		if (shmem_mapping(folio->mapping)) {
-			VM_WARN_ONCE(1,
-				"Cannot split shmem folio to non-0 order");
-			return -EINVAL;
-		}
-		/* No split if the file system does not support large folio */
-		if (!mapping_large_folio_support(folio->mapping)) {
-			VM_WARN_ONCE(1,
-				"Cannot split file folio to non-0 order");
-			return -EINVAL;
+
+		if (folio_test_anon(folio)) {
+			/* Cannot split anonymous THP to order-1 */
+			if (new_order == 1) {
+				VM_WARN_ONCE(1, "Cannot split to order-1 folio");
+				return -EINVAL;
+			}
+		} else {
+			/* Split shmem folio to non-zero order not supported */
+			if (shmem_mapping(folio->mapping)) {
+				VM_WARN_ONCE(1,
+					"Cannot split shmem folio to non-0 order");
+				return -EINVAL;
+			}
+			/* No split if the file system does not support large folio */
+			if (!mapping_large_folio_support(folio->mapping)) {
+				VM_WARN_ONCE(1,
+					"Cannot split file folio to non-0 order");
+				return -EINVAL;
+			}
 		}
 	}

-
 	is_hzp = is_huge_zero_folio(folio);
 	if (is_hzp) {
 		pr_warn_ratelimited("Called split_huge_page for huge zero page\n");
-- 
2.15.2


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios
  2024-06-04  5:47 [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios xu.xin16
@ 2024-06-04  7:57 ` David Hildenbrand
  2024-06-04 13:52   ` Zi Yan
  2024-06-05  2:20   ` ran xiaokai
  2024-06-05  9:06 ` Barry Song
  1 sibling, 2 replies; 12+ messages in thread
From: David Hildenbrand @ 2024-06-04  7:57 UTC (permalink / raw)
  To: xu.xin16, akpm, ziy
  Cc: v-songbaohua, mhocko, linux-mm, linux-kernel, yang.yang29

On 04.06.24 07:47, xu.xin16@zte.com.cn wrote:
> From: Ran Xiaokai <ran.xiaokai@zte.com.cn>
> 
> When I did a large folios split test, a WARNING
> "[ 5059.122759][  T166] Cannot split file folio to non-0 order"
> was triggered. But my test cases are only for anonmous folios.
> while mapping_large_folio_support() is only reasonable for page
> cache folios.

Agreed.

I wonder if mapping_large_folio_support() should either

a) Complain if used for anon folios, so we can detect the wrong use more 
easily. (VM_WARN_ON_ONCE())

b) Return "true" for anonymous mappings, although that's more debatable.

> 
> In split_huge_page_to_list_to_order(), the folio passed to
> mapping_large_folio_support() maybe anonmous folio. The
> folio_test_anon() check is missing. So the split of the anonmous THP
> is failed. This is also the same for shmem_mapping(). We'd better add
> a check for both. But the shmem_mapping() in __split_huge_page() is
> not involved, as for anonmous folios, the end parameter is set to -1, so
> (head[i].index >= end) is always false. shmem_mapping() is not called.
> 
> Using /sys/kernel/debug/split_huge_pages to verify this, with this
> patch, large anon THP is successfully split and the warning is ceased.
> 
> Signed-off-by: Ran Xiaokai <ran.xiaokai@zte.com.cn>
> Cc: xu xin <xu.xin16@zte.com.cn>
> Cc: Yang Yang <yang.yang29@zte.com.cn>
> ---
>   mm/huge_memory.c | 38 ++++++++++++++++++++------------------
>   1 file changed, 20 insertions(+), 18 deletions(-)
> 
> diff --git a/mm/huge_memory.c b/mm/huge_memory.c
> index 317de2afd371..4c9c7e5ea20c 100644
> --- a/mm/huge_memory.c
> +++ b/mm/huge_memory.c
> @@ -3009,31 +3009,33 @@ int split_huge_page_to_list_to_order(struct page *page, struct list_head *list,
>   	if (new_order >= folio_order(folio))
>   		return -EINVAL;
> 
> -	/* Cannot split anonymous THP to order-1 */
> -	if (new_order == 1 && folio_test_anon(folio)) {
> -		VM_WARN_ONCE(1, "Cannot split to order-1 folio");
> -		return -EINVAL;
> -	}
> -
>   	if (new_order) {
>   		/* Only swapping a whole PMD-mapped folio is supported */
>   		if (folio_test_swapcache(folio))
>   			return -EINVAL;
> -		/* Split shmem folio to non-zero order not supported */
> -		if (shmem_mapping(folio->mapping)) {
> -			VM_WARN_ONCE(1,
> -				"Cannot split shmem folio to non-0 order");
> -			return -EINVAL;
> -		}
> -		/* No split if the file system does not support large folio */
> -		if (!mapping_large_folio_support(folio->mapping)) {
> -			VM_WARN_ONCE(1,
> -				"Cannot split file folio to non-0 order");
> -			return -EINVAL;
> +
> +		if (folio_test_anon(folio)) {
> +			/* Cannot split anonymous THP to order-1 */
> +			if (new_order == 1) {
> +				VM_WARN_ONCE(1, "Cannot split to order-1 folio");
> +				return -EINVAL;
> +			}
> +		} else {
> +			/* Split shmem folio to non-zero order not supported */
> +			if (shmem_mapping(folio->mapping)) {
> +				VM_WARN_ONCE(1,
> +					"Cannot split shmem folio to non-0 order");
> +				return -EINVAL;
> +			}
> +			/* No split if the file system does not support large folio */
> +			if (!mapping_large_folio_support(folio->mapping)) {
> +				VM_WARN_ONCE(1,
> +					"Cannot split file folio to non-0 order");
> +				return -EINVAL;
> +			}
>   		}
>   	}

What about the following sequence:

if (folio_test_anon(folio)) {
	if (new_order == 1)
		...
} else if (new_order) {
	if (shmem_mapping(...))
		...
	...
}

if (folio_test_swapcache(folio) && new_order)
	return -EINVAL;

Should result in less churn and reduce indentation level.

-- 
Cheers,

David / dhildenb



^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios
  2024-06-04  7:57 ` David Hildenbrand
@ 2024-06-04 13:52   ` Zi Yan
  2024-06-04 13:57     ` Zi Yan
  2024-06-05  2:56     ` ran xiaokai
  2024-06-05  2:20   ` ran xiaokai
  1 sibling, 2 replies; 12+ messages in thread
From: Zi Yan @ 2024-06-04 13:52 UTC (permalink / raw)
  To: David Hildenbrand
  Cc: xu.xin16, akpm, v-songbaohua, mhocko, linux-mm, linux-kernel,
	yang.yang29

[-- Attachment #1: Type: text/plain, Size: 3958 bytes --]

On 4 Jun 2024, at 0:57, David Hildenbrand wrote:

> On 04.06.24 07:47, xu.xin16@zte.com.cn wrote:
>> From: Ran Xiaokai <ran.xiaokai@zte.com.cn>
>>
>> When I did a large folios split test, a WARNING
>> "[ 5059.122759][  T166] Cannot split file folio to non-0 order"
>> was triggered. But my test cases are only for anonmous folios.
>> while mapping_large_folio_support() is only reasonable for page
>> cache folios.
>
> Agreed.
>
> I wonder if mapping_large_folio_support() should either
>
> a) Complain if used for anon folios, so we can detect the wrong use more easily. (VM_WARN_ON_ONCE())

This is much better.

>
> b) Return "true" for anonymous mappings, although that's more debatable.

This might fix the warning here, but the function might get wrong uses easily.

>
>>
>> In split_huge_page_to_list_to_order(), the folio passed to
>> mapping_large_folio_support() maybe anonmous folio. The
>> folio_test_anon() check is missing. So the split of the anonmous THP
>> is failed. This is also the same for shmem_mapping(). We'd better add
>> a check for both. But the shmem_mapping() in __split_huge_page() is
>> not involved, as for anonmous folios, the end parameter is set to -1, so
>> (head[i].index >= end) is always false. shmem_mapping() is not called.
>>
>> Using /sys/kernel/debug/split_huge_pages to verify this, with this
>> patch, large anon THP is successfully split and the warning is ceased.
>>
>> Signed-off-by: Ran Xiaokai <ran.xiaokai@zte.com.cn>
>> Cc: xu xin <xu.xin16@zte.com.cn>
>> Cc: Yang Yang <yang.yang29@zte.com.cn>
>> ---
>>   mm/huge_memory.c | 38 ++++++++++++++++++++------------------
>>   1 file changed, 20 insertions(+), 18 deletions(-)
>>
>> diff --git a/mm/huge_memory.c b/mm/huge_memory.c
>> index 317de2afd371..4c9c7e5ea20c 100644
>> --- a/mm/huge_memory.c
>> +++ b/mm/huge_memory.c
>> @@ -3009,31 +3009,33 @@ int split_huge_page_to_list_to_order(struct page *page, struct list_head *list,
>>   	if (new_order >= folio_order(folio))
>>   		return -EINVAL;
>>
>> -	/* Cannot split anonymous THP to order-1 */
>> -	if (new_order == 1 && folio_test_anon(folio)) {
>> -		VM_WARN_ONCE(1, "Cannot split to order-1 folio");
>> -		return -EINVAL;
>> -	}
>> -
>>   	if (new_order) {
>>   		/* Only swapping a whole PMD-mapped folio is supported */
>>   		if (folio_test_swapcache(folio))
>>   			return -EINVAL;
>> -		/* Split shmem folio to non-zero order not supported */
>> -		if (shmem_mapping(folio->mapping)) {
>> -			VM_WARN_ONCE(1,
>> -				"Cannot split shmem folio to non-0 order");
>> -			return -EINVAL;
>> -		}
>> -		/* No split if the file system does not support large folio */
>> -		if (!mapping_large_folio_support(folio->mapping)) {
>> -			VM_WARN_ONCE(1,
>> -				"Cannot split file folio to non-0 order");
>> -			return -EINVAL;
>> +
>> +		if (folio_test_anon(folio)) {
>> +			/* Cannot split anonymous THP to order-1 */
>> +			if (new_order == 1) {
>> +				VM_WARN_ONCE(1, "Cannot split to order-1 folio");
>> +				return -EINVAL;
>> +			}
>> +		} else {
>> +			/* Split shmem folio to non-zero order not supported */
>> +			if (shmem_mapping(folio->mapping)) {
>> +				VM_WARN_ONCE(1,
>> +					"Cannot split shmem folio to non-0 order");
>> +				return -EINVAL;
>> +			}
>> +			/* No split if the file system does not support large folio */
>> +			if (!mapping_large_folio_support(folio->mapping)) {
>> +				VM_WARN_ONCE(1,
>> +					"Cannot split file folio to non-0 order");
>> +				return -EINVAL;
>> +			}
>>   		}
>>   	}
>
> What about the following sequence:
>
> if (folio_test_anon(folio)) {
> 	if (new_order == 1)
> 		...
> } else if (new_order) {
> 	if (shmem_mapping(...))
> 		...
> 	...
> }
>
> if (folio_test_swapcache(folio) && new_order)
> 	return -EINVAL;
>
> Should result in less churn and reduce indentation level.

Yeah, this looks better to me.

Best Regards,
Yan, Zi

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 854 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios
  2024-06-04 13:52   ` Zi Yan
@ 2024-06-04 13:57     ` Zi Yan
  2024-06-05  2:56     ` ran xiaokai
  1 sibling, 0 replies; 12+ messages in thread
From: Zi Yan @ 2024-06-04 13:57 UTC (permalink / raw)
  To: Luis Chamberlain, Pankaj Raghav (Samsung)
  Cc: xu.xin16, akpm, v-songbaohua, mhocko, linux-mm, linux-kernel,
	yang.yang29, David Hildenbrand

[-- Attachment #1: Type: text/plain, Size: 4259 bytes --]

+Luis and Pankaj, who are working on enable bs > ps in XFS and touch split_huge_page_to_list_to_order().


On 4 Jun 2024, at 6:52, Zi Yan wrote:

> On 4 Jun 2024, at 0:57, David Hildenbrand wrote:
>
>> On 04.06.24 07:47, xu.xin16@zte.com.cn wrote:
>>> From: Ran Xiaokai <ran.xiaokai@zte.com.cn>
>>>
>>> When I did a large folios split test, a WARNING
>>> "[ 5059.122759][  T166] Cannot split file folio to non-0 order"
>>> was triggered. But my test cases are only for anonmous folios.
>>> while mapping_large_folio_support() is only reasonable for page
>>> cache folios.
>>
>> Agreed.
>>
>> I wonder if mapping_large_folio_support() should either
>>
>> a) Complain if used for anon folios, so we can detect the wrong use more easily. (VM_WARN_ON_ONCE())
>
> This is much better.
>
>>
>> b) Return "true" for anonymous mappings, although that's more debatable.
>
> This might fix the warning here, but the function might get wrong uses easily.
>
>>
>>>
>>> In split_huge_page_to_list_to_order(), the folio passed to
>>> mapping_large_folio_support() maybe anonmous folio. The
>>> folio_test_anon() check is missing. So the split of the anonmous THP
>>> is failed. This is also the same for shmem_mapping(). We'd better add
>>> a check for both. But the shmem_mapping() in __split_huge_page() is
>>> not involved, as for anonmous folios, the end parameter is set to -1, so
>>> (head[i].index >= end) is always false. shmem_mapping() is not called.
>>>
>>> Using /sys/kernel/debug/split_huge_pages to verify this, with this
>>> patch, large anon THP is successfully split and the warning is ceased.
>>>
>>> Signed-off-by: Ran Xiaokai <ran.xiaokai@zte.com.cn>
>>> Cc: xu xin <xu.xin16@zte.com.cn>
>>> Cc: Yang Yang <yang.yang29@zte.com.cn>
>>> ---
>>>   mm/huge_memory.c | 38 ++++++++++++++++++++------------------
>>>   1 file changed, 20 insertions(+), 18 deletions(-)
>>>
>>> diff --git a/mm/huge_memory.c b/mm/huge_memory.c
>>> index 317de2afd371..4c9c7e5ea20c 100644
>>> --- a/mm/huge_memory.c
>>> +++ b/mm/huge_memory.c
>>> @@ -3009,31 +3009,33 @@ int split_huge_page_to_list_to_order(struct page *page, struct list_head *list,
>>>   	if (new_order >= folio_order(folio))
>>>   		return -EINVAL;
>>>
>>> -	/* Cannot split anonymous THP to order-1 */
>>> -	if (new_order == 1 && folio_test_anon(folio)) {
>>> -		VM_WARN_ONCE(1, "Cannot split to order-1 folio");
>>> -		return -EINVAL;
>>> -	}
>>> -
>>>   	if (new_order) {
>>>   		/* Only swapping a whole PMD-mapped folio is supported */
>>>   		if (folio_test_swapcache(folio))
>>>   			return -EINVAL;
>>> -		/* Split shmem folio to non-zero order not supported */
>>> -		if (shmem_mapping(folio->mapping)) {
>>> -			VM_WARN_ONCE(1,
>>> -				"Cannot split shmem folio to non-0 order");
>>> -			return -EINVAL;
>>> -		}
>>> -		/* No split if the file system does not support large folio */
>>> -		if (!mapping_large_folio_support(folio->mapping)) {
>>> -			VM_WARN_ONCE(1,
>>> -				"Cannot split file folio to non-0 order");
>>> -			return -EINVAL;
>>> +
>>> +		if (folio_test_anon(folio)) {
>>> +			/* Cannot split anonymous THP to order-1 */
>>> +			if (new_order == 1) {
>>> +				VM_WARN_ONCE(1, "Cannot split to order-1 folio");
>>> +				return -EINVAL;
>>> +			}
>>> +		} else {
>>> +			/* Split shmem folio to non-zero order not supported */
>>> +			if (shmem_mapping(folio->mapping)) {
>>> +				VM_WARN_ONCE(1,
>>> +					"Cannot split shmem folio to non-0 order");
>>> +				return -EINVAL;
>>> +			}
>>> +			/* No split if the file system does not support large folio */
>>> +			if (!mapping_large_folio_support(folio->mapping)) {
>>> +				VM_WARN_ONCE(1,
>>> +					"Cannot split file folio to non-0 order");
>>> +				return -EINVAL;
>>> +			}
>>>   		}
>>>   	}
>>
>> What about the following sequence:
>>
>> if (folio_test_anon(folio)) {
>> 	if (new_order == 1)
>> 		...
>> } else if (new_order) {
>> 	if (shmem_mapping(...))
>> 		...
>> 	...
>> }
>>
>> if (folio_test_swapcache(folio) && new_order)
>> 	return -EINVAL;
>>
>> Should result in less churn and reduce indentation level.
>
> Yeah, this looks better to me.
>
> Best Regards,
> Yan, Zi


Best Regards,
Yan, Zi

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 854 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios
  2024-06-04  7:57 ` David Hildenbrand
  2024-06-04 13:52   ` Zi Yan
@ 2024-06-05  2:20   ` ran xiaokai
  2024-06-05  7:25     ` David Hildenbrand
  1 sibling, 1 reply; 12+ messages in thread
From: ran xiaokai @ 2024-06-05  2:20 UTC (permalink / raw)
  To: david
  Cc: akpm, linux-kernel, linux-mm, mhocko, v-songbaohua, ran.xiaokai,
	xu.xin16, yang.yang29, ziy

> On 04.06.24 07:47, xu.xin16@zte.com.cn wrote:
> > From: Ran Xiaokai <ran.xiaokai@zte.com.cn>
> > 
> > When I did a large folios split test, a WARNING
> > "[ 5059.122759][  T166] Cannot split file folio to non-0 order"
> > was triggered. But my test cases are only for anonmous folios.
> > while mapping_large_folio_support() is only reasonable for page
> > cache folios.
> 
> Agreed.
> 
> I wonder if mapping_large_folio_support() should either
> 
> a) Complain if used for anon folios, so we can detect the wrong use more 
> easily. (VM_WARN_ON_ONCE())

> b) Return "true" for anonymous mappings, although that's more debatable.
> 

Hi, David,
Thanks for the review.
I think a) is better. 
But we have to add a new parameter "folio" to mapping_large_folio_support(), right ?
something like mapping_large_folio_support(struct address_space *mapping, struct folio *folio) ?
But in the __filemap_get_folio() path, 

__filemap_get_folio()
  no_page:
    ....
    if (!mapping_large_folio_support(mapping))

the folio is not allocated yet, yes ?
Or do you mean there is some other way to do this ? 

> > 
> > In split_huge_page_to_list_to_order(), the folio passed to
> > mapping_large_folio_support() maybe anonmous folio. The
> > folio_test_anon() check is missing. So the split of the anonmous THP
> > is failed. This is also the same for shmem_mapping(). We'd better add
> > a check for both. But the shmem_mapping() in __split_huge_page() is
> > not involved, as for anonmous folios, the end parameter is set to -1, so
> > (head[i].index >= end) is always false. shmem_mapping() is not called.
> > 
> > Using /sys/kernel/debug/split_huge_pages to verify this, with this
> > patch, large anon THP is successfully split and the warning is ceased.
> > 
> > Signed-off-by: Ran Xiaokai <ran.xiaokai@zte.com.cn>
> > Cc: xu xin <xu.xin16@zte.com.cn>
> > Cc: Yang Yang <yang.yang29@zte.com.cn>
> > ---
> >   mm/huge_memory.c | 38 ++++++++++++++++++++------------------
> >   1 file changed, 20 insertions(+), 18 deletions(-)
> > 
> > diff --git a/mm/huge_memory.c b/mm/huge_memory.c
> > index 317de2afd371..4c9c7e5ea20c 100644
> > --- a/mm/huge_memory.c
> > +++ b/mm/huge_memory.c
> > @@ -3009,31 +3009,33 @@ int split_huge_page_to_list_to_order(struct page *page, struct list_head *list,
> >   	if (new_order >= folio_order(folio))
> >   		return -EINVAL;
> > 
> > -	/* Cannot split anonymous THP to order-1 */
> > -	if (new_order == 1 && folio_test_anon(folio)) {
> > -		VM_WARN_ONCE(1, "Cannot split to order-1 folio");
> > -		return -EINVAL;
> > -	}
> > -
> >   	if (new_order) {
> >   		/* Only swapping a whole PMD-mapped folio is supported */
> >   		if (folio_test_swapcache(folio))
> >   			return -EINVAL;
> > -		/* Split shmem folio to non-zero order not supported */
> > -		if (shmem_mapping(folio->mapping)) {
> > -			VM_WARN_ONCE(1,
> > -				"Cannot split shmem folio to non-0 order");
> > -			return -EINVAL;
> > -		}
> > -		/* No split if the file system does not support large folio */
> > -		if (!mapping_large_folio_support(folio->mapping)) {
> > -			VM_WARN_ONCE(1,
> > -				"Cannot split file folio to non-0 order");
> > -			return -EINVAL;
> > +
> > +		if (folio_test_anon(folio)) {
> > +			/* Cannot split anonymous THP to order-1 */
> > +			if (new_order == 1) {
> > +				VM_WARN_ONCE(1, "Cannot split to order-1 folio");
> > +				return -EINVAL;
> > +			}
> > +		} else {
> > +			/* Split shmem folio to non-zero order not supported */
> > +			if (shmem_mapping(folio->mapping)) {
> > +				VM_WARN_ONCE(1,
> > +					"Cannot split shmem folio to non-0 order");
> > +				return -EINVAL;
> > +			}
> > +			/* No split if the file system does not support large folio */
> > +			if (!mapping_large_folio_support(folio->mapping)) {
> > +				VM_WARN_ONCE(1,
> > +					"Cannot split file folio to non-0 order");
> > +				return -EINVAL;
> > +			}
> >   		}
> >   	}
> 
> What about the following sequence:
> 
> if (folio_test_anon(folio)) {
> 	if (new_order == 1)
> 		...
> } else if (new_order) {
> 	if (shmem_mapping(...))
> 		...
> 	...
> }
> 
> if (folio_test_swapcache(folio) && new_order)
> 	return -EINVAL;
> 
> Should result in less churn and reduce indentation level.
>

Thanks.
The code is cleaner in this way.
 
> -- 
> Cheers,
> 
> David / dhildenb



^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios
  2024-06-04 13:52   ` Zi Yan
  2024-06-04 13:57     ` Zi Yan
@ 2024-06-05  2:56     ` ran xiaokai
  1 sibling, 0 replies; 12+ messages in thread
From: ran xiaokai @ 2024-06-05  2:56 UTC (permalink / raw)
  To: ziy
  Cc: akpm, david, linux-kernel, linux-mm, mhocko, ran.xiaokai,
	v-songbaohua, xu.xin16, yang.yang29

> On 4 Jun 2024, at 0:57, David Hildenbrand wrote:
> 
> > On 04.06.24 07:47, xu.xin16@zte.com.cn wrote:
> >> From: Ran Xiaokai <ran.xiaokai@zte.com.cn>
> >>
> >> When I did a large folios split test, a WARNING
> >> "[ 5059.122759][  T166] Cannot split file folio to non-0 order"
> >> was triggered. But my test cases are only for anonmous folios.
> >> while mapping_large_folio_support() is only reasonable for page
> >> cache folios.
> >
> > Agreed.
> >
> > I wonder if mapping_large_folio_support() should either
> >
> > a) Complain if used for anon folios, so we can detect the wrong use more easily. (VM_WARN_ON_ONCE())
> 
> This is much better.
> 
> >
> > b) Return "true" for anonymous mappings, although that's more debatable.
> 
> This might fix the warning here, but the function might get wrong uses easily.

yes, maybe we should rename mapping_large_folio_support() if we choose b).
 
> >
> >>
> >> In split_huge_page_to_list_to_order(), the folio passed to
> >> mapping_large_folio_support() maybe anonmous folio. The
> >> folio_test_anon() check is missing. So the split of the anonmous THP
> >> is failed. This is also the same for shmem_mapping(). We'd better add
> >> a check for both. But the shmem_mapping() in __split_huge_page() is
> >> not involved, as for anonmous folios, the end parameter is set to -1, so
> >> (head[i].index >= end) is always false. shmem_mapping() is not called.
> >>
> >> Using /sys/kernel/debug/split_huge_pages to verify this, with this
> >> patch, large anon THP is successfully split and the warning is ceased.
> >>
> >> Signed-off-by: Ran Xiaokai <ran.xiaokai@zte.com.cn>
> >> Cc: xu xin <xu.xin16@zte.com.cn>
> >> Cc: Yang Yang <yang.yang29@zte.com.cn>
> >> ---
> >>   mm/huge_memory.c | 38 ++++++++++++++++++++------------------
> >>   1 file changed, 20 insertions(+), 18 deletions(-)
> >>
> >> diff --git a/mm/huge_memory.c b/mm/huge_memory.c
> >> index 317de2afd371..4c9c7e5ea20c 100644
> >> --- a/mm/huge_memory.c
> >> +++ b/mm/huge_memory.c
> >> @@ -3009,31 +3009,33 @@ int split_huge_page_to_list_to_order(struct page *page, struct list_head *list,
> >>   	if (new_order >= folio_order(folio))
> >>   		return -EINVAL;
> >>
> >> -	/* Cannot split anonymous THP to order-1 */
> >> -	if (new_order == 1 && folio_test_anon(folio)) {
> >> -		VM_WARN_ONCE(1, "Cannot split to order-1 folio");
> >> -		return -EINVAL;
> >> -	}
> >> -
> >>   	if (new_order) {
> >>   		/* Only swapping a whole PMD-mapped folio is supported */
> >>   		if (folio_test_swapcache(folio))
> >>   			return -EINVAL;
> >> -		/* Split shmem folio to non-zero order not supported */
> >> -		if (shmem_mapping(folio->mapping)) {
> >> -			VM_WARN_ONCE(1,
> >> -				"Cannot split shmem folio to non-0 order");
> >> -			return -EINVAL;
> >> -		}
> >> -		/* No split if the file system does not support large folio */
> >> -		if (!mapping_large_folio_support(folio->mapping)) {
> >> -			VM_WARN_ONCE(1,
> >> -				"Cannot split file folio to non-0 order");
> >> -			return -EINVAL;
> >> +
> >> +		if (folio_test_anon(folio)) {
> >> +			/* Cannot split anonymous THP to order-1 */
> >> +			if (new_order == 1) {
> >> +				VM_WARN_ONCE(1, "Cannot split to order-1 folio");
> >> +				return -EINVAL;
> >> +			}
> >> +		} else {
> >> +			/* Split shmem folio to non-zero order not supported */
> >> +			if (shmem_mapping(folio->mapping)) {
> >> +				VM_WARN_ONCE(1,
> >> +					"Cannot split shmem folio to non-0 order");
> >> +				return -EINVAL;
> >> +			}
> >> +			/* No split if the file system does not support large folio */
> >> +			if (!mapping_large_folio_support(folio->mapping)) {
> >> +				VM_WARN_ONCE(1,
> >> +					"Cannot split file folio to non-0 order");
> >> +				return -EINVAL;
> >> +			}
> >>   		}
> >>   	}
> >
> > What about the following sequence:
> >
> > if (folio_test_anon(folio)) {
> > 	if (new_order == 1)
> > 		...
> > } else if (new_order) {
> > 	if (shmem_mapping(...))
> > 		...
> > 	...
> > }
> >
> > if (folio_test_swapcache(folio) && new_order)
> > 	return -EINVAL;
> >
> > Should result in less churn and reduce indentation level.
> 
> Yeah, this looks better to me.
> 
> Best Regards,
> Yan, Zi



^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios
  2024-06-05  2:20   ` ran xiaokai
@ 2024-06-05  7:25     ` David Hildenbrand
  2024-06-05  8:30       ` ran xiaokai
  0 siblings, 1 reply; 12+ messages in thread
From: David Hildenbrand @ 2024-06-05  7:25 UTC (permalink / raw)
  To: ran xiaokai
  Cc: akpm, linux-kernel, linux-mm, mhocko, v-songbaohua, ran.xiaokai,
	xu.xin16, yang.yang29, ziy

On 05.06.24 04:20, ran xiaokai wrote:
>> On 04.06.24 07:47, xu.xin16@zte.com.cn wrote:
>>> From: Ran Xiaokai <ran.xiaokai@zte.com.cn>
>>>
>>> When I did a large folios split test, a WARNING
>>> "[ 5059.122759][  T166] Cannot split file folio to non-0 order"
>>> was triggered. But my test cases are only for anonmous folios.
>>> while mapping_large_folio_support() is only reasonable for page
>>> cache folios.
>>
>> Agreed.
>>
>> I wonder if mapping_large_folio_support() should either
>>
>> a) Complain if used for anon folios, so we can detect the wrong use more
>> easily. (VM_WARN_ON_ONCE())
> 
>> b) Return "true" for anonymous mappings, although that's more debatable.
>>
> 
> Hi, David,
> Thanks for the review.
> I think a) is better.
> But we have to add a new parameter "folio" to mapping_large_folio_support(), right ?
> something like mapping_large_folio_support(struct address_space *mapping, struct folio *folio) ?
> But in the __filemap_get_folio() path,
> 
> __filemap_get_folio()
>    no_page:
>      ....
>      if (!mapping_large_folio_support(mapping))
> 
> the folio is not allocated yet, yes ?
> Or do you mean there is some other way to do this ?

If we really pass unmodified folio->mapping, you can do what 
folio_test_anon() would and make sure PAGE_MAPPING_ANON is not set.

-- 
Cheers,

David / dhildenb



^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios
  2024-06-05  7:25     ` David Hildenbrand
@ 2024-06-05  8:30       ` ran xiaokai
  2024-06-05  8:33         ` David Hildenbrand
  0 siblings, 1 reply; 12+ messages in thread
From: ran xiaokai @ 2024-06-05  8:30 UTC (permalink / raw)
  To: david
  Cc: akpm, linux-kernel, linux-mm, mhocko, ran.xiaokai, ranxiaokai627,
	v-songbaohua, xu.xin16, yang.yang29, ziy

> On 05.06.24 04:20, ran xiaokai wrote:
> >> On 04.06.24 07:47, xu.xin16@zte.com.cn wrote:
> >>> From: Ran Xiaokai <ran.xiaokai@zte.com.cn>
> >>>
> >>> When I did a large folios split test, a WARNING
> >>> "[ 5059.122759][  T166] Cannot split file folio to non-0 order"
> >>> was triggered. But my test cases are only for anonmous folios.
> >>> while mapping_large_folio_support() is only reasonable for page
> >>> cache folios.
> >>
> >> Agreed.
> >>
> >> I wonder if mapping_large_folio_support() should either
> >>
> >> a) Complain if used for anon folios, so we can detect the wrong use more
> >> easily. (VM_WARN_ON_ONCE())
> > 
> >> b) Return "true" for anonymous mappings, although that's more debatable.
> >>
> > 
> > Hi, David,
> > Thanks for the review.
> > I think a) is better.
> > But we have to add a new parameter "folio" to mapping_large_folio_support(), right ?
> > something like mapping_large_folio_support(struct address_space *mapping, struct folio *folio) ?
> > But in the __filemap_get_folio() path,
> > 
> > __filemap_get_folio()
> >    no_page:
> >      ....
> >      if (!mapping_large_folio_support(mapping))
> > 
> > the folio is not allocated yet, yes ?
> > Or do you mean there is some other way to do this ?
> 
> If we really pass unmodified folio->mapping, you can do what 
> folio_test_anon() would and make sure PAGE_MAPPING_ANON is not set.

I think I just misunderstood your suggestion.
How about this ?

static inline bool mapping_large_folio_support(struct address_space *mapping)
{
	VM_WARN_ONCE((unsigned long)mapping & PAGE_MAPPING_ANON, 
			"Anonymous mapping always supports large folio");

	return IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) &&
		test_bit(AS_LARGE_FOLIO_SUPPORT, &mapping->flags);
}



^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios
  2024-06-05  8:30       ` ran xiaokai
@ 2024-06-05  8:33         ` David Hildenbrand
  0 siblings, 0 replies; 12+ messages in thread
From: David Hildenbrand @ 2024-06-05  8:33 UTC (permalink / raw)
  To: ran xiaokai
  Cc: akpm, linux-kernel, linux-mm, mhocko, ran.xiaokai, v-songbaohua,
	xu.xin16, yang.yang29, ziy

On 05.06.24 10:30, ran xiaokai wrote:
>> On 05.06.24 04:20, ran xiaokai wrote:
>>>> On 04.06.24 07:47, xu.xin16@zte.com.cn wrote:
>>>>> From: Ran Xiaokai <ran.xiaokai@zte.com.cn>
>>>>>
>>>>> When I did a large folios split test, a WARNING
>>>>> "[ 5059.122759][  T166] Cannot split file folio to non-0 order"
>>>>> was triggered. But my test cases are only for anonmous folios.
>>>>> while mapping_large_folio_support() is only reasonable for page
>>>>> cache folios.
>>>>
>>>> Agreed.
>>>>
>>>> I wonder if mapping_large_folio_support() should either
>>>>
>>>> a) Complain if used for anon folios, so we can detect the wrong use more
>>>> easily. (VM_WARN_ON_ONCE())
>>>
>>>> b) Return "true" for anonymous mappings, although that's more debatable.
>>>>
>>>
>>> Hi, David,
>>> Thanks for the review.
>>> I think a) is better.
>>> But we have to add a new parameter "folio" to mapping_large_folio_support(), right ?
>>> something like mapping_large_folio_support(struct address_space *mapping, struct folio *folio) ?
>>> But in the __filemap_get_folio() path,
>>>
>>> __filemap_get_folio()
>>>     no_page:
>>>       ....
>>>       if (!mapping_large_folio_support(mapping))
>>>
>>> the folio is not allocated yet, yes ?
>>> Or do you mean there is some other way to do this ?
>>
>> If we really pass unmodified folio->mapping, you can do what
>> folio_test_anon() would and make sure PAGE_MAPPING_ANON is not set.
> 
> I think I just misunderstood your suggestion.

Likely my use of "folio" was confusing.

> How about this ?
> 
> static inline bool mapping_large_folio_support(struct address_space *mapping)
> {
> 	VM_WARN_ONCE((unsigned long)mapping & PAGE_MAPPING_ANON,
> 			"Anonymous mapping always supports large folio");
> 
> 	return IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) &&
> 		test_bit(AS_LARGE_FOLIO_SUPPORT, &mapping->flags);
> }

Yes, and we should likely document that this is not supposed to be used 
with mappings from anonymous folios.

-- 
Cheers,

David / dhildenb



^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios
  2024-06-04  5:47 [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios xu.xin16
  2024-06-04  7:57 ` David Hildenbrand
@ 2024-06-05  9:06 ` Barry Song
       [not found]   ` <20240605095406.891512-1-ranxiaokai627@163.com>
  1 sibling, 1 reply; 12+ messages in thread
From: Barry Song @ 2024-06-05  9:06 UTC (permalink / raw)
  To: xu.xin16
  Cc: akpm, ziy, v-songbaohua, mhocko, david, linux-mm, linux-kernel,
	yang.yang29

On Tue, Jun 4, 2024 at 5:47 PM <xu.xin16@zte.com.cn> wrote:
>
> From: Ran Xiaokai <ran.xiaokai@zte.com.cn>
>
> When I did a large folios split test, a WARNING
> "[ 5059.122759][  T166] Cannot split file folio to non-0 order"
> was triggered. But my test cases are only for anonmous folios.
> while mapping_large_folio_support() is only reasonable for page
> cache folios.
>
> In split_huge_page_to_list_to_order(), the folio passed to
> mapping_large_folio_support() maybe anonmous folio. The
> folio_test_anon() check is missing. So the split of the anonmous THP
> is failed. This is also the same for shmem_mapping(). We'd better add
> a check for both. But the shmem_mapping() in __split_huge_page() is
> not involved, as for anonmous folios, the end parameter is set to -1, so
> (head[i].index >= end) is always false. shmem_mapping() is not called.
>
> Using /sys/kernel/debug/split_huge_pages to verify this, with this
> patch, large anon THP is successfully split and the warning is ceased.
>
> Signed-off-by: Ran Xiaokai <ran.xiaokai@zte.com.cn>
> Cc: xu xin <xu.xin16@zte.com.cn>
> Cc: Yang Yang <yang.yang29@zte.com.cn>
> ---
>  mm/huge_memory.c | 38 ++++++++++++++++++++------------------
>  1 file changed, 20 insertions(+), 18 deletions(-)
>
> diff --git a/mm/huge_memory.c b/mm/huge_memory.c
> index 317de2afd371..4c9c7e5ea20c 100644
> --- a/mm/huge_memory.c
> +++ b/mm/huge_memory.c
> @@ -3009,31 +3009,33 @@ int split_huge_page_to_list_to_order(struct page *page, struct list_head *list,
>         if (new_order >= folio_order(folio))
>                 return -EINVAL;
>
> -       /* Cannot split anonymous THP to order-1 */
> -       if (new_order == 1 && folio_test_anon(folio)) {
> -               VM_WARN_ONCE(1, "Cannot split to order-1 folio");
> -               return -EINVAL;
> -       }
> -
>         if (new_order) {
>                 /* Only swapping a whole PMD-mapped folio is supported */
>                 if (folio_test_swapcache(folio))
>                         return -EINVAL;
> -               /* Split shmem folio to non-zero order not supported */
> -               if (shmem_mapping(folio->mapping)) {
> -                       VM_WARN_ONCE(1,
> -                               "Cannot split shmem folio to non-0 order");
> -                       return -EINVAL;
> -               }
> -               /* No split if the file system does not support large folio */
> -               if (!mapping_large_folio_support(folio->mapping)) {
> -                       VM_WARN_ONCE(1,
> -                               "Cannot split file folio to non-0 order");
> -                       return -EINVAL;
> +
> +               if (folio_test_anon(folio)) {
> +                       /* Cannot split anonymous THP to order-1 */
> +                       if (new_order == 1) {
> +                               VM_WARN_ONCE(1, "Cannot split to order-1 folio");
> +                               return -EINVAL;
> +                       }
> +               } else {
> +                       /* Split shmem folio to non-zero order not supported */
> +                       if (shmem_mapping(folio->mapping)) {
> +                               VM_WARN_ONCE(1,
> +                                       "Cannot split shmem folio to non-0 order");
> +                               return -EINVAL;
> +                       }
> +                       /* No split if the file system does not support large folio */
> +                       if (!mapping_large_folio_support(folio->mapping)) {
> +                               VM_WARN_ONCE(1,
> +                                       "Cannot split file folio to non-0 order");
> +                               return -EINVAL;
> +                       }

Am I missing something? if file system doesn't support large folio,
how could the large folio start to exist from the first place while its
mapping points to a file which doesn't support large folio?

>                 }
>         }
>
> -
>         is_hzp = is_huge_zero_folio(folio);
>         if (is_hzp) {
>                 pr_warn_ratelimited("Called split_huge_page for huge zero page\n");
> --
> 2.15.2
>

Thanks
Barry


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios
       [not found]   ` <20240605095406.891512-1-ranxiaokai627@163.com>
@ 2024-06-05 14:08     ` Zi Yan
       [not found]       ` <c110eb46-3c9d-40c3-ab16-5bd9f75b6501@redhat.com>
  0 siblings, 1 reply; 12+ messages in thread
From: Zi Yan @ 2024-06-05 14:08 UTC (permalink / raw)
  To: ran xiaokai
  Cc: 21cnbao, akpm, david, linux-kernel, linux-mm, mhocko,
	v-songbaohua, xu.xin16, yang.yang29

[-- Attachment #1: Type: text/plain, Size: 4458 bytes --]

On 5 Jun 2024, at 2:54, ran xiaokai wrote:

>> On Tue, Jun 4, 2024 at 5:47?PM <xu.xin16@zte.com.cn> wrote:
>>>
>>> From: Ran Xiaokai <ran.xiaokai@zte.com.cn>
>>>
>>> When I did a large folios split test, a WARNING
>>> "[ 5059.122759][  T166] Cannot split file folio to non-0 order"
>>> was triggered. But my test cases are only for anonmous folios.
>>> while mapping_large_folio_support() is only reasonable for page
>>> cache folios.
>>>
>>> In split_huge_page_to_list_to_order(), the folio passed to
>>> mapping_large_folio_support() maybe anonmous folio. The
>>> folio_test_anon() check is missing. So the split of the anonmous THP
>>> is failed. This is also the same for shmem_mapping(). We'd better add
>>> a check for both. But the shmem_mapping() in __split_huge_page() is
>>> not involved, as for anonmous folios, the end parameter is set to -1, so
>>> (head[i].index >= end) is always false. shmem_mapping() is not called.
>>>
>>> Using /sys/kernel/debug/split_huge_pages to verify this, with this
>>> patch, large anon THP is successfully split and the warning is ceased.
>>>
>>> Signed-off-by: Ran Xiaokai <ran.xiaokai@zte.com.cn>
>>> Cc: xu xin <xu.xin16@zte.com.cn>
>>> Cc: Yang Yang <yang.yang29@zte.com.cn>
>>> ---
>>>  mm/huge_memory.c | 38 ++++++++++++++++++++------------------
>>>  1 file changed, 20 insertions(+), 18 deletions(-)
>>>
>>> diff --git a/mm/huge_memory.c b/mm/huge_memory.c
>>> index 317de2afd371..4c9c7e5ea20c 100644
>>> --- a/mm/huge_memory.c
>>> +++ b/mm/huge_memory.c
>>> @@ -3009,31 +3009,33 @@ int split_huge_page_to_list_to_order(struct page *page, struct list_head *list,
>>>         if (new_order >= folio_order(folio))
>>>                 return -EINVAL;
>>>
>>> -       /* Cannot split anonymous THP to order-1 */
>>> -       if (new_order == 1 && folio_test_anon(folio)) {
>>> -               VM_WARN_ONCE(1, "Cannot split to order-1 folio");
>>> -               return -EINVAL;
>>> -       }
>>> -
>>>         if (new_order) {
>>>                 /* Only swapping a whole PMD-mapped folio is supported */
>>>                 if (folio_test_swapcache(folio))
>>>                         return -EINVAL;
>>> -               /* Split shmem folio to non-zero order not supported */
>>> -               if (shmem_mapping(folio->mapping)) {
>>> -                       VM_WARN_ONCE(1,
>>> -                               "Cannot split shmem folio to non-0 order");
>>> -                       return -EINVAL;
>>> -               }
>>> -               /* No split if the file system does not support large folio */
>>> -               if (!mapping_large_folio_support(folio->mapping)) {
>>> -                       VM_WARN_ONCE(1,
>>> -                               "Cannot split file folio to non-0 order");
>>> -                       return -EINVAL;
>>> +
>>> +               if (folio_test_anon(folio)) {
>>> +                       /* Cannot split anonymous THP to order-1 */
>>> +                       if (new_order == 1) {
>>> +                               VM_WARN_ONCE(1, "Cannot split to order-1 folio");
>>> +                               return -EINVAL;
>>> +                       }
>>> +               } else {
>>> +                       /* Split shmem folio to non-zero order not supported */
>>> +                       if (shmem_mapping(folio->mapping)) {
>>> +                               VM_WARN_ONCE(1,
>>> +                                       "Cannot split shmem folio to non-0 order");
>>> +                               return -EINVAL;
>>> +                       }
>>> +                       /* No split if the file system does not support large folio */
>>> +                       if (!mapping_large_folio_support(folio->mapping)) {
>>> +                               VM_WARN_ONCE(1,
>>> +                                       "Cannot split file folio to non-0 order");
>>> +                               return -EINVAL;
>>> +                       }
>>
>> Am I missing something? if file system doesn't support large folio,
>> how could the large folio start to exist from the first place while its
>> mapping points to a file which doesn't support large folio?
>
> I think it is the CONFIG_READ_ONLY_THP_FOR_FS case.
> khugepaged will try to collapse read-only file-backed pages to 2M THP.

Can you add this information to the commit log in your next version?

Best Regards,
Yan, Zi

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 854 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios
       [not found]       ` <c110eb46-3c9d-40c3-ab16-5bd9f75b6501@redhat.com>
@ 2024-06-06  1:34         ` Barry Song
  0 siblings, 0 replies; 12+ messages in thread
From: Barry Song @ 2024-06-06  1:34 UTC (permalink / raw)
  To: David Hildenbrand
  Cc: Zi Yan, ran xiaokai, akpm, linux-kernel, linux-mm, mhocko,
	v-songbaohua, xu.xin16, yang.yang29

On Thu, Jun 6, 2024 at 2:42 AM David Hildenbrand <david@redhat.com> wrote:
>
> On 05.06.24 16:08, Zi Yan wrote:
> > On 5 Jun 2024, at 2:54, ran xiaokai wrote:
> >
> >>> On Tue, Jun 4, 2024 at 5:47?PM <xu.xin16@zte.com.cn> wrote:
> >>>>
> >>>> From: Ran Xiaokai <ran.xiaokai@zte.com.cn>
> >>>>
> >>>> When I did a large folios split test, a WARNING
> >>>> "[ 5059.122759][  T166] Cannot split file folio to non-0 order"
> >>>> was triggered. But my test cases are only for anonmous folios.
> >>>> while mapping_large_folio_support() is only reasonable for page
> >>>> cache folios.
> >>>>
> >>>> In split_huge_page_to_list_to_order(), the folio passed to
> >>>> mapping_large_folio_support() maybe anonmous folio. The
> >>>> folio_test_anon() check is missing. So the split of the anonmous THP
> >>>> is failed. This is also the same for shmem_mapping(). We'd better add
> >>>> a check for both. But the shmem_mapping() in __split_huge_page() is
> >>>> not involved, as for anonmous folios, the end parameter is set to -1, so
> >>>> (head[i].index >= end) is always false. shmem_mapping() is not called.
> >>>>
> >>>> Using /sys/kernel/debug/split_huge_pages to verify this, with this
> >>>> patch, large anon THP is successfully split and the warning is ceased.
> >>>>
> >>>> Signed-off-by: Ran Xiaokai <ran.xiaokai@zte.com.cn>
> >>>> Cc: xu xin <xu.xin16@zte.com.cn>
> >>>> Cc: Yang Yang <yang.yang29@zte.com.cn>
> >>>> ---
> >>>>   mm/huge_memory.c | 38 ++++++++++++++++++++------------------
> >>>>   1 file changed, 20 insertions(+), 18 deletions(-)
> >>>>
> >>>> diff --git a/mm/huge_memory.c b/mm/huge_memory.c
> >>>> index 317de2afd371..4c9c7e5ea20c 100644
> >>>> --- a/mm/huge_memory.c
> >>>> +++ b/mm/huge_memory.c
> >>>> @@ -3009,31 +3009,33 @@ int split_huge_page_to_list_to_order(struct page *page, struct list_head *list,
> >>>>          if (new_order >= folio_order(folio))
> >>>>                  return -EINVAL;
> >>>>
> >>>> -       /* Cannot split anonymous THP to order-1 */
> >>>> -       if (new_order == 1 && folio_test_anon(folio)) {
> >>>> -               VM_WARN_ONCE(1, "Cannot split to order-1 folio");
> >>>> -               return -EINVAL;
> >>>> -       }
> >>>> -
> >>>>          if (new_order) {
> >>>>                  /* Only swapping a whole PMD-mapped folio is supported */
> >>>>                  if (folio_test_swapcache(folio))
> >>>>                          return -EINVAL;
> >>>> -               /* Split shmem folio to non-zero order not supported */
> >>>> -               if (shmem_mapping(folio->mapping)) {
> >>>> -                       VM_WARN_ONCE(1,
> >>>> -                               "Cannot split shmem folio to non-0 order");
> >>>> -                       return -EINVAL;
> >>>> -               }
> >>>> -               /* No split if the file system does not support large folio */
> >>>> -               if (!mapping_large_folio_support(folio->mapping)) {
> >>>> -                       VM_WARN_ONCE(1,
> >>>> -                               "Cannot split file folio to non-0 order");
> >>>> -                       return -EINVAL;
> >>>> +
> >>>> +               if (folio_test_anon(folio)) {
> >>>> +                       /* Cannot split anonymous THP to order-1 */
> >>>> +                       if (new_order == 1) {
> >>>> +                               VM_WARN_ONCE(1, "Cannot split to order-1 folio");
> >>>> +                               return -EINVAL;
> >>>> +                       }
> >>>> +               } else {
> >>>> +                       /* Split shmem folio to non-zero order not supported */
> >>>> +                       if (shmem_mapping(folio->mapping)) {
> >>>> +                               VM_WARN_ONCE(1,
> >>>> +                                       "Cannot split shmem folio to non-0 order");
> >>>> +                               return -EINVAL;
> >>>> +                       }
> >>>> +                       /* No split if the file system does not support large folio */
> >>>> +                       if (!mapping_large_folio_support(folio->mapping)) {
> >>>> +                               VM_WARN_ONCE(1,
> >>>> +                                       "Cannot split file folio to non-0 order");
> >>>> +                               return -EINVAL;
> >>>> +                       }
> >>>
> >>> Am I missing something? if file system doesn't support large folio,
> >>> how could the large folio start to exist from the first place while its
> >>> mapping points to a file which doesn't support large folio?
> >>
> >> I think it is the CONFIG_READ_ONLY_THP_FOR_FS case.
> >> khugepaged will try to collapse read-only file-backed pages to 2M THP.
> >
> > Can you add this information to the commit log in your next version?
>
> Can we also add that as a comment to that function, like "Note that we
> might still
> have THPs in such mappings due to CONFIG_READ_ONLY_THP_FOR_FS. But in
> that case,
> the mapping does not actually support large folios properly.
> "Or sth. like that.

+1. Otherwise, the code appears quite confusing.
Would using "#ifdef" help to further clarify it?

#ifdef CONFIG_READ_ONLY_THP_FOR_FS
            if (!mapping_large_folio_support(folio->mapping)) {
                          ....
            }
#endif

>
> --
> Cheers,
>
> David / dhildenb
>

Thanks
Barry


^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2024-06-06  1:34 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-06-04  5:47 [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios xu.xin16
2024-06-04  7:57 ` David Hildenbrand
2024-06-04 13:52   ` Zi Yan
2024-06-04 13:57     ` Zi Yan
2024-06-05  2:56     ` ran xiaokai
2024-06-05  2:20   ` ran xiaokai
2024-06-05  7:25     ` David Hildenbrand
2024-06-05  8:30       ` ran xiaokai
2024-06-05  8:33         ` David Hildenbrand
2024-06-05  9:06 ` Barry Song
     [not found]   ` <20240605095406.891512-1-ranxiaokai627@163.com>
2024-06-05 14:08     ` Zi Yan
     [not found]       ` <c110eb46-3c9d-40c3-ab16-5bd9f75b6501@redhat.com>
2024-06-06  1:34         ` Barry Song

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox