Skip to content

Commit ee38d94

Browse files
arndbtorvalds
authored andcommitted
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. [[email protected]: build fix] Link: http://lkml.kernel.org/r/CAK8P3a3Mno1SWTcuAOT0Wa9VS15pdU6EfnkxLbDpyS55yO04+g@mail.gmail.com Link: http://lkml.kernel.org/r/[email protected] Link: https://lore.kernel.org/lkml/[email protected]/ Fixes: 2813b9c ("kasan, mm, arm64: tag non slab memory allocated via pagealloc") Signed-off-by: Arnd Bergmann <[email protected]> Signed-off-by: Arnd Bergmann <[email protected]> Reviewed-by: Andrey Konovalov <[email protected]> Reviewed-by: Andrey Ryabinin <[email protected]> Cc: Andrey Konovalov <[email protected]> Cc: Dmitry Vyukov <[email protected]> Cc: Will Deacon <[email protected]> Cc: Christoph Lameter <[email protected]> Cc: Mark Rutland <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent af700ea commit ee38d94

File tree

2 files changed

+12
-7
lines changed

2 files changed

+12
-7
lines changed

arch/mips/vdso/vdso.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#if _MIPS_SIM != _MIPS_SIM_ABI64 && defined(CONFIG_64BIT)
1010

1111
/* Building 32-bit VDSO for the 64-bit kernel. Fake a 32-bit Kconfig. */
12+
#define BUILD_VDSO32_64
1213
#undef CONFIG_64BIT
1314
#define CONFIG_32BIT 1
1415
#ifndef __ASSEMBLY__

include/linux/page-flags-layout.h

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
#endif /* CONFIG_SPARSEMEM */
3434

35+
#ifndef BUILD_VDSO32_64
3536
/*
3637
* page->flags layout:
3738
*
@@ -76,20 +77,22 @@
7677
#define LAST_CPUPID_SHIFT 0
7778
#endif
7879

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
8088
#define LAST_CPUPID_WIDTH LAST_CPUPID_SHIFT
8189
#else
8290
#define LAST_CPUPID_WIDTH 0
8391
#endif
8492

85-
#ifdef CONFIG_KASAN_SW_TAGS
86-
#define KASAN_TAG_WIDTH 8
8793
#if SECTIONS_WIDTH+NODES_WIDTH+ZONES_WIDTH+LAST_CPUPID_WIDTH+KASAN_TAG_WIDTH \
8894
> 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"
9396
#endif
9497

9598
/*
@@ -104,4 +107,5 @@
104107
#define LAST_CPUPID_NOT_IN_PAGE_FLAGS
105108
#endif
106109

110+
#endif
107111
#endif /* _LINUX_PAGE_FLAGS_LAYOUT */

0 commit comments

Comments
 (0)