ARM64 randdconfig builds regularly run into a build error, especially when NUMA_BALANCING and SPARSEMEM are enabled but not SPARSEMEM_VMEMMAP: #error "KASAN: not enough bits in page flags for tag" The last-cpuid bits are already contitional on the available space, so the result of the calculation is a bit random on whether they were already left out or not. Adding the kasan tag bits before last-cpuid makes it much more likely to end up with a successful build here, and should be reliable for randconfig at least, as long as that does not randomize NR_CPUS or NODES_SHIFT but uses the defaults. In order for the modified check to not trigger in the x86 vdso32 code where all constants are wrong (building with -m32), enclose all the definitions with an #ifdef. [arnd@arndb.de: build fix] Link: http://lkml.kernel.org/r/CAK8P3a3Mno1SWTcuAOT0Wa9VS15pdU6EfnkxLbDpyS55yO04+g@mail.gmail.com Link: http://lkml.kernel.org/r/20190722115520.3743282-1-arnd@arndb.de Link: https://lore.kernel.org/lkml/20190618095347.3850490-1-arnd@arndb.de/ Fixes: 2813b9c02962 ("kasan, mm, arm64: tag non slab memory allocated via pagealloc") Signed-off-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Arnd Bergmann <arnd@arndb.de> Reviewed-by: Andrey Konovalov <andreyknvl@google.com> Reviewed-by: Andrey Ryabinin <aryabinin@virtuozzo.com> Cc: Andrey Konovalov <andreyknvl@google.com> Cc: Dmitry Vyukov <dvyukov@google.com> Cc: Will Deacon <will.deacon@arm.com> Cc: Christoph Lameter <cl@linux.com> Cc: Mark Rutland <mark.rutland@arm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing the changes to include/linux (1 of 2 files). Show all
Unified · Split
| @@ -32,6 +32,7 @@ · 31 unmodified lines | ||
| 32 | 32 | |
| 33 | 33 | #endif /* CONFIG_SPARSEMEM */ |
| 34 | 34 | |
| 35 | +#ifndef BUILD_VDSO32_64 | |
| 35 | 36 | /* |
| 36 | 37 | * page->flags layout: |
| 37 | 38 | * |
| @@ -76,20 +77,22 @@ · 38 unmodified lines | ||
| 76 | 77 | #define LAST_CPUPID_SHIFT 0 |
| 77 | 78 | #endif |
| 78 | 79 | |
| 79 | −#if SECTIONS_WIDTH+ZONES_WIDTH+NODES_SHIFT+LAST_CPUPID_SHIFT <= BITS_PER_LONG - NR_PAGEFLAGS | |
| 80 | +#ifdef CONFIG_KASAN_SW_TAGS | |
| 81 | +#define KASAN_TAG_WIDTH 8 | |
| 82 | +#else | |
| 83 | +#define KASAN_TAG_WIDTH 0 | |
| 84 | +#endif | |
| 85 | + | |
| 86 | +#if SECTIONS_WIDTH+ZONES_WIDTH+NODES_SHIFT+LAST_CPUPID_SHIFT+KASAN_TAG_WIDTH \ | |
| 87 | + <= BITS_PER_LONG - NR_PAGEFLAGS | |
| 80 | 88 | #define LAST_CPUPID_WIDTH LAST_CPUPID_SHIFT |
| 81 | 89 | #else |
| 82 | 90 | #define LAST_CPUPID_WIDTH 0 |
| 83 | 91 | #endif |
| 84 | 92 | |
| 85 | −#ifdef CONFIG_KASAN_SW_TAGS | |
| 86 | −#define KASAN_TAG_WIDTH 8 | |
| 87 | 93 | #if SECTIONS_WIDTH+NODES_WIDTH+ZONES_WIDTH+LAST_CPUPID_WIDTH+KASAN_TAG_WIDTH \ |
| 88 | 94 | > BITS_PER_LONG - NR_PAGEFLAGS |
| 89 | −#error "KASAN: not enough bits in page flags for tag" | |
| 90 | −#endif | |
| 91 | −#else | |
| 92 | −#define KASAN_TAG_WIDTH 0 | |
| 95 | +#error "Not enough bits in page flags" | |
| 93 | 96 | #endif |
| 94 | 97 | |
| 95 | 98 | /* |
| @@ -104,4 +107,5 @@ · 8 unmodified lines | ||
| 104 | 107 | #define LAST_CPUPID_NOT_IN_PAGE_FLAGS |
| 105 | 108 | #endif |
| 106 | 109 | |
| 110 | +#endif | |
| 107 | 111 | #endif /* _LINUX_PAGE_FLAGS_LAYOUT */ |