arm64: mm: tidy up top of kernel VA space
authorArd Biesheuvel <ardb@kernel.org>
Thu, 8 Oct 2020 15:36:02 +0000 (17:36 +0200)
committerCatalin Marinas <catalin.marinas@arm.com>
Mon, 9 Nov 2020 17:15:37 +0000 (17:15 +0000)
Tidy up the way the top of the kernel VA space is organized, by mirroring
the 256 MB region we have below the vmalloc space, and populating it top
down with the PCI I/O space, some guard regions, and the fixmap region.
The latter region is itself populated top down, and today only covers
about 4 MB, and so 224 MB is ample, and no guard region is therefore
required.

The resulting layout is identical between 48-bit/4k and 52-bit/64k
configurations.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Reviewed-by: Steve Capper <steve.capper@arm.com>
Link: https://lore.kernel.org/r/20201008153602.9467-5-ardb@kernel.org
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Documentation/arm64/memory.rst
arch/arm64/include/asm/memory.h
arch/arm64/include/asm/pgtable.h

index 476edb6..3d62604 100644 (file)
@@ -35,12 +35,11 @@ AArch64 Linux memory layout with 4KB pages + 4 levels (48-bit)::
 [ ffff600000000000     ffff7fffffffffff ]        32TB          [ kasan shadow region ]
   ffff800000000000     ffff800007ffffff         128MB          bpf jit region
   ffff800008000000     ffff80000fffffff         128MB          modules
-  ffff800010000000     fffffbffbffeffff         123TB          vmalloc
-  fffffbffbfff0000     fffffbfffe7f8fff        ~998MB          [guard region]
-  fffffbfffe7f9000     fffffbfffebfffff        4124KB          fixed mappings
-  fffffbfffec00000     fffffbfffedfffff           2MB          [guard region]
-  fffffbfffee00000     fffffbffffdfffff          16MB          PCI I/O space
-  fffffbffffe00000     fffffbffffffffff           2MB          [guard region]
+  ffff800010000000     fffffbffefffffff         124TB          vmalloc
+  fffffbfff0000000     fffffbfffdffffff         224MB          fixed mappings (top down)
+  fffffbfffe000000     fffffbfffe7fffff           8MB          [guard region]
+  fffffbfffe800000     fffffbffff7fffff          16MB          PCI I/O space
+  fffffbffff800000     fffffbffffffffff           8MB          [guard region]
   fffffc0000000000     fffffdffffffffff           2TB          vmemmap
   fffffe0000000000     ffffffffffffffff           2TB          [guard region]
 
@@ -54,12 +53,11 @@ AArch64 Linux memory layout with 64KB pages + 3 levels (52-bit with HW support):
 [ fffd800000000000     ffff7fffffffffff ]       512TB          [ kasan shadow region ]
   ffff800000000000     ffff800007ffffff         128MB          bpf jit region
   ffff800008000000     ffff80000fffffff         128MB          modules
-  ffff800010000000     fffff81ffffeffff         120TB          vmalloc
-  fffff81fffff0000     fffffbfffe38ffff          ~3TB          [guard region]
-  fffffbfffe390000     fffffbfffebfffff        4544KB          fixed mappings
-  fffffbfffec00000     fffffbfffedfffff           2MB          [guard region]
-  fffffbfffee00000     fffffbffffdfffff          16MB          PCI I/O space
-  fffffbffffe00000     fffffbffffffffff           2MB          [guard region]
+  ffff800010000000     fffffbffefffffff         124TB          vmalloc
+  fffffbfff0000000     fffffbfffdffffff         224MB          fixed mappings (top down)
+  fffffbfffe000000     fffffbfffe7fffff           8MB          [guard region]
+  fffffbfffe800000     fffffbffff7fffff          16MB          PCI I/O space
+  fffffbffff800000     fffffbffffffffff           8MB          [guard region]
   fffffc0000000000     ffffffdfffffffff          ~4TB          vmemmap
   ffffffe000000000     ffffffffffffffff         128GB          [guard region]
 
index ecd6342..03e9b11 100644 (file)
@@ -52,9 +52,9 @@
 #define MODULES_VSIZE          (SZ_128M)
 #define VMEMMAP_START          (-(UL(1) << (VA_BITS - VMEMMAP_SHIFT)))
 #define VMEMMAP_END            (VMEMMAP_START + VMEMMAP_SIZE)
-#define PCI_IO_END             (VMEMMAP_START - SZ_2M)
+#define PCI_IO_END             (VMEMMAP_START - SZ_8M)
 #define PCI_IO_START           (PCI_IO_END - PCI_IO_SIZE)
-#define FIXADDR_TOP            (PCI_IO_START - SZ_2M)
+#define FIXADDR_TOP            (VMEMMAP_START - SZ_32M)
 
 #if VA_BITS > 48
 #define VA_BITS_MIN            (48)
index 4ff12a7..ec307b8 100644 (file)
@@ -22,7 +22,7 @@
  *     and fixed mappings
  */
 #define VMALLOC_START          (MODULES_END)
-#define VMALLOC_END            (- PUD_SIZE - VMEMMAP_SIZE - SZ_64K)
+#define VMALLOC_END            (VMEMMAP_START - SZ_256M)
 
 #define vmemmap                        ((struct page *)VMEMMAP_START - (memstart_addr >> PAGE_SHIFT))