Re: [RFC PATCH 1/4] powerpc/64s/radix: Fix memory hotplug section page table creation
From: Michael Ellerman <mpe@ellerman.id.au>
Date: 2019-07-24 03:47:52
Nicholas Piggin [off-list ref] writes:
create_physical_mapping expects physical addresses, but creating and
splitting these mappings after boot is supplying virtual (effective)
addresses. This can be hit by booting with limited memory then probing
new physical memory sections.
Cc: Reza Arbab <redacted>
Fixes: 6cc27341b21a8 ("powerpc/mm: add radix__create_section_mapping()")
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>This is not catastrophic because create_physical_mapping() just uses start/end to construct virtual addresses anyway, and __va(__va(x)) == __va(x) ? Although we do pass those through as region_start/end which then go to memblock_alloc_try_nid(). But I guess that doesn't happen after boot, which is the case you're talking about. So I think looks good, change log could use a bit more detail though :) cheers
quoted hunk ↗ jump to hunk
diff --git a/arch/powerpc/mm/book3s64/radix_pgtable.c b/arch/powerpc/mm/book3s64/radix_pgtable.c index b4ca9e95e678..c5cc16ab1954 100644 --- a/arch/powerpc/mm/book3s64/radix_pgtable.c +++ b/arch/powerpc/mm/book3s64/radix_pgtable.c@@ -902,7 +902,7 @@ int __meminit radix__create_section_mapping(unsigned long start, unsigned long e return -1; } - return create_physical_mapping(start, end, nid); + return create_physical_mapping(__pa(start), __pa(end), nid); } int __meminit radix__remove_section_mapping(unsigned long start, unsigned long end)-- 2.20.1