]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
s390/boot: Allow KASAN mapping to fallback to small pages
authorVasily Gorbik <gor@linux.ibm.com>
Tue, 10 Dec 2024 10:18:32 +0000 (11:18 +0100)
committerAlexander Gordeev <agordeev@linux.ibm.com>
Sun, 26 Jan 2025 16:23:59 +0000 (17:23 +0100)
For KASAN shadow mappings, switch from physmem_alloc_or_die() to
physmem_alloc() and return INVALID_PHYS_ADDR on allocation failure. This
allows gracefully falling back from large pages to smaller pages (1MB
or 4KB) if the allocation of 2GB size/aligned pages cannot be fulfilled.

Reviewed-by: Alexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
arch/s390/boot/vmem.c

index 3e69e4405d70b5eecba926e7301396c5ec98f11b..47011b5a9e3d2935054f98a5318151905be04751 100644 (file)
@@ -247,9 +247,13 @@ static unsigned long resolve_pa_may_alloc(unsigned long addr, unsigned long size
                return __identity_pa(addr);
 #ifdef CONFIG_KASAN
        case POPULATE_KASAN_MAP_SHADOW:
-               addr = physmem_alloc_or_die(RR_VMEM, size, size);
-               memset((void *)addr, 0, size);
-               return addr;
+               /* Allow to fail large page allocations, this will fall back to 1mb/4k pages */
+               addr = physmem_alloc(RR_VMEM, size, size, size == PAGE_SIZE);
+               if (addr) {
+                       memset((void *)addr, 0, size);
+                       return addr;
+               }
+               return INVALID_PHYS_ADDR;
 #endif
        default:
                return INVALID_PHYS_ADDR;