[PATCH v2 2/4] arm64: mm: extend linear region for 52-bit VA configurations

Steve Capper steve.capper at arm.com
Tue Oct 13 13:38:48 EDT 2020


On 13/10/2020 17:57, Ard Biesheuvel wrote:
> On Tue, 13 Oct 2020 at 18:51, Steve Capper <Steve.Capper at arm.com> wrote:
>>
>> Hi Ard,
>>
>> One comment below...
>>
>> On 08/10/2020 16:36, Ard Biesheuvel wrote:
>>> For historical reasons, the arm64 kernel VA space is configured as two
>>> equally sized halves, i.e., on a 48-bit VA build, the VA space is split
>>> into a 47-bit vmalloc region and a 47-bit linear region.
>>>
>>> When support for 52-bit virtual addressing was added, this equal split
>>> was kept, resulting in a substantial waste of virtual address space in
>>> the linear region:
>>>
>>>                              48-bit VA                     52-bit VA
>>>     0xffff_ffff_ffff_ffff +-------------+               +-------------+
>>>                           |   vmalloc   |               |   vmalloc   |
>>>     0xffff_8000_0000_0000 +-------------+ _PAGE_END(48) +-------------+
>>>                           |   linear    |               :             :
>>>     0xffff_0000_0000_0000 +-------------+               :             :
>>>                           :             :               :             :
>>>                           :             :               :             :
>>>                           :             :               :             :
>>>                           :             :               :  currently  :
>>>                           :  unusable   :               :             :
>>>                           :             :               :   unused    :
>>>                           :     by      :               :             :
>>>                           :             :               :             :
>>>                           :  hardware   :               :             :
>>>                           :             :               :             :
>>>     0xfff8_0000_0000_0000 :             : _PAGE_END(52) +-------------+
>>>                           :             :               |             |
>>>                           :             :               |             |
>>>                           :             :               |             |
>>>                           :             :               |             |
>>>                           :             :               |             |
>>>                           :  unusable   :               |             |
>>>                           :             :               |   linear    |
>>>                           :     by      :               |             |
>>>                           :             :               |   region    |
>>>                           :  hardware   :               |             |
>>>                           :             :               |             |
>>>                           :             :               |             |
>>>                           :             :               |             |
>>>                           :             :               |             |
>>>                           :             :               |             |
>>>                           :             :               |             |
>>>     0xfff0_0000_0000_0000 +-------------+  PAGE_OFFSET  +-------------+
>>>
>>> As illustrated above, the 52-bit VA kernel uses 47 bits for the vmalloc
>>> space (as before), to ensure that a single 64k granule kernel image can
>>> support any 64k granule capable system, regardless of whether it supports
>>> the 52-bit virtual addressing extension. However, due to the fact that
>>> the VA space is still split in equal halves, the linear region is only
>>> 2^51 bytes in size, wasting almost half of the 52-bit VA space.
>>>
>>> Let's fix this, by abandoning the equal split, and simply assigning all
>>> VA space outside of the vmalloc region to the linear region.
>>>
>>> The KASAN shadow region is reconfigured so that it ends at the start of
>>> the vmalloc region, and grows downwards. That way, the arrangement of
>>> the vmalloc space (which contains kernel mappings, modules, BPF region,
>>> the vmemmap array etc) is identical between non-KASAN and KASAN builds,
>>> which aids debugging.
>>>
>>> Signed-off-by: Ard Biesheuvel <ardb at kernel.org>
>>> ---
>>>    Documentation/arm64/kasan-offsets.sh |  3 +--
>>>    Documentation/arm64/memory.rst       | 19 +++++++++----------
>>>    arch/arm64/Kconfig                   | 20 ++++++++++----------
>>>    arch/arm64/include/asm/memory.h      | 12 +++++-------
>>>    arch/arm64/mm/init.c                 |  2 +-
>>>    5 files changed, 26 insertions(+), 30 deletions(-)
>>>
>>
>> [...]
>>
>>> diff --git a/Documentation/arm64/memory.rst b/Documentation/arm64/memory.rst
>>> index cf03b3290800..ee51eb66a578 100644
>>> --- a/Documentation/arm64/memory.rst
>>> +++ b/Documentation/arm64/memory.rst
>>> @@ -32,10 +32,10 @@ AArch64 Linux memory layout with 4KB pages + 4 levels (48-bit)::
>>>      -----------------------------------------------------------------------
>>>      0000000000000000  0000ffffffffffff         256TB          user
>>>      ffff000000000000  ffff7fffffffffff         128TB          kernel logical memory map
>>> -  ffff800000000000   ffff9fffffffffff          32TB          kasan shadow region
>>> -  ffffa00000000000   ffffa00007ffffff         128MB          bpf jit region
>>> -  ffffa00008000000   ffffa0000fffffff         128MB          modules
>>> -  ffffa00010000000   fffffdffbffeffff         ~93TB          vmalloc
>>> +[ ffff600000000000   ffff7fffffffffff ]        32TB          [ kasan shadow region ]
>>
>> We have the KASAN shadow region intersecting with the kernel logical
>> memory map now. Could this present a problem if both the KASAN and
>> phys_to_virt paths land on the same VA? Or is that not possible? (Also
>> what about smaller VA sizes?)
>>
>> If it is a problem, could carving out the appropriate memblocks (and
>> warning the user) be a way forward?
>>
> 
> Hi Steve,
> 
> This is currently taken into account in arm64_memblock_init():
> 
> const s64 linear_region_size = PAGE_END - _PAGE_OFFSET(vabits_actual);
> 
> When CONFIG_KASAN=y, PAGE_END is #defined as
> 
> (KASAN_SHADOW_END - (1UL << (vabits_actual - KASAN_SHADOW_SCALE_SHIFT)))
> 
> and so the linear region ends where the KASAN shadow region starts. So
> even if the static definitions overlap, the shared region will not be
> used for mapping memory if it is needed for allocating shadow pages.
> 

Ahhh, yes, thanks that will prevent the intersection from occurring.

This looks good to me, feel free to add:
Reviewed-by: Steve Capper <steve.capper at arm.com>

Cheers,
--
Steve



More information about the linux-arm-kernel mailing list