]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
s390/mm: define KMSAN metadata for vmalloc and modules
authorIlya Leoshkevich <iii@linux.ibm.com>
Fri, 21 Jun 2024 11:35:15 +0000 (13:35 +0200)
committerAndrew Morton <akpm@linux-foundation.org>
Thu, 4 Jul 2024 02:30:25 +0000 (19:30 -0700)
The pages for the KMSAN metadata associated with most kernel mappings are
taken from memblock by the common code.  However, vmalloc and module
metadata needs to be defined by the architectures.

Be a little bit more careful than x86: allocate exactly MODULES_LEN for
the module shadow and origins, and then take 2/3 of vmalloc for the
vmalloc shadow and origins.  This ensures that users passing small
vmalloc= values on the command line do not cause module metadata
collisions.

Link: https://lkml.kernel.org/r/20240621113706.315500-32-iii@linux.ibm.com
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
Reviewed-by: Alexander Potapenko <glider@google.com>
Acked-by: Alexander Gordeev <agordeev@linux.ibm.com>
Acked-by: Heiko Carstens <hca@linux.ibm.com>
Cc: Christian Borntraeger <borntraeger@linux.ibm.com>
Cc: Christoph Lameter <cl@linux.com>
Cc: David Rientjes <rientjes@google.com>
Cc: Dmitry Vyukov <dvyukov@google.com>
Cc: Hyeonggon Yoo <42.hyeyoo@gmail.com>
Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Cc: <kasan-dev@googlegroups.com>
Cc: Marco Elver <elver@google.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Roman Gushchin <roman.gushchin@linux.dev>
Cc: Steven Rostedt (Google) <rostedt@goodmis.org>
Cc: Sven Schnelle <svens@linux.ibm.com>
Cc: Vasily Gorbik <gor@linux.ibm.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
arch/s390/boot/startup.c
arch/s390/include/asm/pgtable.h

index 5a36d5538dae86f42777d2ba15bde89c6c678227..4ff3126320f11203cb596042ccd2829506ad1d9d 100644 (file)
@@ -304,11 +304,18 @@ static unsigned long setup_kernel_memory_layout(unsigned long kernel_size)
        MODULES_END = round_down(kernel_start, _SEGMENT_SIZE);
        MODULES_VADDR = MODULES_END - MODULES_LEN;
        VMALLOC_END = MODULES_VADDR;
+       if (IS_ENABLED(CONFIG_KMSAN))
+               VMALLOC_END -= MODULES_LEN * 2;
 
        /* allow vmalloc area to occupy up to about 1/2 of the rest virtual space left */
        vsize = (VMALLOC_END - FIXMAP_SIZE) / 2;
        vsize = round_down(vsize, _SEGMENT_SIZE);
        vmalloc_size = min(vmalloc_size, vsize);
+       if (IS_ENABLED(CONFIG_KMSAN)) {
+               /* take 2/3 of vmalloc area for KMSAN shadow and origins */
+               vmalloc_size = round_down(vmalloc_size / 3, _SEGMENT_SIZE);
+               VMALLOC_END -= vmalloc_size * 2;
+       }
        VMALLOC_START = VMALLOC_END - vmalloc_size;
 
        __memcpy_real_area = round_down(VMALLOC_START - MEMCPY_REAL_SIZE, PAGE_SIZE);
index 70b6ee557eb2246be9d06e76ded170f0a9b974b6..fb6870384b979b214807b80a6a6d9f0653b24e25 100644 (file)
@@ -107,6 +107,18 @@ static inline int is_module_addr(void *addr)
        return 1;
 }
 
+#ifdef CONFIG_KMSAN
+#define KMSAN_VMALLOC_SIZE (VMALLOC_END - VMALLOC_START)
+#define KMSAN_VMALLOC_SHADOW_START VMALLOC_END
+#define KMSAN_VMALLOC_SHADOW_END (KMSAN_VMALLOC_SHADOW_START + KMSAN_VMALLOC_SIZE)
+#define KMSAN_VMALLOC_ORIGIN_START KMSAN_VMALLOC_SHADOW_END
+#define KMSAN_VMALLOC_ORIGIN_END (KMSAN_VMALLOC_ORIGIN_START + KMSAN_VMALLOC_SIZE)
+#define KMSAN_MODULES_SHADOW_START KMSAN_VMALLOC_ORIGIN_END
+#define KMSAN_MODULES_SHADOW_END (KMSAN_MODULES_SHADOW_START + MODULES_LEN)
+#define KMSAN_MODULES_ORIGIN_START KMSAN_MODULES_SHADOW_END
+#define KMSAN_MODULES_ORIGIN_END (KMSAN_MODULES_ORIGIN_START + MODULES_LEN)
+#endif
+
 #ifdef CONFIG_RANDOMIZE_BASE
 #define KASLR_LEN      (1UL << 31)
 #else