Re: [PATCH v5 14/14] riscv: Make mmap allocation top-down by default
On Tue, 30 Jul 2019, Alexandre Ghiti wrote: > In order to avoid wasting user address space by using bottom-up mmap > allocation scheme, prefer top-down scheme when possible. > > Before: > root@qemuriscv64:~# cat /proc/self/maps > 0001-00016000 r-xp fe:00 6389 /bin/cat.coreutils > 00016000-00017000 r--p 5000 fe:00 6389 /bin/cat.coreutils > 00017000-00018000 rw-p 6000 fe:00 6389 /bin/cat.coreutils > 00018000-00039000 rw-p 00:00 0 [heap] > 156000-16d000 r-xp fe:00 7193 /lib/ld-2.28.so > 16d000-16e000 r--p 00016000 fe:00 7193 /lib/ld-2.28.so > 16e000-16f000 rw-p 00017000 fe:00 7193 /lib/ld-2.28.so > 16f000-17 rw-p 00:00 0 > 17-172000 r-xp 00:00 0 [vdso] > 174000-176000 rw-p 00:00 0 > 176000-1555674000 r-xp fe:00 7187 /lib/libc-2.28.so > 1555674000-1555678000 r--p 000fd000 fe:00 7187 /lib/libc-2.28.so > 1555678000-155567a000 rw-p 00101000 fe:00 7187 /lib/libc-2.28.so > 155567a000-15556a rw-p 00:00 0 > 3fffb9-3fffbb1000 rw-p 00:00 0 [stack] > > After: > root@qemuriscv64:~# cat /proc/self/maps > 0001-00016000 r-xp fe:00 6389 /bin/cat.coreutils > 00016000-00017000 r--p 5000 fe:00 6389 /bin/cat.coreutils > 00017000-00018000 rw-p 6000 fe:00 6389 /bin/cat.coreutils > 2de81000-2dea2000 rw-p 00:00 0 [heap] > 3ff7eb6000-3ff7ed8000 rw-p 00:00 0 > 3ff7ed8000-3ff7fd6000 r-xp fe:00 7187 /lib/libc-2.28.so > 3ff7fd6000-3ff7fda000 r--p 000fd000 fe:00 7187 /lib/libc-2.28.so > 3ff7fda000-3ff7fdc000 rw-p 00101000 fe:00 7187 /lib/libc-2.28.so > 3ff7fdc000-3ff7fe2000 rw-p 00:00 0 > 3ff7fe4000-3ff7fe6000 r-xp 00:00 0 [vdso] > 3ff7fe6000-3ff7ffd000 r-xp fe:00 7193 /lib/ld-2.28.so > 3ff7ffd000-3ff7ffe000 r--p 00016000 fe:00 7193 /lib/ld-2.28.so > 3ff7ffe000-3ff7fff000 rw-p 00017000 fe:00 7193 /lib/ld-2.28.so > 3ff7fff000-3ff800 rw-p 00:00 0 > 3fff888000-3fff8a9000 rw-p 00:00 0 [stack] > > Signed-off-by: Alexandre Ghiti > Reviewed-by: Christoph Hellwig > Reviewed-by: Kees Cook > Reviewed-by: Luis Chamberlain Acked-by: Paul Walmsley # for arch/riscv As Alex notes, this patch depends on "[PATCH] riscv: kbuild: add virtual memory system selection": https://lore.kernel.org/linux-riscv/alpine.deb.2.21..1907301218560.3...@viisi.sifive.com/T/#t which will likely go up during v5.3-rc. - Paul
Re: [PATCH v5 14/14] riscv: Make mmap allocation top-down by default
On Wed, Jul 31, 2019 at 02:05:23AM -0400, Alex Ghiti wrote: > On 7/30/19 1:51 AM, Alexandre Ghiti wrote: > >In order to avoid wasting user address space by using bottom-up mmap > >allocation scheme, prefer top-down scheme when possible. > > > >Before: > >root@qemuriscv64:~# cat /proc/self/maps > >0001-00016000 r-xp fe:00 6389 /bin/cat.coreutils > >00016000-00017000 r--p 5000 fe:00 6389 /bin/cat.coreutils > >00017000-00018000 rw-p 6000 fe:00 6389 /bin/cat.coreutils > >00018000-00039000 rw-p 00:00 0 [heap] > >156000-16d000 r-xp fe:00 7193 /lib/ld-2.28.so > >16d000-16e000 r--p 00016000 fe:00 7193 /lib/ld-2.28.so > >16e000-16f000 rw-p 00017000 fe:00 7193 /lib/ld-2.28.so > >16f000-17 rw-p 00:00 0 > >17-172000 r-xp 00:00 0 [vdso] > >174000-176000 rw-p 00:00 0 > >176000-1555674000 r-xp fe:00 7187 /lib/libc-2.28.so > >1555674000-1555678000 r--p 000fd000 fe:00 7187 /lib/libc-2.28.so > >1555678000-155567a000 rw-p 00101000 fe:00 7187 /lib/libc-2.28.so > >155567a000-15556a rw-p 00:00 0 > >3fffb9-3fffbb1000 rw-p 00:00 0 [stack] > > > >After: > >root@qemuriscv64:~# cat /proc/self/maps > >0001-00016000 r-xp fe:00 6389 /bin/cat.coreutils > >00016000-00017000 r--p 5000 fe:00 6389 /bin/cat.coreutils > >00017000-00018000 rw-p 6000 fe:00 6389 /bin/cat.coreutils > >2de81000-2dea2000 rw-p 00:00 0 [heap] > >3ff7eb6000-3ff7ed8000 rw-p 00:00 0 > >3ff7ed8000-3ff7fd6000 r-xp fe:00 7187 /lib/libc-2.28.so > >3ff7fd6000-3ff7fda000 r--p 000fd000 fe:00 7187 /lib/libc-2.28.so > >3ff7fda000-3ff7fdc000 rw-p 00101000 fe:00 7187 /lib/libc-2.28.so > >3ff7fdc000-3ff7fe2000 rw-p 00:00 0 > >3ff7fe4000-3ff7fe6000 r-xp 00:00 0 [vdso] > >3ff7fe6000-3ff7ffd000 r-xp fe:00 7193 /lib/ld-2.28.so > >3ff7ffd000-3ff7ffe000 r--p 00016000 fe:00 7193 /lib/ld-2.28.so > >3ff7ffe000-3ff7fff000 rw-p 00017000 fe:00 7193 /lib/ld-2.28.so > >3ff7fff000-3ff800 rw-p 00:00 0 > >3fff888000-3fff8a9000 rw-p 00:00 0 [stack] > > > >Signed-off-by: Alexandre Ghiti > >Reviewed-by: Christoph Hellwig > >Reviewed-by: Kees Cook > >Reviewed-by: Luis Chamberlain > >--- > > arch/riscv/Kconfig | 13 + > > 1 file changed, 13 insertions(+) > > > >diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig > >index 8ef64fe2c2b3..8d0d8af1a744 100644 > >--- a/arch/riscv/Kconfig > >+++ b/arch/riscv/Kconfig > >@@ -54,6 +54,19 @@ config RISCV > > select EDAC_SUPPORT > > select ARCH_HAS_GIGANTIC_PAGE > > select ARCH_WANT_HUGE_PMD_SHARE if 64BIT > >+select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT if MMU > >+select HAVE_ARCH_MMAP_RND_BITS > >+ > >+config ARCH_MMAP_RND_BITS_MIN > >+default 18 if 64BIT > >+default 8 > >+ > >+# max bits determined by the following formula: > >+# VA_BITS - PAGE_SHIFT - 3 > >+config ARCH_MMAP_RND_BITS_MAX > >+default 33 if RISCV_VM_SV48 > >+default 24 if RISCV_VM_SV39 > >+default 17 if RISCV_VM_SV32 > > config MMU > > def_bool y > > > Hi Andrew, > > I have just seen you took this series into mmotm but without Paul's patch > ("riscv: kbuild: add virtual memory system selection") on which this commit > relies, I'm not sure it could > compile without it as there is no default for ARCH_MMAP_RND_BITS_MAX. > Yes, this patch results in a bad configuration file. CONFIG_ARCH_MMAP_RND_BITS_MIN=18 CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_ARCH_MMAP_RND_BITS=0 CONFIG_ARCH_MMAP_RND_BITS=0 is outside the valid range, causing make to ask for a valid number. Since none exists, one is stuck with something like: Number of bits to use for ASLR of mmap base address (ARCH_MMAP_RND_BITS) [0] (NEW) 1 Number of bits to use for ASLR of mmap base address (ARCH_MMAP_RND_BITS) [0] (NEW) 2 Number of bits to use for ASLR of mmap base address (ARCH_MMAP_RND_BITS) [0] (NEW) 3 Number of bits to use for ASLR of mmap base address (ARCH_MMAP_RND_BITS) [0] (NEW) 4 Number of bits to use for ASLR of mmap base address (ARCH_MMAP_RND_BITS) [0] (NEW) 5 Number of bits to use for ASLR of mmap base address (ARCH_MMAP_RND_BITS) [0] (NEW) 6 Number of bits to use for ASLR of mmap base address (ARCH_MMAP_RND_BITS) [0] (NEW) 7 Number of bits to use for ASLR of mmap base address (ARCH_MMAP_RND_BITS) [0] (NEW) 8 Number of bits to use for ASLR of mmap base address (ARCH_MMAP_RND_BITS) [0] (NEW) 19 Number of bits to use for ASLR of mmap base address (ARCH_MMAP_RND_BITS) [0] (NEW) 18 when trying to compile riscv images. Plus, of course, all automatic builders bail out as result. Guenter
Re: [PATCH v5 14/14] riscv: Make mmap allocation top-down by default
On 7/30/19 1:51 AM, Alexandre Ghiti wrote: In order to avoid wasting user address space by using bottom-up mmap allocation scheme, prefer top-down scheme when possible. Before: root@qemuriscv64:~# cat /proc/self/maps 0001-00016000 r-xp fe:00 6389 /bin/cat.coreutils 00016000-00017000 r--p 5000 fe:00 6389 /bin/cat.coreutils 00017000-00018000 rw-p 6000 fe:00 6389 /bin/cat.coreutils 00018000-00039000 rw-p 00:00 0 [heap] 156000-16d000 r-xp fe:00 7193 /lib/ld-2.28.so 16d000-16e000 r--p 00016000 fe:00 7193 /lib/ld-2.28.so 16e000-16f000 rw-p 00017000 fe:00 7193 /lib/ld-2.28.so 16f000-17 rw-p 00:00 0 17-172000 r-xp 00:00 0 [vdso] 174000-176000 rw-p 00:00 0 176000-1555674000 r-xp fe:00 7187 /lib/libc-2.28.so 1555674000-1555678000 r--p 000fd000 fe:00 7187 /lib/libc-2.28.so 1555678000-155567a000 rw-p 00101000 fe:00 7187 /lib/libc-2.28.so 155567a000-15556a rw-p 00:00 0 3fffb9-3fffbb1000 rw-p 00:00 0 [stack] After: root@qemuriscv64:~# cat /proc/self/maps 0001-00016000 r-xp fe:00 6389 /bin/cat.coreutils 00016000-00017000 r--p 5000 fe:00 6389 /bin/cat.coreutils 00017000-00018000 rw-p 6000 fe:00 6389 /bin/cat.coreutils 2de81000-2dea2000 rw-p 00:00 0 [heap] 3ff7eb6000-3ff7ed8000 rw-p 00:00 0 3ff7ed8000-3ff7fd6000 r-xp fe:00 7187 /lib/libc-2.28.so 3ff7fd6000-3ff7fda000 r--p 000fd000 fe:00 7187 /lib/libc-2.28.so 3ff7fda000-3ff7fdc000 rw-p 00101000 fe:00 7187 /lib/libc-2.28.so 3ff7fdc000-3ff7fe2000 rw-p 00:00 0 3ff7fe4000-3ff7fe6000 r-xp 00:00 0 [vdso] 3ff7fe6000-3ff7ffd000 r-xp fe:00 7193 /lib/ld-2.28.so 3ff7ffd000-3ff7ffe000 r--p 00016000 fe:00 7193 /lib/ld-2.28.so 3ff7ffe000-3ff7fff000 rw-p 00017000 fe:00 7193 /lib/ld-2.28.so 3ff7fff000-3ff800 rw-p 00:00 0 3fff888000-3fff8a9000 rw-p 00:00 0 [stack] Signed-off-by: Alexandre Ghiti Reviewed-by: Christoph Hellwig Reviewed-by: Kees Cook Reviewed-by: Luis Chamberlain --- arch/riscv/Kconfig | 13 + 1 file changed, 13 insertions(+) diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig index 8ef64fe2c2b3..8d0d8af1a744 100644 --- a/arch/riscv/Kconfig +++ b/arch/riscv/Kconfig @@ -54,6 +54,19 @@ config RISCV select EDAC_SUPPORT select ARCH_HAS_GIGANTIC_PAGE select ARCH_WANT_HUGE_PMD_SHARE if 64BIT + select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT if MMU + select HAVE_ARCH_MMAP_RND_BITS + +config ARCH_MMAP_RND_BITS_MIN + default 18 if 64BIT + default 8 + +# max bits determined by the following formula: +# VA_BITS - PAGE_SHIFT - 3 +config ARCH_MMAP_RND_BITS_MAX + default 33 if RISCV_VM_SV48 + default 24 if RISCV_VM_SV39 + default 17 if RISCV_VM_SV32 config MMU def_bool y Hi Andrew, I have just seen you took this series into mmotm but without Paul's patch ("riscv: kbuild: add virtual memory system selection") on which this commit relies, I'm not sure it could compile without it as there is no default for ARCH_MMAP_RND_BITS_MAX. Thanks, Alex
[PATCH v5 14/14] riscv: Make mmap allocation top-down by default
In order to avoid wasting user address space by using bottom-up mmap allocation scheme, prefer top-down scheme when possible. Before: root@qemuriscv64:~# cat /proc/self/maps 0001-00016000 r-xp fe:00 6389 /bin/cat.coreutils 00016000-00017000 r--p 5000 fe:00 6389 /bin/cat.coreutils 00017000-00018000 rw-p 6000 fe:00 6389 /bin/cat.coreutils 00018000-00039000 rw-p 00:00 0 [heap] 156000-16d000 r-xp fe:00 7193 /lib/ld-2.28.so 16d000-16e000 r--p 00016000 fe:00 7193 /lib/ld-2.28.so 16e000-16f000 rw-p 00017000 fe:00 7193 /lib/ld-2.28.so 16f000-17 rw-p 00:00 0 17-172000 r-xp 00:00 0 [vdso] 174000-176000 rw-p 00:00 0 176000-1555674000 r-xp fe:00 7187 /lib/libc-2.28.so 1555674000-1555678000 r--p 000fd000 fe:00 7187 /lib/libc-2.28.so 1555678000-155567a000 rw-p 00101000 fe:00 7187 /lib/libc-2.28.so 155567a000-15556a rw-p 00:00 0 3fffb9-3fffbb1000 rw-p 00:00 0 [stack] After: root@qemuriscv64:~# cat /proc/self/maps 0001-00016000 r-xp fe:00 6389 /bin/cat.coreutils 00016000-00017000 r--p 5000 fe:00 6389 /bin/cat.coreutils 00017000-00018000 rw-p 6000 fe:00 6389 /bin/cat.coreutils 2de81000-2dea2000 rw-p 00:00 0 [heap] 3ff7eb6000-3ff7ed8000 rw-p 00:00 0 3ff7ed8000-3ff7fd6000 r-xp fe:00 7187 /lib/libc-2.28.so 3ff7fd6000-3ff7fda000 r--p 000fd000 fe:00 7187 /lib/libc-2.28.so 3ff7fda000-3ff7fdc000 rw-p 00101000 fe:00 7187 /lib/libc-2.28.so 3ff7fdc000-3ff7fe2000 rw-p 00:00 0 3ff7fe4000-3ff7fe6000 r-xp 00:00 0 [vdso] 3ff7fe6000-3ff7ffd000 r-xp fe:00 7193 /lib/ld-2.28.so 3ff7ffd000-3ff7ffe000 r--p 00016000 fe:00 7193 /lib/ld-2.28.so 3ff7ffe000-3ff7fff000 rw-p 00017000 fe:00 7193 /lib/ld-2.28.so 3ff7fff000-3ff800 rw-p 00:00 0 3fff888000-3fff8a9000 rw-p 00:00 0 [stack] Signed-off-by: Alexandre Ghiti Reviewed-by: Christoph Hellwig Reviewed-by: Kees Cook Reviewed-by: Luis Chamberlain --- arch/riscv/Kconfig | 13 + 1 file changed, 13 insertions(+) diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig index 8ef64fe2c2b3..8d0d8af1a744 100644 --- a/arch/riscv/Kconfig +++ b/arch/riscv/Kconfig @@ -54,6 +54,19 @@ config RISCV select EDAC_SUPPORT select ARCH_HAS_GIGANTIC_PAGE select ARCH_WANT_HUGE_PMD_SHARE if 64BIT + select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT if MMU + select HAVE_ARCH_MMAP_RND_BITS + +config ARCH_MMAP_RND_BITS_MIN + default 18 if 64BIT + default 8 + +# max bits determined by the following formula: +# VA_BITS - PAGE_SHIFT - 3 +config ARCH_MMAP_RND_BITS_MAX + default 33 if RISCV_VM_SV48 + default 24 if RISCV_VM_SV39 + default 17 if RISCV_VM_SV32 config MMU def_bool y -- 2.20.1