[PATCH RFC v3 0/2] mm: Introduce ADDR_LIMIT_47BIT personality flag

Charlie Jenkins charlie at rivosinc.com
Fri Sep 6 07:15:50 AEST 2024


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), provide a flag to the personality syscall
that can be used to ensure an application works in any arbitrary VA
space. A similar feature has already been implemented by the personality
syscall in ADDR_LIMIT_32BIT.

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 at arndb.de>
To: Richard Henderson <richard.henderson at linaro.org>
To: Ivan Kokshaysky <ink at jurassic.park.msu.ru>
To: Matt Turner <mattst88 at gmail.com>
To: Vineet Gupta <vgupta at kernel.org>
To: Russell King <linux at armlinux.org.uk>
To: Guo Ren <guoren at kernel.org>
To: Huacai Chen <chenhuacai at kernel.org>
To: WANG Xuerui <kernel at xen0n.name>
To: Thomas Bogendoerfer <tsbogend at alpha.franken.de>
To: James E.J. Bottomley <James.Bottomley at HansenPartnership.com>
To: Helge Deller <deller at gmx.de>
To: Michael Ellerman <mpe at ellerman.id.au>
To: Nicholas Piggin <npiggin at gmail.com>
To: Christophe Leroy <christophe.leroy at csgroup.eu>
To: Naveen N Rao <naveen at kernel.org>
To: Alexander Gordeev <agordeev at linux.ibm.com>
To: Gerald Schaefer <gerald.schaefer at linux.ibm.com>
To: Heiko Carstens <hca at linux.ibm.com>
To: Vasily Gorbik <gor at linux.ibm.com>
To: Christian Borntraeger <borntraeger at linux.ibm.com>
To: Sven Schnelle <svens at linux.ibm.com>
To: Yoshinori Sato <ysato at users.sourceforge.jp>
To: Rich Felker <dalias at libc.org>
To: John Paul Adrian Glaubitz <glaubitz at physik.fu-berlin.de>
To: David S. Miller <davem at davemloft.net>
To: Andreas Larsson <andreas at gaisler.com>
To: Thomas Gleixner <tglx at linutronix.de>
To: Ingo Molnar <mingo at redhat.com>
To: Borislav Petkov <bp at alien8.de>
To: Dave Hansen <dave.hansen at linux.intel.com>
To: x86 at kernel.org
To: H. Peter Anvin <hpa at zytor.com>
To: Andy Lutomirski <luto at kernel.org>
To: Peter Zijlstra <peterz at infradead.org>
To: Muchun Song <muchun.song at linux.dev>
To: Andrew Morton <akpm at linux-foundation.org>
To: Liam R. Howlett <Liam.Howlett at oracle.com>
To: Vlastimil Babka <vbabka at suse.cz>
To: Lorenzo Stoakes <lorenzo.stoakes at oracle.com>
To: Shuah Khan <shuah at kernel.org>
To: Christoph Hellwig <hch at infradead.org>
To: Michal Hocko <mhocko at suse.com>
To: "Kirill A. Shutemov" <kirill at shutemov.name>
To: Chris Torek <chris.torek at gmail.com>
Cc: linux-arch at vger.kernel.org
Cc: linux-kernel at vger.kernel.org
Cc: linux-alpha at vger.kernel.org
Cc: linux-snps-arc at lists.infradead.org
Cc: linux-arm-kernel at lists.infradead.org
Cc: linux-csky at vger.kernel.org
Cc: loongarch at lists.linux.dev
Cc: linux-mips at vger.kernel.org
Cc: linux-parisc at vger.kernel.org
Cc: linuxppc-dev at lists.ozlabs.org
Cc: linux-s390 at vger.kernel.org
Cc: linux-sh at vger.kernel.org
Cc: sparclinux at vger.kernel.org
Cc: linux-mm at kvack.org
Cc: linux-kselftest at vger.kernel.org
Cc: linux-abi-devel at lists.sourceforge.net
Signed-off-by: Charlie Jenkins <charlie at rivosinc.com>

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@rivosinc.com

Changes in v3:
- Use a personality flag instead of an mmap flag
- Link to v2: https://lore.kernel.org/r/20240829-patches-below_hint_mmap-v2-0-638a28d9eae0@rivosinc.com

---
Charlie Jenkins (2):
      mm: Add personality flag to limit address to 47 bits
      selftests/mm: Create ADDR_LIMIT_47BIT test

 include/uapi/linux/personality.h                   |  1 +
 mm/mmap.c                                          |  3 ++
 tools/testing/selftests/mm/.gitignore              |  1 +
 tools/testing/selftests/mm/Makefile                |  1 +
 tools/testing/selftests/mm/map_47bit_personality.c | 34 ++++++++++++++++++++++
 5 files changed, 40 insertions(+)
---
base-commit: 5be63fc19fcaa4c236b307420483578a56986a37
change-id: 20240827-patches-below_hint_mmap-b13d79ae1c55
-- 
- Charlie



More information about the Linuxppc-dev mailing list