Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

arm64: insn: avoid circular include dependency

Nathan reports that when building with CONFIG_LTO_CLANG_THIN=y, the
build fails due to BUILD_BUG_ON() not being defined before its uss in
<asm/insn.h>.

The problem is that with LTO, we patch READ_ONCE(), and <asm/rwonce.h>
includes <asm/insn.h>, creating a circular include chain:

<linux/build_bug.h>
<linux/compiler.h>
<asm/rwonce.h>
<asm/alternative-macros.h>
<asm/insn.h>
<linux/build-bug.h>

... and so when <asm/insn.h> includes <linux/build_bug.h>, none of the
BUILD_BUG* definitions have happened yet.

To avoid this, let's move AARCH64_INSN_SIZE into a header without any
dependencies, such that it can always be safely included. At the same
time, avoid including <asm/alternative.h> in <asm/insn.h>, which should
no longer be necessary (and doesn't make sense when insn.h is consumed
by userspace).

Reported-by: Nathan Chancellor <nathan@kernel.org>
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will@kernel.org>
Link: https://lore.kernel.org/r/20210621080830.GA37068@C02TD0UTHF1T.local
Fixes: 3e00e39d9dad ("arm64: insn: move AARCH64_INSN_SIZE into <asm/insn.h>")
Signed-off-by: Will Deacon <will@kernel.org>

authored by

Mark Rutland and committed by
Will Deacon
69bb0585 3e00e39d

+11 -5
+1 -1
arch/arm64/include/asm/alternative-macros.h
··· 3 3 #define __ASM_ALTERNATIVE_MACROS_H 4 4 5 5 #include <asm/cpucaps.h> 6 - #include <asm/insn.h> 6 + #include <asm/insn-def.h> 7 7 8 8 #define ARM64_CB_PATCH ARM64_NCAPS 9 9
+9
arch/arm64/include/asm/insn-def.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + 3 + #ifndef __ASM_INSN_DEF_H 4 + #define __ASM_INSN_DEF_H 5 + 6 + /* A64 instructions are always 32 bits. */ 7 + #define AARCH64_INSN_SIZE 4 8 + 9 + #endif /* __ASM_INSN_DEF_H */
+1 -4
arch/arm64/include/asm/insn.h
··· 10 10 #include <linux/build_bug.h> 11 11 #include <linux/types.h> 12 12 13 - #include <asm/alternative.h> 14 - 15 - /* A64 instructions are always 32 bits. */ 16 - #define AARCH64_INSN_SIZE 4 13 + #include <asm/insn-def.h> 17 14 18 15 #ifndef __ASSEMBLY__ 19 16 /*