From: Greg Kroah-Hartman Date: Wed, 4 Jun 2025 13:15:47 +0000 (+0200) Subject: 6.15-stable patches X-Git-Tag: v6.12.33~30 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=83c63c6103b5b119e41f10f63d81f15d7d75a6f2;p=thirdparty%2Fkernel%2Fstable-queue.git 6.15-stable patches added patches: revert-x86-smp-eliminate-mwait_play_dead_cpuid_hint.patch series tracing-fix-compilation-warning-on-arm32.patch --- diff --git a/queue-6.15/revert-x86-smp-eliminate-mwait_play_dead_cpuid_hint.patch b/queue-6.15/revert-x86-smp-eliminate-mwait_play_dead_cpuid_hint.patch new file mode 100644 index 0000000000..6ab30354c8 --- /dev/null +++ b/queue-6.15/revert-x86-smp-eliminate-mwait_play_dead_cpuid_hint.patch @@ -0,0 +1,123 @@ +From 70523f335734b0b42f97647556d331edf684c7dc Mon Sep 17 00:00:00 2001 +From: "Rafael J. Wysocki" +Date: Thu, 29 May 2025 15:40:43 +0200 +Subject: Revert "x86/smp: Eliminate mwait_play_dead_cpuid_hint()" + +From: Rafael J. Wysocki + +commit 70523f335734b0b42f97647556d331edf684c7dc upstream. + +Revert commit 96040f7273e2 ("x86/smp: Eliminate mwait_play_dead_cpuid_hint()") +because it introduced a significant power regression on systems that +start with "nosmt" in the kernel command line. + +Namely, on such systems, SMT siblings permanently go offline early, +when cpuidle has not been initialized yet, so after the above commit, +hlt_play_dead() is called for them. Later on, when the processor +attempts to enter a deep package C-state, including PC10 which is +requisite for reaching minimum power in suspend-to-idle, it is not +able to do that because of the SMT siblings staying in C1 (which +they have been put into by HLT). + +As a result, the idle power (including power in suspend-to-idle) +rises quite dramatically on those systems with all of the possible +consequences, which (needless to say) may not be expected by their +users. + +This issue is hard to debug and potentially dangerous, so it needs to +be addressed as soon as possible in a way that will work for 6.15.y, +hence the revert. + +Of course, after this revert, the issue that commit 96040f7273e2 +attempted to address will be back and it will need to be fixed again +later. + +Fixes: 96040f7273e2 ("x86/smp: Eliminate mwait_play_dead_cpuid_hint()") +Reported-by: Todd Brandt +Tested-by: Todd Brandt +Cc: 6.15+ # 6.15+ +Signed-off-by: Rafael J. Wysocki +Acked-by: Dave Hansen +Link: https://patch.msgid.link/12674167.O9o76ZdvQC@rjwysocki.net +Signed-off-by: Greg Kroah-Hartman +--- + arch/x86/kernel/smpboot.c | 54 ++++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 47 insertions(+), 7 deletions(-) + +--- a/arch/x86/kernel/smpboot.c ++++ b/arch/x86/kernel/smpboot.c +@@ -1238,10 +1238,6 @@ void play_dead_common(void) + local_irq_disable(); + } + +-/* +- * We need to flush the caches before going to sleep, lest we have +- * dirty data in our caches when we come back up. +- */ + void __noreturn mwait_play_dead(unsigned int eax_hint) + { + struct mwait_cpu_dead *md = this_cpu_ptr(&mwait_cpu_dead); +@@ -1288,6 +1284,50 @@ void __noreturn mwait_play_dead(unsigned + } + + /* ++ * We need to flush the caches before going to sleep, lest we have ++ * dirty data in our caches when we come back up. ++ */ ++static inline void mwait_play_dead_cpuid_hint(void) ++{ ++ unsigned int eax, ebx, ecx, edx; ++ unsigned int highest_cstate = 0; ++ unsigned int highest_subcstate = 0; ++ int i; ++ ++ if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD || ++ boot_cpu_data.x86_vendor == X86_VENDOR_HYGON) ++ return; ++ if (!this_cpu_has(X86_FEATURE_MWAIT)) ++ return; ++ if (!this_cpu_has(X86_FEATURE_CLFLUSH)) ++ return; ++ ++ eax = CPUID_LEAF_MWAIT; ++ ecx = 0; ++ native_cpuid(&eax, &ebx, &ecx, &edx); ++ ++ /* ++ * eax will be 0 if EDX enumeration is not valid. ++ * Initialized below to cstate, sub_cstate value when EDX is valid. ++ */ ++ if (!(ecx & CPUID5_ECX_EXTENSIONS_SUPPORTED)) { ++ eax = 0; ++ } else { ++ edx >>= MWAIT_SUBSTATE_SIZE; ++ for (i = 0; i < 7 && edx; i++, edx >>= MWAIT_SUBSTATE_SIZE) { ++ if (edx & MWAIT_SUBSTATE_MASK) { ++ highest_cstate = i; ++ highest_subcstate = edx & MWAIT_SUBSTATE_MASK; ++ } ++ } ++ eax = (highest_cstate << MWAIT_SUBSTATE_SIZE) | ++ (highest_subcstate - 1); ++ } ++ ++ mwait_play_dead(eax); ++} ++ ++/* + * Kick all "offline" CPUs out of mwait on kexec(). See comment in + * mwait_play_dead(). + */ +@@ -1337,9 +1377,9 @@ void native_play_dead(void) + play_dead_common(); + tboot_shutdown(TB_SHUTDOWN_WFS); + +- /* Below returns only on error. */ +- cpuidle_play_dead(); +- hlt_play_dead(); ++ mwait_play_dead_cpuid_hint(); ++ if (cpuidle_play_dead()) ++ hlt_play_dead(); + } + + #else /* ... !CONFIG_HOTPLUG_CPU */ diff --git a/queue-6.15/series b/queue-6.15/series new file mode 100644 index 0000000000..20a2e4dca3 --- /dev/null +++ b/queue-6.15/series @@ -0,0 +1,2 @@ +tracing-fix-compilation-warning-on-arm32.patch +revert-x86-smp-eliminate-mwait_play_dead_cpuid_hint.patch diff --git a/queue-6.15/tracing-fix-compilation-warning-on-arm32.patch b/queue-6.15/tracing-fix-compilation-warning-on-arm32.patch new file mode 100644 index 0000000000..1784883295 --- /dev/null +++ b/queue-6.15/tracing-fix-compilation-warning-on-arm32.patch @@ -0,0 +1,52 @@ +From 2fbdb6d8e03b70668c0876e635506540ae92ab05 Mon Sep 17 00:00:00 2001 +From: Pan Taixi +Date: Mon, 26 May 2025 09:37:31 +0800 +Subject: tracing: Fix compilation warning on arm32 + +From: Pan Taixi + +commit 2fbdb6d8e03b70668c0876e635506540ae92ab05 upstream. + +On arm32, size_t is defined to be unsigned int, while PAGE_SIZE is +unsigned long. This hence triggers a compilation warning as min() +asserts the type of two operands to be equal. Casting PAGE_SIZE to size_t +solves this issue and works on other target architectures as well. + +Compilation warning details: + +kernel/trace/trace.c: In function 'tracing_splice_read_pipe': +./include/linux/minmax.h:20:28: warning: comparison of distinct pointer types lacks a cast + (!!(sizeof((typeof(x) *)1 == (typeof(y) *)1))) + ^ +./include/linux/minmax.h:26:4: note: in expansion of macro '__typecheck' + (__typecheck(x, y) && __no_side_effects(x, y)) + ^~~~~~~~~~~ + +... + +kernel/trace/trace.c:6771:8: note: in expansion of macro 'min' + min((size_t)trace_seq_used(&iter->seq), + ^~~ + +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/20250526013731.1198030-1-pantaixi@huaweicloud.com +Fixes: f5178c41bb43 ("tracing: Fix oob write in trace_seq_to_buffer()") +Reviewed-by: Jeongjun Park +Signed-off-by: Pan Taixi +Signed-off-by: Steven Rostedt (Google) +Signed-off-by: Greg Kroah-Hartman +--- + kernel/trace/trace.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/kernel/trace/trace.c ++++ b/kernel/trace/trace.c +@@ -6824,7 +6824,7 @@ static ssize_t tracing_splice_read_pipe( + ret = trace_seq_to_buffer(&iter->seq, + page_address(spd.pages[i]), + min((size_t)trace_seq_used(&iter->seq), +- PAGE_SIZE)); ++ (size_t)PAGE_SIZE)); + if (ret < 0) { + __free_page(spd.pages[i]); + break;