Hi Charlie,

On Thu, 2024-09-05 at 14:15 -0700, 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), 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 <[email protected]>
> To: Richard Henderson <[email protected]>
> To: Ivan Kokshaysky <[email protected]>
> To: Matt Turner <[email protected]>
> To: Vineet Gupta <[email protected]>
> To: Russell King <[email protected]>
> To: Guo Ren <[email protected]>
> To: Huacai Chen <[email protected]>
> To: WANG Xuerui <[email protected]>
> To: Thomas Bogendoerfer <[email protected]>
> To: James E.J. Bottomley <[email protected]>
> To: Helge Deller <[email protected]>
> To: Michael Ellerman <[email protected]>
> To: Nicholas Piggin <[email protected]>
> To: Christophe Leroy <[email protected]>
> To: Naveen N Rao <[email protected]>
> To: Alexander Gordeev <[email protected]>
> To: Gerald Schaefer <[email protected]>
> To: Heiko Carstens <[email protected]>
> To: Vasily Gorbik <[email protected]>
> To: Christian Borntraeger <[email protected]>
> To: Sven Schnelle <[email protected]>
> To: Yoshinori Sato <[email protected]>
> To: Rich Felker <[email protected]>
> To: John Paul Adrian Glaubitz <[email protected]>
> To: David S. Miller <[email protected]>
> To: Andreas Larsson <[email protected]>
> To: Thomas Gleixner <[email protected]>
> To: Ingo Molnar <[email protected]>
> To: Borislav Petkov <[email protected]>
> To: Dave Hansen <[email protected]>
> To: [email protected]
> To: H. Peter Anvin <[email protected]>
> To: Andy Lutomirski <[email protected]>
> To: Peter Zijlstra <[email protected]>
> To: Muchun Song <[email protected]>
> To: Andrew Morton <[email protected]>
> To: Liam R. Howlett <[email protected]>
> To: Vlastimil Babka <[email protected]>
> To: Lorenzo Stoakes <[email protected]>
> To: Shuah Khan <[email protected]>
> To: Christoph Hellwig <[email protected]>
> To: Michal Hocko <[email protected]>
> To: "Kirill A. Shutemov" <[email protected]>
> To: Chris Torek <[email protected]>
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Signed-off-by: Charlie Jenkins <[email protected]>
> 
> 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/[email protected]
> 
> Changes in v3:
> - Use a personality flag instead of an mmap flag
> - Link to v2: 
> https://lore.kernel.org/r/[email protected]
> 
> ---
> 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

Wow, this issue has been plaguing SPARC users for years already as the 
architecture
uses a 52-bit virtual address space and Javascript engines such as the one in 
Firefox
or Webkit have been crashing ever since.

I should definitely give this series a try and see if that fixes Javascript 
crashes
on SPARC.

Thanks a lot for addressing this nasty long-standing problem!

Adrian

-- 
 .''`.  John Paul Adrian Glaubitz
: :' :  Debian Developer
`. `'   Physicist
  `-    GPG: 62FF 8A75 84E0 2956 9546  0006 7426 3B37 F5B5 F913

Reply via email to