From: David Hildenbrand <david@redhat.com>
To: Zhenhua Huang <quic_zhenhuah@quicinc.com>,
anshuman.khandual@arm.com, catalin.marinas@arm.com
Cc: will@kernel.org, ardb@kernel.org, ryan.roberts@arm.com,
mark.rutland@arm.com, joey.gouly@arm.com,
dave.hansen@linux.intel.com, akpm@linux-foundation.org,
chenfeiyang@loongson.cn, chenhuacai@kernel.org,
linux-mm@kvack.org, linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, quic_tingweiz@quicinc.com
Subject: Re: [PATCH v7] arm64: mm: Populate vmemmap at the page level if not section aligned
Date: Wed, 26 Feb 2025 18:13:49 +0100 [thread overview]
Message-ID: <00c82c92-35a0-441c-b5b5-e4a6c8a4a9b7@redhat.com> (raw)
In-Reply-To: <a5439884-551c-4104-9175-f95b0895a489@quicinc.com>
Sorry, I somehow missed this mail.
>>> Hi David,
>>>
>>> I had the same doubt initially.
>>> After going through the codes, I noticed for vmemmap_populate(), the
>>> arguments "start" and "end" passed down should already be within one
>>> section.
>>> early path:
>>> for_each_present_section_nr
>>> __populate_section_memmap
>>> ..
>>> vmemmap_populate()
>>>
>>> hotplug path:
>>> __add_pages
>>> section_activate
>>> vmemmap_populate()
>>>
>>> Therefore.. focusing only on the size seems OK to me, and fall back
>>> solution below appears unnecessary?
>>
>> Ah, in that case it is fine. Might make sense to document/enforce that
>> somehow for the time being ...
>
> Shall I document and WARN_ON if the size exceeds? like:
> WARN_ON(end - start > PAGES_PER_SECTION * sizeof(struct page))
Probably WARN_ON_ONCE() along with a comment that we should never exceed
a single memory section.
>
> Since vmemmap_populate() is implemented per architecture, the change
> should apply for other architectures as well. However I have no setup to
> test it on...
> Therefore, May I implement it only for arm64 now ?
Would work for me; better than no warning.
> Additionally, from previous discussion, the change is worth
> backporting(apologies for missing to CC stable kernel in this version).
> Keeping it for arm64 should simplify for backporting. WDYT?
Jup. Of course, we could add a generic warning in a separate patch.
>
>>
>>
>>>> +/*
>>>> + * Try to populate PMDs, but fallback to populating base pages when
>>>> ranges
>>>> + * would only partially cover a PMD.
>>>> + */
>>>> int __meminit vmemmap_populate_hugepages(unsigned long start,
>>>> unsigned
>>>> long end,
>>>> int node, struct vmem_altmap
>>>> *altmap)
>>>> {
>>>> @@ -313,6 +317,9 @@ int __meminit vmemmap_populate_hugepages(unsigned
>>>> long start, unsigned long end,
>>>> for (addr = start; addr < end; addr = next) {
>>>
>>> This for loop appears to be redundant for arm64 as well, as above
>>> mentioned, a single call to pmd_addr_end() should suffice.
>>
>> Right, that was what was confusing me in the first place.
>>
>>>
>>>> next = pmd_addr_end(addr, end);
>>>>
>>>> + if (!IS_ALIGNED(addr, PMD_SIZE) || !IS_ALIGNED(next,
>>>> PMD_SIZE))
>>>> + goto fallback;
>>>> +
>>>> pgd = vmemmap_pgd_populate(addr, node);
>>>> if (!pgd)
>>>> return -ENOMEM;
>>>> @@ -346,6 +353,7 @@ int __meminit vmemmap_populate_hugepages(unsigned
>>>> long start, unsigned long end,
>>>> }
>>>> } else if (vmemmap_check_pmd(pmd, node, addr, next))
>>>> continue;
>>>> +fallback:
>>>> if (vmemmap_populate_basepages(addr, next, node,
>>>> altmap))
>>>> return -ENOMEM;
>>>
>>> It seems we have no chance to call populate_basepages here?
>>
>>
>> Can you elaborate?
>
> It's invoked within vmemmap_populate_hugepages(), which is called by
> vmemmap_populate(). This implies that we are always performing a whole
> section hotplug?
Ah, you meant only in the context of this change, yes. I was confused,
because there are other reasons why we run into that fallback (failing
to allocate a PMD).
--
Cheers,
David / dhildenb
next prev parent reply other threads:[~2025-02-26 17:13 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-17 9:29 Zhenhua Huang
2025-02-17 9:44 ` David Hildenbrand
2025-02-17 10:34 ` Zhenhua Huang
2025-02-17 14:30 ` David Hildenbrand
2025-02-18 3:07 ` Zhenhua Huang
2025-02-26 17:13 ` David Hildenbrand [this message]
2025-03-03 9:29 ` Zhenhua Huang
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=00c82c92-35a0-441c-b5b5-e4a6c8a4a9b7@redhat.com \
--to=david@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=anshuman.khandual@arm.com \
--cc=ardb@kernel.org \
--cc=catalin.marinas@arm.com \
--cc=chenfeiyang@loongson.cn \
--cc=chenhuacai@kernel.org \
--cc=dave.hansen@linux.intel.com \
--cc=joey.gouly@arm.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mark.rutland@arm.com \
--cc=quic_tingweiz@quicinc.com \
--cc=quic_zhenhuah@quicinc.com \
--cc=ryan.roberts@arm.com \
--cc=will@kernel.org \
/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