On Tue, Apr 02, 2019 at 06:02:38AM +0000, Anup Patel wrote: > The Maximum Physical Memory 2GiB option for 64bit systems is currently > broken because kernel hangs at boot-time when this option is enabled > and the underlying system has more than 2GiB memory. > > This issue can be easily reproduced on SiFive Unleashed board where > we have 8GiB of memory. > > This patch fixes above issue by reserving unusable memory region in > setup_bootmem(). > > Signed-off-by: Anup Patel <[email protected]> > --- > arch/riscv/mm/init.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c > index 5fd8c922e1c2..6b063f20a9d0 100644 > --- a/arch/riscv/mm/init.c > +++ b/arch/riscv/mm/init.c > @@ -121,6 +121,14 @@ void __init setup_bootmem(void) > */ > memblock_reserve(reg->base, vmlinux_end - reg->base); > mem_size = min(reg->size, (phys_addr_t)-PAGE_OFFSET); > + > + /* > + * Reserve from the end of usable area to the end of > + * region > + */ > + if ((reg->base + mem_size) < end) > + memblock_reserve(reg->base + mem_size, > + end - reg->base - mem_size);
The memory above MAXPHYSMEM should not be reserved. It should be either removed from memblock with memblock_remove or not added at the first place. Frankly, I fail to understand the logic behind setting PAGE_OFFSET to MAXPHYSMEM and then using PAGE_OFFSET as the limit for accessible physical memory. Still, as it is there, you can set MAX_MEMBLOCK_ADDR=PAGE_OFFSET in arch/riscv/include/page.h and then early_init_dt_add_memory_arch() will simply ignore the memory above PAGE_OFFSET. More sustainable fix for the long term, IMHO, would be to break PAGE_OFFSET and MAXPHYSMEM interdependency. > } > } > BUG_ON(mem_size == 0); > -- > 2.17.1 > -- Sincerely yours, Mike.

