Such a large recipient list and no linux-api. CC'd, please include it on future postings. On 8/29/24 09:15, Charlie Jenkins wrote: > Some applications rely on placing data in free bits addresses allocated > by mmap. Various architectures (eg. x86, arm64, powerpc) restrict the > address returned by mmap to be less than the 48-bit address space, > unless the hint address uses more than 47 bits (the 48th bit is reserved > for the kernel address space). > > The riscv architecture needs a way to similarly restrict the virtual > address space. On the riscv port of OpenJDK an error is thrown if > attempted to run on the 57-bit address space, called sv57 [1]. golang > has a comment that sv57 support is not complete, but there are some > workarounds to get it to mostly work [2]. > > These applications work on x86 because x86 does an implicit 47-bit > restriction of mmap() address that contain a hint address that is less > than 48 bits. > > Instead of implicitly restricting the address space on riscv (or any > current/future architecture), a flag would allow users to opt-in to this > behavior rather than opt-out as is done on other architectures. This is > desirable because it is a small class of applications that do pointer > masking. I doubt it's desirable to have different behavior depending on architecture. Also you could say it's a small class of applications that need more than 47 bits. > This flag will also allow seemless compatibility between all > architectures, so applications like Go and OpenJDK that use bits in a > virtual address can request the exact number of bits they need in a > generic way. The flag can be checked inside of vm_unmapped_area() so > that this flag does not have to be handled individually by each > architecture. > > Link: > https://github.com/openjdk/jdk/blob/f080b4bb8a75284db1b6037f8c00ef3b1ef1add1/src/hotspot/cpu/riscv/vm_version_riscv.cpp#L79 > [1] > Link: > https://github.com/golang/go/blob/9e8ea567c838574a0f14538c0bbbd83c3215aa55/src/runtime/tagptr_64bit.go#L47 > [2] > > To: Arnd Bergmann <arnd@xxxxxxxx> > To: Richard Henderson <richard.henderson@xxxxxxxxxx> > To: Ivan Kokshaysky <ink@xxxxxxxxxxxxxxxxxxxx> > To: Matt Turner <mattst88@xxxxxxxxx> > To: Vineet Gupta <vgupta@xxxxxxxxxx> > To: Russell King <linux@xxxxxxxxxxxxxxx> > To: Guo Ren <guoren@xxxxxxxxxx> > To: Huacai Chen <chenhuacai@xxxxxxxxxx> > To: WANG Xuerui <kernel@xxxxxxxxxx> > To: Thomas Bogendoerfer <tsbogend@xxxxxxxxxxxxxxxx> > To: James E.J. Bottomley <James.Bottomley@xxxxxxxxxxxxxxxxxxxxx> > To: Helge Deller <deller@xxxxxx> > To: Michael Ellerman <mpe@xxxxxxxxxxxxxx> > To: Nicholas Piggin <npiggin@xxxxxxxxx> > To: Christophe Leroy <christophe.leroy@xxxxxxxxxx> > To: Naveen N Rao <naveen@xxxxxxxxxx> > To: Alexander Gordeev <agordeev@xxxxxxxxxxxxx> > To: Gerald Schaefer <gerald.schaefer@xxxxxxxxxxxxx> > To: Heiko Carstens <hca@xxxxxxxxxxxxx> > To: Vasily Gorbik <gor@xxxxxxxxxxxxx> > To: Christian Borntraeger <borntraeger@xxxxxxxxxxxxx> > To: Sven Schnelle <svens@xxxxxxxxxxxxx> > To: Yoshinori Sato <ysato@xxxxxxxxxxxxxxxxxxxx> > To: Rich Felker <dalias@xxxxxxxx> > To: John Paul Adrian Glaubitz <glaubitz@xxxxxxxxxxxxxxxxxxx> > To: David S. Miller <davem@xxxxxxxxxxxxx> > To: Andreas Larsson <andreas@xxxxxxxxxxx> > To: Thomas Gleixner <tglx@xxxxxxxxxxxxx> > To: Ingo Molnar <mingo@xxxxxxxxxx> > To: Borislav Petkov <bp@xxxxxxxxx> > To: Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx> > To: x86@xxxxxxxxxx > To: H. Peter Anvin <hpa@xxxxxxxxx> > To: Andy Lutomirski <luto@xxxxxxxxxx> > To: Peter Zijlstra <peterz@xxxxxxxxxxxxx> > To: Muchun Song <muchun.song@xxxxxxxxx> > To: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> > To: Liam R. Howlett <Liam.Howlett@xxxxxxxxxx> > To: Vlastimil Babka <vbabka@xxxxxxx> > To: Lorenzo Stoakes <lorenzo.stoakes@xxxxxxxxxx> > To: Shuah Khan <shuah@xxxxxxxxxx> > Cc: linux-arch@xxxxxxxxxxxxxxx > Cc: linux-kernel@xxxxxxxxxxxxxxx > Cc: linux-alpha@xxxxxxxxxxxxxxx > Cc: linux-snps-arc@xxxxxxxxxxxxxxxxxxx > Cc: linux-arm-kernel@xxxxxxxxxxxxxxxxxxx > Cc: linux-csky@xxxxxxxxxxxxxxx > Cc: loongarch@xxxxxxxxxxxxxxx > Cc: linux-mips@xxxxxxxxxxxxxxx > Cc: linux-parisc@xxxxxxxxxxxxxxx > Cc: linuxppc-dev@xxxxxxxxxxxxxxxx > Cc: linux-s390@xxxxxxxxxxxxxxx > Cc: linux-sh@xxxxxxxxxxxxxxx > Cc: sparclinux@xxxxxxxxxxxxxxx > Cc: linux-mm@xxxxxxxxx > Cc: linux-kselftest@xxxxxxxxxxxxxxx > Signed-off-by: Charlie Jenkins <charlie@xxxxxxxxxxxx> > > Changes in v2: > - Added much greater detail to cover letter > - Removed all code that touched architecture specific code and was able > to factor this out into all generic functions, except for flags that > needed to be added to vm_unmapped_area_info > - Made this an RFC since I have only tested it on riscv and x86 > - Link to v1: https://lore.kernel.org/r/20240827-patches-below_hint_mmap-v1-0-46ff2eb9022d@xxxxxxxxxxxx > > --- > Charlie Jenkins (4): > mm: Add MAP_BELOW_HINT > mm: Add hint and mmap_flags to struct vm_unmapped_area_info > mm: Support MAP_BELOW_HINT in vm_unmapped_area() > selftests/mm: Create MAP_BELOW_HINT test > > arch/alpha/kernel/osf_sys.c | 2 ++ > arch/arc/mm/mmap.c | 3 +++ > arch/arm/mm/mmap.c | 7 ++++++ > arch/csky/abiv1/mmap.c | 3 +++ > arch/loongarch/mm/mmap.c | 3 +++ > arch/mips/mm/mmap.c | 3 +++ > arch/parisc/kernel/sys_parisc.c | 3 +++ > arch/powerpc/mm/book3s64/slice.c | 7 ++++++ > arch/s390/mm/hugetlbpage.c | 4 ++++ > arch/s390/mm/mmap.c | 6 ++++++ > arch/sh/mm/mmap.c | 6 ++++++ > arch/sparc/kernel/sys_sparc_32.c | 3 +++ > arch/sparc/kernel/sys_sparc_64.c | 6 ++++++ > arch/sparc/mm/hugetlbpage.c | 4 ++++ > arch/x86/kernel/sys_x86_64.c | 6 ++++++ > arch/x86/mm/hugetlbpage.c | 4 ++++ > fs/hugetlbfs/inode.c | 4 ++++ > include/linux/mm.h | 2 ++ > include/uapi/asm-generic/mman-common.h | 1 + > mm/mmap.c | 9 ++++++++ > tools/include/uapi/asm-generic/mman-common.h | 1 + > tools/testing/selftests/mm/Makefile | 1 + > tools/testing/selftests/mm/map_below_hint.c | 32 ++++++++++++++++++++++++++++ > 23 files changed, 120 insertions(+) > --- > base-commit: 5be63fc19fcaa4c236b307420483578a56986a37 > change-id: 20240827-patches-below_hint_mmap-b13d79ae1c55