Re: [PATCH] arm64: Support ARM64_VA_BITS=52 when setting ARCH_MMAP_RND_BITS_MAX
From: Kornel Dulęba
Date: Fri Apr 04 2025 - 12:47:04 EST
On Thu, Apr 3, 2025 at 11:46 PM Anshuman Khandual
<anshuman.khandual@xxxxxxx> wrote:
>
>
>
> On 4/4/25 00:06, Kornel Dulęba wrote:
> > When the 52-bit virtual addressing was enabled the select like
> > ARCH_MMAP_RND_BITS_MAX logic was never updated to account for it.
> > Because of that the rnd max bits would be set to the default value of
> > 18 when ARM64_VA_BITS=52.
> > Fix this by setting ARCH_MMAP_RND_BITS_MAX to the same value that would
> > be used if 48-bit addressing was used. That's because the 52-bit
> > addressing is used only if the caller provides a hint to mmap, with a
> > fallback to 48-bit addressing.
>
> Why should ARCH_MMAP_RND_BITS_MAX value be same for both 48 bits and 52
> bits VA in case the user does request for 52 bit VA via mmap() hint and
> the HW supports it ?
Two reasons really.
1. The whole behavior is controlled through a global knob -
/proc/sys/vm/mmap_rnd_bits. ARCH_MMAP_RND_BITS_MAX is used as an upper
bound for the value that can be set to that knob.
So we have a single setting for all processes. Some might want 52 bit
addressing, others will stick with 48.
2. Quoting the documentation for this knob:
"""
mmap_rnd_bits
This value can be used to select the number of bits to use to
determine the random offset to the base address of vma regions
resulting from mmap allocations on architectures which support tuning
address space randomization. This value will be bounded by the
architecture’s minimum and maximum supported values.
"""
I suppose that it's legal for some calls to mmap from the same process
to request a 52 bit VA, while other calls will want only 48 bits.
Because of that the random offset can't be larger than what would work
for the 48 bit case.
>
> >
> > Fixes: b6d00d47e81a ("arm64: mm: Introduce 52-bit Kernel VAs")
> > Signed-off-by: Kornel Dulęba <korneld@xxxxxxxxxx>
> > ---
> > arch/arm64/Kconfig | 6 +++---
> > 1 file changed, 3 insertions(+), 3 deletions(-)
> >
> > diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
> > index 748c34dc953c..38e0bac567f5 100644
> > --- a/arch/arm64/Kconfig
> > +++ b/arch/arm64/Kconfig
> > @@ -332,9 +332,9 @@ config ARCH_MMAP_RND_BITS_MAX
> > default 24 if ARM64_VA_BITS=39
> > default 27 if ARM64_VA_BITS=42
> > default 30 if ARM64_VA_BITS=47
> > - default 29 if ARM64_VA_BITS=48 && ARM64_64K_PAGES
> > - default 31 if ARM64_VA_BITS=48 && ARM64_16K_PAGES
> > - default 33 if ARM64_VA_BITS=48
> > + default 29 if (ARM64_VA_BITS=48 || ARM64_VA_BITS=52) && ARM64_64K_PAGES
> > + default 31 if (ARM64_VA_BITS=48 || ARM64_VA_BITS=52) && ARM64_16K_PAGES
> > + default 33 if (ARM64_VA_BITS=48 || ARM64_VA_BITS=52)
> > default 14 if ARM64_64K_PAGES
> > default 16 if ARM64_16K_PAGES
> > default 18