Nicholas Piggin <npig...@gmail.com> writes: > 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. >
Good catch. Did this result in any error? Reviewed-by: Aneesh Kumar K.V <aneesh.ku...@linux.ibm.com> > Cc: Reza Arbab <ar...@linux.vnet.ibm.com> > Fixes: 6cc27341b21a8 ("powerpc/mm: add radix__create_section_mapping()") > Signed-off-by: Nicholas Piggin <npig...@gmail.com> > --- > arch/powerpc/mm/book3s64/radix_pgtable.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > 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); While we are here, should we change the prototype to take phys_addr_t ? > } > > int __meminit radix__remove_section_mapping(unsigned long start, unsigned > long end) > -- > 2.22.0