Previous patch series[1] changes a mmap behavior that treats the hint address as the upper bound of the mmap address range. The motivation of the previous patch series is that some user space software may assume 48-bit address space and use higher bits to encode some information, which may collide with large virtual address space mmap may return. However, to make sv48 by default, we don't need to change the meaning of the hint address on mmap as the upper bound of the mmap address range, especially when this behavior only shows up on the RISC-V. This behavior also breaks some user space software which assumes mmap should try to create mapping on the hint address if possible. As the mmap manpage said: > If addr is not NULL, then the kernel takes it as a hint about where to > place the mapping; on Linux, the kernel will pick a nearby page boundary > (but always above or equal to the value specified by > /proc/sys/vm/mmap_min_addr) and attempt to create the mapping there. Unfortunately, what mmap said is not true on RISC-V since kernel v6.6. Other ISAs with larger than 48-bit virtual address space like x86, arm64, and powerpc do not have this special mmap behavior on hint address. They all just make 48-bit / 47-bit virtual address space by default, and if a user space software wants to large virtual address space, it only need to specify a hint address larger than 48-bit / 47-bit. Thus, this patch series keeps the change of mmap to use sv48 by default but does not treat the hint address as the upper bound of the mmap address range. After this patch, the behavior of mmap will align with existing behavior on other ISAs with larger than 48-bit virtual address space like x86, arm64, and powerpc. The user space software will no longer need to rewrite their code to fit with this special mmap behavior only on RISC-V. My concern is that the change of mmap behavior on the hint address is already in the upstream kernel since v6.6, and it might be hard to revert it although it already brings some regression on some user space software. And it will be harder than adding it since v6.6 because mmap not creating mapping on the hint address is very common, especially when running on a machine without sv57 / sv48. However, if some user space software already adopted this special mmap behavior on RISC-V, we should not return a mmap address larger than the hint if the address is larger than BIT(38). My opinion is that revert this change on the next kernel release might be a good choice as only a few of hardware support sv57 / sv48 now, these changes will have no impact on sv39 systems. Moreover, previous patch series said it make sv48 by default, which is in the cover letter, kernel documentation and MMAP_VA_BITS defination. However, the code on arch_get_mmap_end and arch_get_mmap_base marco still use sv39 by default, which makes me confused, and I still use sv48 by default in this patch series including arch_get_mmap_end and arch_get_mmap_base. Changes in v2: - correct arch_get_mmap_end and arch_get_mmap_base - Add description in documentation about mmap behavior on kernel v6.6-6.7. - Improve commit message and cover letter - Rebase to newest riscv/for-next branch - Link to v1: https://lore.kernel.org/linux-riscv/tencent_F3B3B5AB1C9D704763CA423E1A41F8BE0509@xxxxxx/ [1]. https://lore.kernel.org/linux-riscv/20230809232218.849726-1-charlie@xxxxxxxxxxxx/ Yangyu Chen (3): RISC-V: mm: do not treat hint addr on mmap as the upper bound to search RISC-V: mm: only test mmap without hint Documentation: riscv: correct sv57 kernel behavior Documentation/arch/riscv/vm-layout.rst | 54 ++++++++++++------- arch/riscv/include/asm/processor.h | 38 +++---------- .../selftests/riscv/mm/mmap_bottomup.c | 12 ----- .../testing/selftests/riscv/mm/mmap_default.c | 12 ----- tools/testing/selftests/riscv/mm/mmap_test.h | 30 ----------- 5 files changed, 41 insertions(+), 105 deletions(-) -- 2.43.0