summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicholas Piggin <npiggin@gmail.com>2019-07-24 18:46:34 +1000
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-10-07 18:59:10 +0200
commit714886254f3ccf928e6a8d702ee3181d9a16c314 (patch)
tree08ba11517b3590c1f9c58ebe9355e76d948c4964
parentde37ad13aca160f51ad1fd70fab553452e829b2b (diff)
downloadlinux-stable-714886254f3ccf928e6a8d702ee3181d9a16c314.tar.gz
linux-stable-714886254f3ccf928e6a8d702ee3181d9a16c314.tar.bz2
linux-stable-714886254f3ccf928e6a8d702ee3181d9a16c314.zip
powerpc/64s/radix: Fix memory hotplug section page table creation
[ Upstream commit 8f51e3929470942e6a8744061254fdeef646cd36 ] create_physical_mapping expects physical addresses, but creating and splitting these mappings after boot is supplying virtual (effective) addresses. This can be irritated by booting with mem= to limit memory then probing an unused physical memory range: echo <addr> > /sys/devices/system/memory/probe This mostly works by accident, firstly because __va(__va(x)) == __va(x) so the virtual address does not get corrupted. Secondly because pfn_pte masks out the upper bits of the pfn beyond the physical address limit, so a pfn constructed with a 0xc000000000000000 virtual linear address will be masked back to the correct physical address in the pte. Fixes: 6cc27341b21a8 ("powerpc/mm: add radix__create_section_mapping()") Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Reviewed-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20190724084638.24982-1-npiggin@gmail.com Signed-off-by: Sasha Levin <sashal@kernel.org>
-rw-r--r--arch/powerpc/mm/book3s64/radix_pgtable.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/arch/powerpc/mm/book3s64/radix_pgtable.c b/arch/powerpc/mm/book3s64/radix_pgtable.c
index 8deb432c2975..2b6cc823046a 100644
--- a/arch/powerpc/mm/book3s64/radix_pgtable.c
+++ b/arch/powerpc/mm/book3s64/radix_pgtable.c
@@ -901,7 +901,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)