diff --git a/patches/arm64-fixes/afa9b48f327c9ef36bfba4c643a29385a633252b.patch b/patches/arm64-fixes/afa9b48f327c9ef36bfba4c643a29385a633252b.patch new file mode 100644 index 00000000..a12f4c04 --- /dev/null +++ b/patches/arm64-fixes/afa9b48f327c9ef36bfba4c643a29385a633252b.patch @@ -0,0 +1,141 @@ +From afa9b48f327c9ef36bfba4c643a29385a633252b Mon Sep 17 00:00:00 2001 +From: Marc Zyngier +Date: Thu, 10 Oct 2024 16:13:26 +0100 +Subject: KVM: arm64: Shave a few bytes from the EL2 idmap code + +Our idmap is becoming too big, to the point where it doesn't fit in +a 4kB page anymore. + +There are some low-hanging fruits though, such as the el2_init_state +horror that is expanded 3 times in the kernel. Let's at least limit +ourselves to two copies, which makes the kernel link again. + +At some point, we'll have to have a better way of doing this. + +Reported-by: Nathan Chancellor +Signed-off-by: Marc Zyngier +Link: https://lore.kernel.org/r/20241009204903.GA3353168@thelio-3990X +--- +Link: https://git.kernel.org/linus/afa9b48f327c9ef36bfba4c643a29385a633252b +--- + arch/arm64/include/asm/kvm_asm.h | 1 + + arch/arm64/kernel/asm-offsets.c | 1 + + arch/arm64/kvm/hyp/nvhe/hyp-init.S | 52 +++++++++++++++++++++----------------- + 3 files changed, 31 insertions(+), 23 deletions(-) + +diff --git a/arch/arm64/include/asm/kvm_asm.h b/arch/arm64/include/asm/kvm_asm.h +index b36a3b6cc01169..67afac659231ed 100644 +--- a/arch/arm64/include/asm/kvm_asm.h ++++ b/arch/arm64/include/asm/kvm_asm.h +@@ -178,6 +178,7 @@ struct kvm_nvhe_init_params { + unsigned long hcr_el2; + unsigned long vttbr; + unsigned long vtcr; ++ unsigned long tmp; + }; + + /* +diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c +index 27de1dddb0abee..b21dd24b8efc3b 100644 +--- a/arch/arm64/kernel/asm-offsets.c ++++ b/arch/arm64/kernel/asm-offsets.c +@@ -146,6 +146,7 @@ int main(void) + DEFINE(NVHE_INIT_HCR_EL2, offsetof(struct kvm_nvhe_init_params, hcr_el2)); + DEFINE(NVHE_INIT_VTTBR, offsetof(struct kvm_nvhe_init_params, vttbr)); + DEFINE(NVHE_INIT_VTCR, offsetof(struct kvm_nvhe_init_params, vtcr)); ++ DEFINE(NVHE_INIT_TMP, offsetof(struct kvm_nvhe_init_params, tmp)); + #endif + #ifdef CONFIG_CPU_PM + DEFINE(CPU_CTX_SP, offsetof(struct cpu_suspend_ctx, sp)); +diff --git a/arch/arm64/kvm/hyp/nvhe/hyp-init.S b/arch/arm64/kvm/hyp/nvhe/hyp-init.S +index 401af1835be6b7..fc186622606767 100644 +--- a/arch/arm64/kvm/hyp/nvhe/hyp-init.S ++++ b/arch/arm64/kvm/hyp/nvhe/hyp-init.S +@@ -24,28 +24,25 @@ + .align 11 + + SYM_CODE_START(__kvm_hyp_init) +- ventry __invalid // Synchronous EL2t +- ventry __invalid // IRQ EL2t +- ventry __invalid // FIQ EL2t +- ventry __invalid // Error EL2t ++ ventry . // Synchronous EL2t ++ ventry . // IRQ EL2t ++ ventry . // FIQ EL2t ++ ventry . // Error EL2t + +- ventry __invalid // Synchronous EL2h +- ventry __invalid // IRQ EL2h +- ventry __invalid // FIQ EL2h +- ventry __invalid // Error EL2h ++ ventry . // Synchronous EL2h ++ ventry . // IRQ EL2h ++ ventry . // FIQ EL2h ++ ventry . // Error EL2h + + ventry __do_hyp_init // Synchronous 64-bit EL1 +- ventry __invalid // IRQ 64-bit EL1 +- ventry __invalid // FIQ 64-bit EL1 +- ventry __invalid // Error 64-bit EL1 ++ ventry . // IRQ 64-bit EL1 ++ ventry . // FIQ 64-bit EL1 ++ ventry . // Error 64-bit EL1 + +- ventry __invalid // Synchronous 32-bit EL1 +- ventry __invalid // IRQ 32-bit EL1 +- ventry __invalid // FIQ 32-bit EL1 +- ventry __invalid // Error 32-bit EL1 +- +-__invalid: +- b . ++ ventry . // Synchronous 32-bit EL1 ++ ventry . // IRQ 32-bit EL1 ++ ventry . // FIQ 32-bit EL1 ++ ventry . // Error 32-bit EL1 + + /* + * Only uses x0..x3 so as to not clobber callee-saved SMCCC registers. +@@ -76,6 +73,13 @@ __do_hyp_init: + eret + SYM_CODE_END(__kvm_hyp_init) + ++SYM_CODE_START_LOCAL(__kvm_init_el2_state) ++ /* Initialize EL2 CPU state to sane values. */ ++ init_el2_state // Clobbers x0..x2 ++ finalise_el2_state ++ ret ++SYM_CODE_END(__kvm_init_el2_state) ++ + /* + * Initialize the hypervisor in EL2. + * +@@ -102,9 +106,12 @@ SYM_CODE_START_LOCAL(___kvm_hyp_init) + // TPIDR_EL2 is used to preserve x0 across the macro maze... + isb + msr tpidr_el2, x0 +- init_el2_state +- finalise_el2_state ++ str lr, [x0, #NVHE_INIT_TMP] ++ ++ bl __kvm_init_el2_state ++ + mrs x0, tpidr_el2 ++ ldr lr, [x0, #NVHE_INIT_TMP] + + 1: + ldr x1, [x0, #NVHE_INIT_TPIDR_EL2] +@@ -199,9 +206,8 @@ SYM_CODE_START_LOCAL(__kvm_hyp_init_cpu) + + 2: msr SPsel, #1 // We want to use SP_EL{1,2} + +- /* Initialize EL2 CPU state to sane values. */ +- init_el2_state // Clobbers x0..x2 +- finalise_el2_state ++ bl __kvm_init_el2_state ++ + __init_el2_nvhe_prepare_eret + + /* Enable MMU, set vectors and stack. */ +-- +cgit 1.2.3-korg + diff --git a/patches/arm64-fixes/series b/patches/arm64-fixes/series index d456184c..444435a5 100644 --- a/patches/arm64-fixes/series +++ b/patches/arm64-fixes/series @@ -1,2 +1,3 @@ 506a1ac4c4464a61e4336e135841067dbc040aaa.patch 20241018_arnd_media_mediatek_vcodec_mark_vdec_vp9_slice_map_counts_eob_coef_noinline.patch +afa9b48f327c9ef36bfba4c643a29385a633252b.patch diff --git a/patches/mainline/series b/patches/mainline/series index af943004..58f6fc1b 100644 --- a/patches/mainline/series +++ b/patches/mainline/series @@ -1,2 +1,2 @@ -20240819_nathan_hexagon_disable_constant_extender_optimization_for_llvm_prior_to_19_1_0.patch 20241018_arnd_media_mediatek_vcodec_mark_vdec_vp9_slice_map_counts_eob_coef_noinline.patch +v2_20241121_nathan_hexagon_disable_constant_extender_optimization_for_llvm_prior_to_19_1_0.patch diff --git a/patches/mainline/20240819_nathan_hexagon_disable_constant_extender_optimization_for_llvm_prior_to_19_1_0.patch b/patches/mainline/v2_20241121_nathan_hexagon_disable_constant_extender_optimization_for_llvm_prior_to_19_1_0.patch similarity index 67% rename from patches/mainline/20240819_nathan_hexagon_disable_constant_extender_optimization_for_llvm_prior_to_19_1_0.patch rename to patches/mainline/v2_20241121_nathan_hexagon_disable_constant_extender_optimization_for_llvm_prior_to_19_1_0.patch index 04b2f681..e07aab71 100644 --- a/patches/mainline/20240819_nathan_hexagon_disable_constant_extender_optimization_for_llvm_prior_to_19_1_0.patch +++ b/patches/mainline/v2_20241121_nathan_hexagon_disable_constant_extender_optimization_for_llvm_prior_to_19_1_0.patch @@ -1,15 +1,16 @@ From git@z Thu Jan 1 00:00:00 1970 -Subject: [PATCH] hexagon: Disable constant extender optimization for LLVM - prior to 19.1.0 +Subject: [PATCH v2] hexagon: Disable constant extender optimization for + LLVM prior to 19.1.0 From: Nathan Chancellor -Date: Mon, 19 Aug 2024 11:16:10 -0700 -Message-Id: <20240819-hexagon-disable-constant-expander-pass-v1-1-36a734e9527d@kernel.org> +Date: Thu, 21 Nov 2024 11:22:18 -0700 +Message-Id: <20241121-hexagon-disable-constant-expander-pass-v2-1-1a92e9afb0f4@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit The Hexagon-specific constant extender optimization in LLVM may crash on -Linux kernel code [1] (such as with a bcachefs change in -next): +Linux kernel code [1], such as fs/bcache/btree_io.c after +commit 32ed4a620c54 ("bcachefs: Btree path tracepoints") in 6.12: clang: llvm/lib/Target/Hexagon/HexagonConstExtenders.cpp:745: bool (anonymous namespace)::HexagonConstExtenders::ExtRoot::operator<(const HCE::ExtRoot &) const: Assertion `ThisB->getParent() == OtherB->getParent()' failed. Stack dump: @@ -26,18 +27,29 @@ This has been resolved in LLVM main (20.0.0) [2] and backported to LLVM constant expander optimization using the '-mllvm' option when using a toolchain that is not fixed. +Cc: stable@vger.kernel.org Link: https://github.com/llvm/llvm-project/issues/99714 [1] Link: https://github.com/llvm/llvm-project/commit/68df06a0b2998765cb0a41353fcf0919bbf57ddb [2] Link: https://github.com/llvm/llvm-project/commit/2ab8d93061581edad3501561722ebd5632d73892 [3] Reviewed-by: Brian Cain -Link: https://lore.kernel.org/r/20240819-hexagon-disable-constant-expander-pass-v1-1-36a734e9527d@kernel.org +Link: https://lore.kernel.org/r/20241121-hexagon-disable-constant-expander-pass-v2-1-1a92e9afb0f4@kernel.org Signed-off-by: Nathan Chancellor +--- +Andrew, can you please take this for 6.13? Our CI continues to hit this. + +Changes in v2: +- Rebase on 6.12 to make sure it is still applicable +- Name exact bcachefs commit that introduces crash now that it is + merged +- Add 'Cc: stable' as this is now visible in a stable release +- Carry forward Brian's reviewed-by +- Link to v1: https://lore.kernel.org/r/20240819-hexagon-disable-constant-expander-pass-v1-1-36a734e9527d@kernel.org --- arch/hexagon/Makefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/arch/hexagon/Makefile b/arch/hexagon/Makefile -index 92d005958dfb..ff172cbe5881 100644 +index 92d005958dfb232d48a4ca843b46262a84a08eb4..ff172cbe5881a074f9d9430c37071992a4c8beac 100644 --- a/arch/hexagon/Makefile +++ b/arch/hexagon/Makefile @@ -32,3 +32,9 @@ KBUILD_LDFLAGS += $(ldflags-y) @@ -52,7 +64,7 @@ index 92d005958dfb..ff172cbe5881 100644 +endif --- -base-commit: 47ac09b91befbb6a235ab620c32af719f8208399 +base-commit: adc218676eef25575469234709c2d87185ca223a change-id: 20240802-hexagon-disable-constant-expander-pass-8b6b61db6afc Best regards, diff --git a/patches/stable/series b/patches/stable/series index 6f68e00b..58f6fc1b 100644 --- a/patches/stable/series +++ b/patches/stable/series @@ -1 +1,2 @@ 20241018_arnd_media_mediatek_vcodec_mark_vdec_vp9_slice_map_counts_eob_coef_noinline.patch +v2_20241121_nathan_hexagon_disable_constant_extender_optimization_for_llvm_prior_to_19_1_0.patch diff --git a/patches/stable/v2_20241121_nathan_hexagon_disable_constant_extender_optimization_for_llvm_prior_to_19_1_0.patch b/patches/stable/v2_20241121_nathan_hexagon_disable_constant_extender_optimization_for_llvm_prior_to_19_1_0.patch new file mode 100644 index 00000000..e07aab71 --- /dev/null +++ b/patches/stable/v2_20241121_nathan_hexagon_disable_constant_extender_optimization_for_llvm_prior_to_19_1_0.patch @@ -0,0 +1,73 @@ +From git@z Thu Jan 1 00:00:00 1970 +Subject: [PATCH v2] hexagon: Disable constant extender optimization for + LLVM prior to 19.1.0 +From: Nathan Chancellor +Date: Thu, 21 Nov 2024 11:22:18 -0700 +Message-Id: <20241121-hexagon-disable-constant-expander-pass-v2-1-1a92e9afb0f4@kernel.org> +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 7bit + +The Hexagon-specific constant extender optimization in LLVM may crash on +Linux kernel code [1], such as fs/bcache/btree_io.c after +commit 32ed4a620c54 ("bcachefs: Btree path tracepoints") in 6.12: + + clang: llvm/lib/Target/Hexagon/HexagonConstExtenders.cpp:745: bool (anonymous namespace)::HexagonConstExtenders::ExtRoot::operator<(const HCE::ExtRoot &) const: Assertion `ThisB->getParent() == OtherB->getParent()' failed. + Stack dump: + 0. Program arguments: clang --target=hexagon-linux-musl ... fs/bcachefs/btree_io.c + 1. parser at end of file + 2. Code generation + 3. Running pass 'Function Pass Manager' on module 'fs/bcachefs/btree_io.c'. + 4. Running pass 'Hexagon constant-extender optimization' on function '@__btree_node_lock_nopath' + +Without assertions enabled, there is just a hang during compilation. + +This has been resolved in LLVM main (20.0.0) [2] and backported to LLVM +19.1.0 but the kernel supports LLVM 13.0.1 and newer, so disable the +constant expander optimization using the '-mllvm' option when using a +toolchain that is not fixed. + +Cc: stable@vger.kernel.org +Link: https://github.com/llvm/llvm-project/issues/99714 [1] +Link: https://github.com/llvm/llvm-project/commit/68df06a0b2998765cb0a41353fcf0919bbf57ddb [2] +Link: https://github.com/llvm/llvm-project/commit/2ab8d93061581edad3501561722ebd5632d73892 [3] +Reviewed-by: Brian Cain +Link: https://lore.kernel.org/r/20241121-hexagon-disable-constant-expander-pass-v2-1-1a92e9afb0f4@kernel.org +Signed-off-by: Nathan Chancellor +--- +Andrew, can you please take this for 6.13? Our CI continues to hit this. + +Changes in v2: +- Rebase on 6.12 to make sure it is still applicable +- Name exact bcachefs commit that introduces crash now that it is + merged +- Add 'Cc: stable' as this is now visible in a stable release +- Carry forward Brian's reviewed-by +- Link to v1: https://lore.kernel.org/r/20240819-hexagon-disable-constant-expander-pass-v1-1-36a734e9527d@kernel.org +--- + arch/hexagon/Makefile | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/arch/hexagon/Makefile b/arch/hexagon/Makefile +index 92d005958dfb232d48a4ca843b46262a84a08eb4..ff172cbe5881a074f9d9430c37071992a4c8beac 100644 +--- a/arch/hexagon/Makefile ++++ b/arch/hexagon/Makefile +@@ -32,3 +32,9 @@ KBUILD_LDFLAGS += $(ldflags-y) + TIR_NAME := r19 + KBUILD_CFLAGS += -ffixed-$(TIR_NAME) -DTHREADINFO_REG=$(TIR_NAME) -D__linux__ + KBUILD_AFLAGS += -DTHREADINFO_REG=$(TIR_NAME) ++ ++# Disable HexagonConstExtenders pass for LLVM versions prior to 19.1.0 ++# https://github.com/llvm/llvm-project/issues/99714 ++ifneq ($(call clang-min-version, 190100),y) ++KBUILD_CFLAGS += -mllvm -hexagon-cext=false ++endif + +--- +base-commit: adc218676eef25575469234709c2d87185ca223a +change-id: 20240802-hexagon-disable-constant-expander-pass-8b6b61db6afc + +Best regards, +-- +Nathan Chancellor +