diff options
author | Arnd Bergmann <arnd@arndb.de> | 2019-08-03 00:49:02 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-08-03 10:02:01 -0400 |
commit | ee38d94a0ad89890b770f6c876263cf9fcbfde84 (patch) | |
tree | 1edc9c9137d2412e35dc9f332dce76e1ff96e99d /include/linux/page-flags-layout.h | |
parent | af700eaed0564d5d3963a7a51cb0843629d7fe3d (diff) |
page flags: prioritize kasan bits over last-cpuid
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>
Diffstat (limited to 'include/linux/page-flags-layout.h')
-rw-r--r-- | include/linux/page-flags-layout.h | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/include/linux/page-flags-layout.h b/include/linux/page-flags-layout.h index 1dda31825ec4..71283739ffd2 100644 --- a/include/linux/page-flags-layout.h +++ b/include/linux/page-flags-layout.h | |||
@@ -32,6 +32,7 @@ | |||
32 | 32 | ||
33 | #endif /* CONFIG_SPARSEMEM */ | 33 | #endif /* CONFIG_SPARSEMEM */ |
34 | 34 | ||
35 | #ifndef BUILD_VDSO32_64 | ||
35 | /* | 36 | /* |
36 | * page->flags layout: | 37 | * page->flags layout: |
37 | * | 38 | * |
@@ -76,20 +77,22 @@ | |||
76 | #define LAST_CPUPID_SHIFT 0 | 77 | #define LAST_CPUPID_SHIFT 0 |
77 | #endif | 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 | #define LAST_CPUPID_WIDTH LAST_CPUPID_SHIFT | 88 | #define LAST_CPUPID_WIDTH LAST_CPUPID_SHIFT |
81 | #else | 89 | #else |
82 | #define LAST_CPUPID_WIDTH 0 | 90 | #define LAST_CPUPID_WIDTH 0 |
83 | #endif | 91 | #endif |
84 | 92 | ||
85 | #ifdef CONFIG_KASAN_SW_TAGS | ||
86 | #define KASAN_TAG_WIDTH 8 | ||
87 | #if SECTIONS_WIDTH+NODES_WIDTH+ZONES_WIDTH+LAST_CPUPID_WIDTH+KASAN_TAG_WIDTH \ | 93 | #if SECTIONS_WIDTH+NODES_WIDTH+ZONES_WIDTH+LAST_CPUPID_WIDTH+KASAN_TAG_WIDTH \ |
88 | > BITS_PER_LONG - NR_PAGEFLAGS | 94 | > BITS_PER_LONG - NR_PAGEFLAGS |
89 | #error "KASAN: not enough bits in page flags for tag" | 95 | #error "Not enough bits in page flags" |
90 | #endif | ||
91 | #else | ||
92 | #define KASAN_TAG_WIDTH 0 | ||
93 | #endif | 96 | #endif |
94 | 97 | ||
95 | /* | 98 | /* |
@@ -104,4 +107,5 @@ | |||
104 | #define LAST_CPUPID_NOT_IN_PAGE_FLAGS | 107 | #define LAST_CPUPID_NOT_IN_PAGE_FLAGS |
105 | #endif | 108 | #endif |
106 | 109 | ||
110 | #endif | ||
107 | #endif /* _LINUX_PAGE_FLAGS_LAYOUT */ | 111 | #endif /* _LINUX_PAGE_FLAGS_LAYOUT */ |