Re: [PATCH 2/4] mm/huge_memory: move to next folio after folio_split() succeeds.
From: Zi Yan
Date: Fri Aug 08 2025 - 11:44:14 EST
On 8 Aug 2025, at 11:24, Zi Yan wrote:
> On 7 Aug 2025, at 23:15, Wei Yang wrote:
>
>> On Thu, Aug 07, 2025 at 01:05:09PM -0400, Zi Yan wrote:
>>> On 7 Aug 2025, at 4:55, Wei Yang wrote:
>>>
>>>> On Tue, Aug 05, 2025 at 10:20:43PM -0400, Zi Yan wrote:
>>>> [...]
>>>>>
>>>>> - if (in_folio_offset < 0 ||
>>>>> - in_folio_offset >= folio_nr_pages(folio)) {
>>>>> + if (in_folio_offset < 0 || in_folio_offset >= nr_pages) {
>>>>> if (!split_folio_to_order(folio, target_order))
>>>>> split++;
>>>>> } else {
>>>>> - struct page *split_at = folio_page(folio,
>>>>> - in_folio_offset);
>>>>> - if (!folio_split(folio, target_order, split_at, NULL))
>>>>> + struct page *split_at =
>>>>> + folio_page(folio, in_folio_offset);
>>>>> + if (!folio_split(folio, target_order, split_at, NULL)) {
>>>>> split++;
>>>>> + addr += PAGE_SIZE * nr_pages;
>>>>> + }
>>>>
>>>> Are we sure addr points to the folio start?
>>>
>>> David pointed it out. Will use addr += PAGE_SIZE * (nr_pages - 1).
>>>
>>
>> No, let me be more clear. I am talking about the addr in next iteration. I am
>> talking about the addr in this round.
>>
>> For an addr in the middle of 2M, we still could get the large folio if my
>> understanding is correct. Then (addr + whole folio size) seems wrong.
>>
>> addr
>> |
>> v
>> +-------------------+
>> | |
>> +-------------------+
>>
>> Not sure this would be the case.
>
> Got it. addr should be aligned up to PAGE_SIZE * nr_pages to get to the next
> folio. Thanks.
On a second thought, this new stepping would mess up with PTE-mapped folio split.
I will drop this patch (pr_debug part will be moved to Patch 1) and change
split_huge_page_test.c instead.
--
Best Regards,
Yan, Zi