On Aug 27, 2024, at 00:36, Charlie Jenkins charlie@rivosinc.com wrote:
The hint address should not forcefully restrict the addresses returned by mmap as this causes mmap to report ENOMEM when there is memory still available.
Fixing in this way will break userspace on Sv57 machines as some issues mentioned in the patch [1].
I suggest restricting to BIT(47) by default, like patch [2], to align with kernel behavior on x86 and aarch64, and this does exist on x86 and aarch64 for quite a long time. In that way, we will also solve the problem mentioned in the first patch [1], as QEMU enables Sv57 by default now and will not break userspace.
[1] https://lore.kernel.org/linux-riscv/20230809232218.849726-1-charlie@rivosinc... [2] https://lore.kernel.org/linux-riscv/tencent_B2D0435BC011135736262764B511994F...
Thanks, Yangyu Chen
Signed-off-by: Charlie Jenkins charlie@rivosinc.com Fixes: b5b4287accd7 ("riscv: mm: Use hint address in mmap if available") Fixes: add2cc6b6515 ("RISC-V: mm: Restrict address space for sv39,sv48,sv57") Closes: https://lore.kernel.org/linux-kernel/ZbxTNjQPFKBatMq+@ghost/T/#mccb1890466bf...
arch/riscv/include/asm/processor.h | 26 ++------------------------ 1 file changed, 2 insertions(+), 24 deletions(-)
diff --git a/arch/riscv/include/asm/processor.h b/arch/riscv/include/asm/processor.h index 8702b8721a27..efa1b3519b23 100644 --- a/arch/riscv/include/asm/processor.h +++ b/arch/riscv/include/asm/processor.h @@ -14,36 +14,14 @@
#include <asm/ptrace.h>
-/*
- addr is a hint to the maximum userspace address that mmap should provide, so
- this macro needs to return the largest address space available so that
- mmap_end < addr, being mmap_end the top of that address space.
- See Documentation/arch/riscv/vm-layout.rst for more details.
- */
#define arch_get_mmap_end(addr, len, flags) \ ({ \
- unsigned long mmap_end; \
- typeof(addr) _addr = (addr); \
- if ((_addr) == 0 || is_compat_task() || \
- ((_addr + len) > BIT(VA_BITS - 1))) \
- mmap_end = STACK_TOP_MAX; \
- else \
- mmap_end = (_addr + len); \
- mmap_end; \
- STACK_TOP_MAX; \
})
#define arch_get_mmap_base(addr, base) \ ({ \
- unsigned long mmap_base; \
- typeof(addr) _addr = (addr); \
- typeof(base) _base = (base); \
- unsigned long rnd_gap = DEFAULT_MAP_WINDOW - (_base); \
- if ((_addr) == 0 || is_compat_task() || \
- ((_addr + len) > BIT(VA_BITS - 1))) \
- mmap_base = (_base); \
- else \
- mmap_base = (_addr + len) - rnd_gap; \
- mmap_base; \
- base; \
})
#ifdef CONFIG_64BIT
-- 2.45.0