On Sat, Aug 17, 2019 at 5:00 PM Mike Rapoport <rppt@xxxxxxxxxxxxx> wrote: > > On Sat, Aug 17, 2019 at 11:00:13AM +0800, Zhaoyang Huang wrote: > > From: Zhaoyang Huang <zhaoyang.huang@xxxxxxxxxx> > > > > pfn_valid can be wrong while the MSB of physical address be trimed as pfn > > larger than the max_pfn. > > How the overflow of __pfn_to_phys() is related to max_pfn? > Where is the guarantee that __pfn_to_phys(max_pfn) won't overflow? eg, the invalid pfn value as 0x1bffc0 will pass pfn_valid if there is a memory block while the max_pfn is 0xbffc0. In ARM64, bellowing condition check will help to > > > Signed-off-by: Zhaoyang Huang <huangzhaoyang@xxxxxxxxx> > > --- > > arch/arm/mm/init.c | 3 ++- > > 1 file changed, 2 insertions(+), 1 deletion(-) > > > > diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c > > index c2daabb..9c4d938 100644 > > --- a/arch/arm/mm/init.c > > +++ b/arch/arm/mm/init.c > > @@ -177,7 +177,8 @@ static void __init zone_sizes_init(unsigned long min, unsigned long max_low, > > #ifdef CONFIG_HAVE_ARCH_PFN_VALID > > int pfn_valid(unsigned long pfn) > > { > > - return memblock_is_map_memory(__pfn_to_phys(pfn)); > > + return (pfn > max_pfn) ? > > + false : memblock_is_map_memory(__pfn_to_phys(pfn)); > > } > > EXPORT_SYMBOL(pfn_valid); > > #endif > > -- > > 1.9.1 > > > > -- > Sincerely yours, > Mike. >