]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
6.15-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 4 Jun 2025 13:15:47 +0000 (15:15 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 4 Jun 2025 13:15:47 +0000 (15:15 +0200)
added patches:
revert-x86-smp-eliminate-mwait_play_dead_cpuid_hint.patch
series
tracing-fix-compilation-warning-on-arm32.patch

queue-6.15/revert-x86-smp-eliminate-mwait_play_dead_cpuid_hint.patch [new file with mode: 0644]
queue-6.15/series [new file with mode: 0644]
queue-6.15/tracing-fix-compilation-warning-on-arm32.patch [new file with mode: 0644]

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 (file)
index 0000000..6ab3035
--- /dev/null
@@ -0,0 +1,123 @@
+From 70523f335734b0b42f97647556d331edf684c7dc Mon Sep 17 00:00:00 2001
+From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
+Date: Thu, 29 May 2025 15:40:43 +0200
+Subject: Revert "x86/smp: Eliminate mwait_play_dead_cpuid_hint()"
+
+From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+
+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 <todd.e.brandt@linux.intel.com>
+Tested-by: Todd Brandt <todd.e.brandt@linux.intel.com>
+Cc: 6.15+ <stable@vger.kernel.org> # 6.15+
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Acked-by: Dave Hansen <dave.hansen@linux.intel.com>
+Link: https://patch.msgid.link/12674167.O9o76ZdvQC@rjwysocki.net
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 (file)
index 0000000..20a2e4d
--- /dev/null
@@ -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 (file)
index 0000000..1784883
--- /dev/null
@@ -0,0 +1,52 @@
+From 2fbdb6d8e03b70668c0876e635506540ae92ab05 Mon Sep 17 00:00:00 2001
+From: Pan Taixi <pantaixi@huaweicloud.com>
+Date: Mon, 26 May 2025 09:37:31 +0800
+Subject: tracing: Fix compilation warning on arm32
+
+From: Pan Taixi <pantaixi@huaweicloud.com>
+
+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 <aha310510@gmail.com>
+Signed-off-by: Pan Taixi <pantaixi@huaweicloud.com>
+Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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;