[PATCH v2 4/4] arm64: mm: tidy up top of kernel VA space

Ard Biesheuvel ardb at kernel.org
Thu Oct 8 11:36:02 EDT 2020


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 at kernel.org>
---
 Documentation/arm64/memory.rst   | 22 +++++++++-----------
 arch/arm64/include/asm/memory.h  |  4 ++--
 arch/arm64/include/asm/pgtable.h |  2 +-
 3 files changed, 13 insertions(+), 15 deletions(-)

diff --git a/Documentation/arm64/memory.rst b/Documentation/arm64/memory.rst
index 476edb6015b2..f4d24753e0e7 100644
--- a/Documentation/arm64/memory.rst
+++ b/Documentation/arm64/memory.rst
@@ -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]
 
diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h
index 39ea35f7e34e..3a32bc9136eb 100644
--- a/arch/arm64/include/asm/memory.h
+++ b/arch/arm64/include/asm/memory.h
@@ -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)
diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h
index 88233d42d9c2..5a3bf92c85e7 100644
--- a/arch/arm64/include/asm/pgtable.h
+++ b/arch/arm64/include/asm/pgtable.h
@@ -21,7 +21,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))
 
-- 
2.17.1




More information about the linux-arm-kernel mailing list