Thread (22 messages) 22 messages, 6 authors, 2021-09-29

Re: [RFC] arm64: mm: update max_pfn after memory hotplug

From: Will Deacon <will@kernel.org>
Date: 2021-09-29 12:51:08
Also in: linux-arm-kernel, lkml

On Wed, Sep 29, 2021 at 02:09:35PM +0200, David Hildenbrand wrote:
On 29.09.21 13:03, Will Deacon wrote:
quoted
On Wed, Sep 29, 2021 at 12:49:58PM +0200, David Hildenbrand wrote:
quoted
On 29.09.21 12:42, Will Deacon wrote:
quoted
On Wed, Sep 29, 2021 at 12:29:32PM +0200, David Hildenbrand wrote:
quoted
On 29.09.21 12:10, Will Deacon wrote:
quoted
On Thu, Sep 23, 2021 at 03:54:48PM -0700, Chris Goldsworthy wrote:
quoted
From: Sudarshan Rajagopalan <redacted>

After new memory blocks have been hotplugged, max_pfn and max_low_pfn
needs updating to reflect on new PFNs being hot added to system.

Signed-off-by: Sudarshan Rajagopalan <redacted>
Signed-off-by: Chris Goldsworthy <redacted>
---
    arch/arm64/mm/mmu.c | 5 +++++
    1 file changed, 5 insertions(+)
diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c
index cfd9deb..fd85b51 100644
--- a/arch/arm64/mm/mmu.c
+++ b/arch/arm64/mm/mmu.c
@@ -1499,6 +1499,11 @@ int arch_add_memory(int nid, u64 start, u64 size,
    	if (ret)
    		__remove_pgd_mapping(swapper_pg_dir,
    				     __phys_to_virt(start), size);
+	else {
+		max_pfn = PFN_UP(start + size);
+		max_low_pfn = max_pfn;
+	}
We use 'max_pfn' as part of the argument to set_max_mapnr(). Does that need
updating as well?

Do we have sufficient locking to ensure nobody is looking at max_pfn or
max_low_pfn while we update them?
Only the write side is protected by memory hotplug locking. The read side is
lockless -- just like all of the other pfn_to_online_page() machinery.
Hmm. So the readers can see one of the variables updated but the other one
stale?
Yes, just like it has been on x86-64 for a long time:

arch/x86/mm/init_64.c:update_end_of_memory_vars()

Not sure if anyone really cares about slightly delayed updates while memory
is getting hotplugged. The users that I am aware of don't care.
Thanks, I'd missed that x86 also updates max_low_pfn. So at least we're not
worse off in that respect.

Looking at set_max_mapnr(), I'm wondering why we need to call that at all
on arm64 as 'max_mapnr' only seems to be used for nommu.
I think max_mapnr is only helpful without SPARSE, I can spot the most
prominent consumer being simplistic pfn_valid() implementation.
Yeah, and that's only used #ifndef CONFIG_MMU (there's a #error otherwise at
the top of the file).
MEMORY_HOTPLUG on arm64 implies SPARSE. ... and I recall that FLATMEM is no
longer possible on arm64. So most probably the arm64 call of set_max_mapnr()
can just be dropped.
I'll do that and see if anything catches fire.

Will
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help