* [PATCH v6 0/4] SRF: Fix offline CPU preventing pc6 entry
@ 2024-11-27 16:15 Patryk Wlazlyn
2024-11-27 16:15 ` [PATCH v6 1/4] x86/smp: Allow calling mwait_play_dead with an arbitrary hint Patryk Wlazlyn
` (4 more replies)
0 siblings, 5 replies; 12+ messages in thread
From: Patryk Wlazlyn @ 2024-11-27 16:15 UTC (permalink / raw)
To: x86
Cc: linux-kernel, linux-pm, rafael.j.wysocki, peterz, dave.hansen,
gautham.shenoy, tglx, len.brown, artem.bityutskiy, patryk.wlazlyn
Changes since v5:
* Split 1/3 from v5 into two commits, as suggestem by Gautham.
1/4 splits wait_play_dead into mwait_play_dead_with_hint.
2/4 and 3/4 uses the new mwait_play_dead_with_hint
4/4 removes mwait_play_dead and calls cpuidle_play_dead right away
* Reword 1-3/4 changelog slightly.
* Move changelog from v5 1/3 into v6 4/4
Patryk Wlazlyn (4):
x86/smp: Allow calling mwait_play_dead with an arbitrary hint
ACPI: processor_idle: Add FFH state handling
intel_idle: Provide the default enter_dead() handler
x86/smp native_play_dead: Prefer cpuidle_play_dead() over
mwait_play_dead()
arch/x86/include/asm/smp.h | 4 ++-
arch/x86/kernel/acpi/cstate.c | 9 +++++++
arch/x86/kernel/smpboot.c | 50 ++++-------------------------------
drivers/acpi/processor_idle.c | 2 ++
drivers/idle/intel_idle.c | 18 +++++++++++--
include/acpi/processor.h | 5 ++++
6 files changed, 40 insertions(+), 48 deletions(-)
--
2.47.1
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v6 1/4] x86/smp: Allow calling mwait_play_dead with an arbitrary hint
2024-11-27 16:15 [PATCH v6 0/4] SRF: Fix offline CPU preventing pc6 entry Patryk Wlazlyn
@ 2024-11-27 16:15 ` Patryk Wlazlyn
2024-11-29 4:27 ` Gautham R. Shenoy
2024-11-27 16:15 ` [PATCH v6 2/4] ACPI: processor_idle: Add FFH state handling Patryk Wlazlyn
` (3 subsequent siblings)
4 siblings, 1 reply; 12+ messages in thread
From: Patryk Wlazlyn @ 2024-11-27 16:15 UTC (permalink / raw)
To: x86
Cc: linux-kernel, linux-pm, rafael.j.wysocki, peterz, dave.hansen,
gautham.shenoy, tglx, len.brown, artem.bityutskiy, patryk.wlazlyn
The MWAIT instruction needs different hints on different CPUs to reach
specific idle states. The current hint calculation in mwait_play_dead()
code works in practice on current Intel hardware, but is not documented
and fails on a recent Intel's Sierra Forest and possibly some future
ones. Those newer CPUs' power efficiency suffers when the CPU is put
offline.
Allow cpuidle code to provide mwait_play_dead with a known hint for
efficient play_dead code.
Signed-off-by: Patryk Wlazlyn <patryk.wlazlyn@linux.intel.com>
---
arch/x86/include/asm/smp.h | 4 +-
arch/x86/kernel/smpboot.c | 86 ++++++++++++++++++++------------------
2 files changed, 49 insertions(+), 41 deletions(-)
diff --git a/arch/x86/include/asm/smp.h b/arch/x86/include/asm/smp.h
index ca073f40698f..ab90b95037f3 100644
--- a/arch/x86/include/asm/smp.h
+++ b/arch/x86/include/asm/smp.h
@@ -114,6 +114,7 @@ void wbinvd_on_cpu(int cpu);
int wbinvd_on_all_cpus(void);
void smp_kick_mwait_play_dead(void);
+void mwait_play_dead_with_hint(unsigned int hint);
void native_smp_send_reschedule(int cpu);
void native_send_call_func_ipi(const struct cpumask *mask);
@@ -151,7 +152,6 @@ static inline struct cpumask *cpu_l2c_shared_mask(int cpu)
{
return per_cpu(cpu_l2c_shared_map, cpu);
}
-
#else /* !CONFIG_SMP */
#define wbinvd_on_cpu(cpu) wbinvd()
static inline int wbinvd_on_all_cpus(void)
@@ -164,6 +164,8 @@ static inline struct cpumask *cpu_llc_shared_mask(int cpu)
{
return (struct cpumask *)cpumask_of(0);
}
+
+static inline void mwait_play_dead_with_hint(unsigned int eax_hint) { }
#endif /* CONFIG_SMP */
#ifdef CONFIG_DEBUG_NMI_SELFTEST
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index b5a8f0891135..ef112143623d 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -1272,13 +1272,57 @@ void play_dead_common(void)
local_irq_disable();
}
+void __noreturn mwait_play_dead_with_hint(unsigned int eax_hint)
+{
+ struct mwait_cpu_dead *md = this_cpu_ptr(&mwait_cpu_dead);
+
+ /* Set up state for the kexec() hack below */
+ md->status = CPUDEAD_MWAIT_WAIT;
+ md->control = CPUDEAD_MWAIT_WAIT;
+
+ wbinvd();
+
+ while (1) {
+ /*
+ * The CLFLUSH is a workaround for erratum AAI65 for
+ * the Xeon 7400 series. It's not clear it is actually
+ * needed, but it should be harmless in either case.
+ * The WBINVD is insufficient due to the spurious-wakeup
+ * case where we return around the loop.
+ */
+ mb();
+ clflush(md);
+ mb();
+ __monitor(md, 0, 0);
+ mb();
+ __mwait(eax_hint, 0);
+
+ if (READ_ONCE(md->control) == CPUDEAD_MWAIT_KEXEC_HLT) {
+ /*
+ * Kexec is about to happen. Don't go back into mwait() as
+ * the kexec kernel might overwrite text and data including
+ * page tables and stack. So mwait() would resume when the
+ * monitor cache line is written to and then the CPU goes
+ * south due to overwritten text, page tables and stack.
+ *
+ * Note: This does _NOT_ protect against a stray MCE, NMI,
+ * SMI. They will resume execution at the instruction
+ * following the HLT instruction and run into the problem
+ * which this is trying to prevent.
+ */
+ WRITE_ONCE(md->status, CPUDEAD_MWAIT_KEXEC_HLT);
+ while(1)
+ native_halt();
+ }
+ }
+}
+
/*
* 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(void)
{
- struct mwait_cpu_dead *md = this_cpu_ptr(&mwait_cpu_dead);
unsigned int eax, ebx, ecx, edx;
unsigned int highest_cstate = 0;
unsigned int highest_subcstate = 0;
@@ -1316,45 +1360,7 @@ static inline void mwait_play_dead(void)
(highest_subcstate - 1);
}
- /* Set up state for the kexec() hack below */
- md->status = CPUDEAD_MWAIT_WAIT;
- md->control = CPUDEAD_MWAIT_WAIT;
-
- wbinvd();
-
- while (1) {
- /*
- * The CLFLUSH is a workaround for erratum AAI65 for
- * the Xeon 7400 series. It's not clear it is actually
- * needed, but it should be harmless in either case.
- * The WBINVD is insufficient due to the spurious-wakeup
- * case where we return around the loop.
- */
- mb();
- clflush(md);
- mb();
- __monitor(md, 0, 0);
- mb();
- __mwait(eax, 0);
-
- if (READ_ONCE(md->control) == CPUDEAD_MWAIT_KEXEC_HLT) {
- /*
- * Kexec is about to happen. Don't go back into mwait() as
- * the kexec kernel might overwrite text and data including
- * page tables and stack. So mwait() would resume when the
- * monitor cache line is written to and then the CPU goes
- * south due to overwritten text, page tables and stack.
- *
- * Note: This does _NOT_ protect against a stray MCE, NMI,
- * SMI. They will resume execution at the instruction
- * following the HLT instruction and run into the problem
- * which this is trying to prevent.
- */
- WRITE_ONCE(md->status, CPUDEAD_MWAIT_KEXEC_HLT);
- while(1)
- native_halt();
- }
- }
+ mwait_play_dead_with_hint(eax);
}
/*
--
2.47.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v6 2/4] ACPI: processor_idle: Add FFH state handling
2024-11-27 16:15 [PATCH v6 0/4] SRF: Fix offline CPU preventing pc6 entry Patryk Wlazlyn
2024-11-27 16:15 ` [PATCH v6 1/4] x86/smp: Allow calling mwait_play_dead with an arbitrary hint Patryk Wlazlyn
@ 2024-11-27 16:15 ` Patryk Wlazlyn
2024-11-28 13:31 ` kernel test robot
` (2 more replies)
2024-11-27 16:15 ` [PATCH v6 3/4] intel_idle: Provide the default enter_dead() handler Patryk Wlazlyn
` (2 subsequent siblings)
4 siblings, 3 replies; 12+ messages in thread
From: Patryk Wlazlyn @ 2024-11-27 16:15 UTC (permalink / raw)
To: x86
Cc: linux-kernel, linux-pm, rafael.j.wysocki, peterz, dave.hansen,
gautham.shenoy, tglx, len.brown, artem.bityutskiy, patryk.wlazlyn
Recent Intel platforms will depend on the idle driver to pass the
correct hint for playing dead via mwait_play_dead_with_hint(). Expand
the existing enter_dead interface with handling for FFH states and pass
the MWAIT hint to the mwait_play_dead code.
Signed-off-by: Patryk Wlazlyn <patryk.wlazlyn@linux.intel.com>
Suggested-by: Gautham R. Shenoy <gautham.shenoy@amd.com>
---
arch/x86/kernel/acpi/cstate.c | 9 +++++++++
drivers/acpi/processor_idle.c | 2 ++
include/acpi/processor.h | 5 +++++
3 files changed, 16 insertions(+)
diff --git a/arch/x86/kernel/acpi/cstate.c b/arch/x86/kernel/acpi/cstate.c
index f3ffd0a3a012..c80a3e6dba5f 100644
--- a/arch/x86/kernel/acpi/cstate.c
+++ b/arch/x86/kernel/acpi/cstate.c
@@ -204,6 +204,15 @@ int acpi_processor_ffh_cstate_probe(unsigned int cpu,
}
EXPORT_SYMBOL_GPL(acpi_processor_ffh_cstate_probe);
+void acpi_processor_ffh_play_dead(struct acpi_processor_cx *cx)
+{
+ unsigned int cpu = smp_processor_id();
+ struct cstate_entry *percpu_entry;
+
+ percpu_entry = per_cpu_ptr(cpu_cstate_entry, cpu);
+ mwait_play_dead_with_hint(percpu_entry->states[cx->index].eax);
+}
+
void __cpuidle acpi_processor_ffh_cstate_enter(struct acpi_processor_cx *cx)
{
unsigned int cpu = smp_processor_id();
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c
index ce728cf7e301..83213fa47c1b 100644
--- a/drivers/acpi/processor_idle.c
+++ b/drivers/acpi/processor_idle.c
@@ -590,6 +590,8 @@ static void acpi_idle_play_dead(struct cpuidle_device *dev, int index)
raw_safe_halt();
else if (cx->entry_method == ACPI_CSTATE_SYSTEMIO) {
io_idle(cx->address);
+ } else if (cx->entry_method == ACPI_CSTATE_FFH) {
+ acpi_processor_ffh_play_dead(cx);
} else
return;
}
diff --git a/include/acpi/processor.h b/include/acpi/processor.h
index a17e97e634a6..63a37e72b721 100644
--- a/include/acpi/processor.h
+++ b/include/acpi/processor.h
@@ -280,6 +280,7 @@ int acpi_processor_ffh_cstate_probe(unsigned int cpu,
struct acpi_processor_cx *cx,
struct acpi_power_register *reg);
void acpi_processor_ffh_cstate_enter(struct acpi_processor_cx *cstate);
+void acpi_processor_ffh_play_dead(struct acpi_processor_cx *cx);
#else
static inline void acpi_processor_power_init_bm_check(struct
acpi_processor_flags
@@ -300,6 +301,10 @@ static inline void acpi_processor_ffh_cstate_enter(struct acpi_processor_cx
{
return;
}
+static inline void acpi_processor_ffh_play_dead(struct acpi_processor_cx *cx)
+{
+ return;
+}
#endif
static inline int call_on_cpu(int cpu, long (*fn)(void *), void *arg,
--
2.47.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v6 3/4] intel_idle: Provide the default enter_dead() handler
2024-11-27 16:15 [PATCH v6 0/4] SRF: Fix offline CPU preventing pc6 entry Patryk Wlazlyn
2024-11-27 16:15 ` [PATCH v6 1/4] x86/smp: Allow calling mwait_play_dead with an arbitrary hint Patryk Wlazlyn
2024-11-27 16:15 ` [PATCH v6 2/4] ACPI: processor_idle: Add FFH state handling Patryk Wlazlyn
@ 2024-11-27 16:15 ` Patryk Wlazlyn
2024-11-27 16:15 ` [PATCH v6 4/4] x86/smp native_play_dead: Prefer cpuidle_play_dead() over mwait_play_dead() Patryk Wlazlyn
2024-12-09 10:16 ` [PATCH v6 0/4] SRF: Fix offline CPU preventing pc6 entry Gautham R. Shenoy
4 siblings, 0 replies; 12+ messages in thread
From: Patryk Wlazlyn @ 2024-11-27 16:15 UTC (permalink / raw)
To: x86
Cc: linux-kernel, linux-pm, rafael.j.wysocki, peterz, dave.hansen,
gautham.shenoy, tglx, len.brown, artem.bityutskiy, patryk.wlazlyn
Recent Intel platforms require idle driver to provide information about
the MWAIT hint used to enter the deepest idle state in the play_dead
code.
Provide the default enter_dead() handler for all of the platforms and
allow overwriting with a custom handler for each platform if needed.
Signed-off-by: Patryk Wlazlyn <patryk.wlazlyn@linux.intel.com>
---
drivers/idle/intel_idle.c | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c
index ac4d8faa3886..291efa733356 100644
--- a/drivers/idle/intel_idle.c
+++ b/drivers/idle/intel_idle.c
@@ -56,6 +56,7 @@
#include <asm/mwait.h>
#include <asm/spec-ctrl.h>
#include <asm/fpu/api.h>
+#include <asm/smp.h>
#define INTEL_IDLE_VERSION "0.5.1"
@@ -227,6 +228,16 @@ static __cpuidle int intel_idle_s2idle(struct cpuidle_device *dev,
return 0;
}
+static __cpuidle void intel_idle_enter_dead(struct cpuidle_device *dev,
+ int index)
+{
+ struct cpuidle_driver *drv = cpuidle_get_cpu_driver(dev);
+ struct cpuidle_state *state = &drv->states[index];
+ unsigned long eax = flg2MWAIT(state->flags);
+
+ mwait_play_dead_with_hint(eax);
+}
+
/*
* States are indexed by the cstate number,
* which is also the index into the MWAIT hint array.
@@ -1798,6 +1809,7 @@ static void __init intel_idle_init_cstates_acpi(struct cpuidle_driver *drv)
state->flags |= CPUIDLE_FLAG_TIMER_STOP;
state->enter = intel_idle;
+ state->enter_dead = intel_idle_enter_dead;
state->enter_s2idle = intel_idle_s2idle;
}
}
@@ -2143,10 +2155,12 @@ static void __init intel_idle_init_cstates_icpu(struct cpuidle_driver *drv)
if (intel_idle_max_cstate_reached(cstate))
break;
- if (!cpuidle_state_table[cstate].enter &&
- !cpuidle_state_table[cstate].enter_s2idle)
+ if (!cpuidle_state_table[cstate].enter)
break;
+ if (!cpuidle_state_table[cstate].enter_dead)
+ cpuidle_state_table[cstate].enter_dead = intel_idle_enter_dead;
+
/* If marked as unusable, skip this state. */
if (cpuidle_state_table[cstate].flags & CPUIDLE_FLAG_UNUSABLE) {
pr_debug("state %s is disabled\n",
--
2.47.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v6 4/4] x86/smp native_play_dead: Prefer cpuidle_play_dead() over mwait_play_dead()
2024-11-27 16:15 [PATCH v6 0/4] SRF: Fix offline CPU preventing pc6 entry Patryk Wlazlyn
` (2 preceding siblings ...)
2024-11-27 16:15 ` [PATCH v6 3/4] intel_idle: Provide the default enter_dead() handler Patryk Wlazlyn
@ 2024-11-27 16:15 ` Patryk Wlazlyn
2024-12-09 10:16 ` [PATCH v6 0/4] SRF: Fix offline CPU preventing pc6 entry Gautham R. Shenoy
4 siblings, 0 replies; 12+ messages in thread
From: Patryk Wlazlyn @ 2024-11-27 16:15 UTC (permalink / raw)
To: x86
Cc: linux-kernel, linux-pm, rafael.j.wysocki, peterz, dave.hansen,
gautham.shenoy, tglx, len.brown, artem.bityutskiy, patryk.wlazlyn
The current algorithm* for looking up the mwait hint for the deepest
cstate, in mwait_play_dead() code works by inspecting CPUID leaf 0x5 and
calculates the mwait hint based on the number of reported substates.
This approach depends on the hints associated with them to be continuous
in the range [0, NUM_SUBSTATES-1]. This continuity is not documented and
is not met on the recent Intel platforms.
* The current algorithm is implemented in the for loop inspecting edx
in mwait_play_dead().
For example, Intel's Sierra Forest report two cstates with two substates
each in cpuid leaf 0x5:
Name* target cstate target subcstate (mwait hint)
===========================================================
C1 0x00 0x00
C1E 0x00 0x01
-- 0x10 ----
C6S 0x20 0x22
C6P 0x20 0x23
-- 0x30 ----
/* No more (sub)states all the way down to the end. */
===========================================================
* Names of the cstates are not included in the CPUID leaf 0x5, they are
taken from the product specific documentation.
Notice that hints 0x20 and 0x21 are skipped entirely for the target
cstate 0x20 (C6), being a cause of the problem for the current cpuid
leaf 0x5 algorithm.
Remove the old implementation of play_dead MWAIT hint calculation based
on the CPUID leaf 0x5 in mwait_play_dead() and delegate calling of the
mwait_play_dead_with_hint() to the idle driver.
Signed-off-by: Patryk Wlazlyn <patryk.wlazlyn@linux.intel.com>
---
arch/x86/kernel/smpboot.c | 52 +++------------------------------------
1 file changed, 3 insertions(+), 49 deletions(-)
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index ef112143623d..704a1b1d650c 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -1317,52 +1317,6 @@ void __noreturn mwait_play_dead_with_hint(unsigned int eax_hint)
}
}
-/*
- * 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(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;
- if (__this_cpu_read(cpu_info.cpuid_level) < CPUID_MWAIT_LEAF)
- return;
-
- eax = CPUID_MWAIT_LEAF;
- 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_with_hint(eax);
-}
-
/*
* Kick all "offline" CPUs out of mwait on kexec(). See comment in
* mwait_play_dead().
@@ -1413,9 +1367,9 @@ void native_play_dead(void)
play_dead_common();
tboot_shutdown(TB_SHUTDOWN_WFS);
- mwait_play_dead();
- if (cpuidle_play_dead())
- hlt_play_dead();
+ /* Below returns only on error. */
+ cpuidle_play_dead();
+ hlt_play_dead();
}
#else /* ... !CONFIG_HOTPLUG_CPU */
--
2.47.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v6 2/4] ACPI: processor_idle: Add FFH state handling
2024-11-27 16:15 ` [PATCH v6 2/4] ACPI: processor_idle: Add FFH state handling Patryk Wlazlyn
@ 2024-11-28 13:31 ` kernel test robot
2024-11-28 13:41 ` kernel test robot
2024-11-28 21:17 ` kernel test robot
2 siblings, 0 replies; 12+ messages in thread
From: kernel test robot @ 2024-11-28 13:31 UTC (permalink / raw)
To: Patryk Wlazlyn, x86
Cc: llvm, oe-kbuild-all, linux-kernel, linux-pm, rafael.j.wysocki,
peterz, dave.hansen, gautham.shenoy, tglx, len.brown,
artem.bityutskiy, patryk.wlazlyn
Hi Patryk,
kernel test robot noticed the following build errors:
[auto build test ERROR on rafael-pm/linux-next]
[also build test ERROR on rafael-pm/bleeding-edge acpi/next tip/x86/core linus/master v6.12 next-20241128]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Patryk-Wlazlyn/x86-smp-Allow-calling-mwait_play_dead-with-an-arbitrary-hint/20241128-113851
base: https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git linux-next
patch link: https://lore.kernel.org/r/20241127161518.432616-3-patryk.wlazlyn%40linux.intel.com
patch subject: [PATCH v6 2/4] ACPI: processor_idle: Add FFH state handling
config: i386-buildonly-randconfig-002-20241128 (https://download.01.org/0day-ci/archive/20241128/202411282127.KFanck22-lkp@intel.com/config)
compiler: clang version 19.1.3 (https://github.com/llvm/llvm-project ab51eccf88f5321e7c60591c5546b254b6afab99)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241128/202411282127.KFanck22-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202411282127.KFanck22-lkp@intel.com/
All errors (new ones prefixed by >>):
>> arch/x86/kernel/acpi/cstate.c:213:2: error: call to undeclared function 'mwait_play_dead_with_hint'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
213 | mwait_play_dead_with_hint(percpu_entry->states[cx->index].eax);
| ^
1 error generated.
vim +/mwait_play_dead_with_hint +213 arch/x86/kernel/acpi/cstate.c
206
207 void acpi_processor_ffh_play_dead(struct acpi_processor_cx *cx)
208 {
209 unsigned int cpu = smp_processor_id();
210 struct cstate_entry *percpu_entry;
211
212 percpu_entry = per_cpu_ptr(cpu_cstate_entry, cpu);
> 213 mwait_play_dead_with_hint(percpu_entry->states[cx->index].eax);
214 }
215
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v6 2/4] ACPI: processor_idle: Add FFH state handling
2024-11-27 16:15 ` [PATCH v6 2/4] ACPI: processor_idle: Add FFH state handling Patryk Wlazlyn
2024-11-28 13:31 ` kernel test robot
@ 2024-11-28 13:41 ` kernel test robot
2024-11-28 21:17 ` kernel test robot
2 siblings, 0 replies; 12+ messages in thread
From: kernel test robot @ 2024-11-28 13:41 UTC (permalink / raw)
To: Patryk Wlazlyn, x86
Cc: oe-kbuild-all, linux-kernel, linux-pm, rafael.j.wysocki, peterz,
dave.hansen, gautham.shenoy, tglx, len.brown, artem.bityutskiy,
patryk.wlazlyn
Hi Patryk,
kernel test robot noticed the following build errors:
[auto build test ERROR on rafael-pm/linux-next]
[also build test ERROR on rafael-pm/bleeding-edge acpi/next tip/x86/core linus/master v6.12 next-20241128]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Patryk-Wlazlyn/x86-smp-Allow-calling-mwait_play_dead-with-an-arbitrary-hint/20241128-113851
base: https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git linux-next
patch link: https://lore.kernel.org/r/20241127161518.432616-3-patryk.wlazlyn%40linux.intel.com
patch subject: [PATCH v6 2/4] ACPI: processor_idle: Add FFH state handling
config: i386-buildonly-randconfig-001-20241128 (https://download.01.org/0day-ci/archive/20241128/202411282102.WIsGlK4X-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241128/202411282102.WIsGlK4X-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202411282102.WIsGlK4X-lkp@intel.com/
All errors (new ones prefixed by >>):
arch/x86/kernel/acpi/cstate.c: In function 'acpi_processor_ffh_play_dead':
>> arch/x86/kernel/acpi/cstate.c:213:9: error: implicit declaration of function 'mwait_play_dead_with_hint'; did you mean 'mwait_idle_with_hints'? [-Werror=implicit-function-declaration]
213 | mwait_play_dead_with_hint(percpu_entry->states[cx->index].eax);
| ^~~~~~~~~~~~~~~~~~~~~~~~~
| mwait_idle_with_hints
cc1: some warnings being treated as errors
vim +213 arch/x86/kernel/acpi/cstate.c
206
207 void acpi_processor_ffh_play_dead(struct acpi_processor_cx *cx)
208 {
209 unsigned int cpu = smp_processor_id();
210 struct cstate_entry *percpu_entry;
211
212 percpu_entry = per_cpu_ptr(cpu_cstate_entry, cpu);
> 213 mwait_play_dead_with_hint(percpu_entry->states[cx->index].eax);
214 }
215
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v6 2/4] ACPI: processor_idle: Add FFH state handling
2024-11-27 16:15 ` [PATCH v6 2/4] ACPI: processor_idle: Add FFH state handling Patryk Wlazlyn
2024-11-28 13:31 ` kernel test robot
2024-11-28 13:41 ` kernel test robot
@ 2024-11-28 21:17 ` kernel test robot
2 siblings, 0 replies; 12+ messages in thread
From: kernel test robot @ 2024-11-28 21:17 UTC (permalink / raw)
To: Patryk Wlazlyn, x86
Cc: oe-kbuild-all, linux-kernel, linux-pm, rafael.j.wysocki, peterz,
dave.hansen, gautham.shenoy, tglx, len.brown, artem.bityutskiy,
patryk.wlazlyn
Hi Patryk,
kernel test robot noticed the following build warnings:
[auto build test WARNING on rafael-pm/linux-next]
[also build test WARNING on rafael-pm/bleeding-edge linus/master v6.12 next-20241128]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Patryk-Wlazlyn/x86-smp-Allow-calling-mwait_play_dead-with-an-arbitrary-hint/20241128-113851
base: https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git linux-next
patch link: https://lore.kernel.org/r/20241127161518.432616-3-patryk.wlazlyn%40linux.intel.com
patch subject: [PATCH v6 2/4] ACPI: processor_idle: Add FFH state handling
config: x86_64-randconfig-074-20241128 (https://download.01.org/0day-ci/archive/20241129/202411290550.AphAcYyW-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241129/202411290550.AphAcYyW-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202411290550.AphAcYyW-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> vmlinux.o: warning: objtool: acpi_processor_ffh_play_dead+0xb9: mwait_play_dead_with_hint() is missing a __noreturn annotation
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v6 1/4] x86/smp: Allow calling mwait_play_dead with an arbitrary hint
2024-11-27 16:15 ` [PATCH v6 1/4] x86/smp: Allow calling mwait_play_dead with an arbitrary hint Patryk Wlazlyn
@ 2024-11-29 4:27 ` Gautham R. Shenoy
2024-11-29 12:09 ` Patryk Wlazlyn
0 siblings, 1 reply; 12+ messages in thread
From: Gautham R. Shenoy @ 2024-11-29 4:27 UTC (permalink / raw)
To: Patryk Wlazlyn
Cc: x86, linux-kernel, linux-pm, rafael.j.wysocki, peterz,
dave.hansen, tglx, len.brown, artem.bityutskiy
Hello Patryk,
On Wed, Nov 27, 2024 at 05:15:15PM +0100, Patryk Wlazlyn wrote:
> The MWAIT instruction needs different hints on different CPUs to reach
> specific idle states. The current hint calculation in mwait_play_dead()
> code works in practice on current Intel hardware, but is not documented
> and fails on a recent Intel's Sierra Forest and possibly some future
> ones. Those newer CPUs' power efficiency suffers when the CPU is put
> offline.
>
> Allow cpuidle code to provide mwait_play_dead with a known hint for
> efficient play_dead code.
Just a couple of minor nits:
You could just reword this something along the lines of:
"Introduce a helper function to allow offlined CPUs to enter FFh idle
states with a specific MWAIT hint. The new helper will be used in
subsequent patches by the acpi_idle and intel_idle drivers. This patch
should not have any functional impact."
There is no need to mention MWAIT hint calculation and the Sierra
Forest failure in this patch, as this patch is not doing anything to
fix the issue. Very likely you will be covering that in Patch 4.
>
> Signed-off-by: Patryk Wlazlyn <patryk.wlazlyn@linux.intel.com>
> ---
> arch/x86/include/asm/smp.h | 4 +-
> arch/x86/kernel/smpboot.c | 86 ++++++++++++++++++++------------------
> 2 files changed, 49 insertions(+), 41 deletions(-)
>
> diff --git a/arch/x86/include/asm/smp.h b/arch/x86/include/asm/smp.h
> index ca073f40698f..ab90b95037f3 100644
> --- a/arch/x86/include/asm/smp.h
> +++ b/arch/x86/include/asm/smp.h
> @@ -114,6 +114,7 @@ void wbinvd_on_cpu(int cpu);
> int wbinvd_on_all_cpus(void);
>
> void smp_kick_mwait_play_dead(void);
> +void mwait_play_dead_with_hint(unsigned int hint);
>
> void native_smp_send_reschedule(int cpu);
> void native_send_call_func_ipi(const struct cpumask *mask);
> @@ -151,7 +152,6 @@ static inline struct cpumask *cpu_l2c_shared_mask(int cpu)
> {
> return per_cpu(cpu_l2c_shared_map, cpu);
> }
> -
> #else /* !CONFIG_SMP */
> #define wbinvd_on_cpu(cpu) wbinvd()
> static inline int wbinvd_on_all_cpus(void)
This hunk is not relevant to this patch.
The rest of the patch looks good to me.
--
Thanks and Regards
gautham.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v6 1/4] x86/smp: Allow calling mwait_play_dead with an arbitrary hint
2024-11-29 4:27 ` Gautham R. Shenoy
@ 2024-11-29 12:09 ` Patryk Wlazlyn
0 siblings, 0 replies; 12+ messages in thread
From: Patryk Wlazlyn @ 2024-11-29 12:09 UTC (permalink / raw)
To: Gautham R. Shenoy
Cc: x86, linux-kernel, linux-pm, rafael.j.wysocki, peterz,
dave.hansen, tglx, len.brown, artem.bityutskiy
>> The MWAIT instruction needs different hints on different CPUs to reach
>> specific idle states. The current hint calculation in mwait_play_dead()
>> code works in practice on current Intel hardware, but is not documented
>> and fails on a recent Intel's Sierra Forest and possibly some future
>> ones. Those newer CPUs' power efficiency suffers when the CPU is put
>> offline.
>>
>> Allow cpuidle code to provide mwait_play_dead with a known hint for
>> efficient play_dead code.
>
>
> Just a couple of minor nits:
>
> You could just reword this something along the lines of:
>
> "Introduce a helper function to allow offlined CPUs to enter FFh idle
> states with a specific MWAIT hint. The new helper will be used in
> subsequent patches by the acpi_idle and intel_idle drivers. This patch
> should not have any functional impact."
>
> There is no need to mention MWAIT hint calculation and the Sierra
> Forest failure in this patch, as this patch is not doing anything to
> fix the issue. Very likely you will be covering that in Patch 4.
Ok. I thought that giving some context on how the change originated might be
useful, but people doesn't seem to like that that much ;]
> "(...) This patch should not have any functional impact."
Yeah, forgot to put that no functional change intended.
>>
>> Signed-off-by: Patryk Wlazlyn <patryk.wlazlyn@linux.intel.com>
>> ---
>> arch/x86/include/asm/smp.h | 4 +-
>> arch/x86/kernel/smpboot.c | 86 ++++++++++++++++++++------------------
>> 2 files changed, 49 insertions(+), 41 deletions(-)
>>
>> diff --git a/arch/x86/include/asm/smp.h b/arch/x86/include/asm/smp.h
>> index ca073f40698f..ab90b95037f3 100644
>> --- a/arch/x86/include/asm/smp.h
>> +++ b/arch/x86/include/asm/smp.h
>> @@ -114,6 +114,7 @@ void wbinvd_on_cpu(int cpu);
>> int wbinvd_on_all_cpus(void);
>>
>> void smp_kick_mwait_play_dead(void);
>> +void mwait_play_dead_with_hint(unsigned int hint);
That actually is needed.
>>
>> void native_smp_send_reschedule(int cpu);
>> void native_send_call_func_ipi(const struct cpumask *mask);
>> @@ -151,7 +152,6 @@ static inline struct cpumask *cpu_l2c_shared_mask(int cpu)
>> {
>> return per_cpu(cpu_l2c_shared_map, cpu);
>> }
>> -
Yeah, missed that one when submitting.
>> #else /* !CONFIG_SMP */
>> #define wbinvd_on_cpu(cpu) wbinvd()
>> static inline int wbinvd_on_all_cpus(void)
>
> This hunk is not relevant to this patch.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v6 0/4] SRF: Fix offline CPU preventing pc6 entry
2024-11-27 16:15 [PATCH v6 0/4] SRF: Fix offline CPU preventing pc6 entry Patryk Wlazlyn
` (3 preceding siblings ...)
2024-11-27 16:15 ` [PATCH v6 4/4] x86/smp native_play_dead: Prefer cpuidle_play_dead() over mwait_play_dead() Patryk Wlazlyn
@ 2024-12-09 10:16 ` Gautham R. Shenoy
2024-12-09 12:58 ` Patryk Wlazlyn
4 siblings, 1 reply; 12+ messages in thread
From: Gautham R. Shenoy @ 2024-12-09 10:16 UTC (permalink / raw)
To: Patryk Wlazlyn
Cc: x86, linux-kernel, linux-pm, rafael.j.wysocki, peterz,
dave.hansen, tglx, len.brown, artem.bityutskiy
On Wed, Nov 27, 2024 at 05:15:14PM +0100, Patryk Wlazlyn wrote:
> Changes since v5:
> * Split 1/3 from v5 into two commits, as suggestem by Gautham.
> 1/4 splits wait_play_dead into mwait_play_dead_with_hint.
> 2/4 and 3/4 uses the new mwait_play_dead_with_hint
> 4/4 removes mwait_play_dead and calls cpuidle_play_dead right away
>
> * Reword 1-3/4 changelog slightly.
>
> * Move changelog from v5 1/3 into v6 4/4
FWIW,
I have tested the series on AMD platforms and there are no issues.
Tested-by: Gautham R. Shenoy <gautham.shenoy@amd.com>
>
> Patryk Wlazlyn (4):
> x86/smp: Allow calling mwait_play_dead with an arbitrary hint
> ACPI: processor_idle: Add FFH state handling
> intel_idle: Provide the default enter_dead() handler
> x86/smp native_play_dead: Prefer cpuidle_play_dead() over
> mwait_play_dead()
>
> arch/x86/include/asm/smp.h | 4 ++-
> arch/x86/kernel/acpi/cstate.c | 9 +++++++
> arch/x86/kernel/smpboot.c | 50 ++++-------------------------------
> drivers/acpi/processor_idle.c | 2 ++
> drivers/idle/intel_idle.c | 18 +++++++++++--
> include/acpi/processor.h | 5 ++++
> 6 files changed, 40 insertions(+), 48 deletions(-)
>
> --
> 2.47.1
>
--
Thanks and Regards
gautham.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v6 0/4] SRF: Fix offline CPU preventing pc6 entry
2024-12-09 10:16 ` [PATCH v6 0/4] SRF: Fix offline CPU preventing pc6 entry Gautham R. Shenoy
@ 2024-12-09 12:58 ` Patryk Wlazlyn
0 siblings, 0 replies; 12+ messages in thread
From: Patryk Wlazlyn @ 2024-12-09 12:58 UTC (permalink / raw)
To: Gautham R. Shenoy
Cc: x86, linux-kernel, linux-pm, rafael.j.wysocki, peterz,
dave.hansen, tglx, len.brown, artem.bityutskiy
> FWIW,
>
> I have tested the series on AMD platforms and there are no issues.
>
> Tested-by: Gautham R. Shenoy <gautham.shenoy@amd.com>
Thanks!
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2024-12-09 12:58 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-27 16:15 [PATCH v6 0/4] SRF: Fix offline CPU preventing pc6 entry Patryk Wlazlyn
2024-11-27 16:15 ` [PATCH v6 1/4] x86/smp: Allow calling mwait_play_dead with an arbitrary hint Patryk Wlazlyn
2024-11-29 4:27 ` Gautham R. Shenoy
2024-11-29 12:09 ` Patryk Wlazlyn
2024-11-27 16:15 ` [PATCH v6 2/4] ACPI: processor_idle: Add FFH state handling Patryk Wlazlyn
2024-11-28 13:31 ` kernel test robot
2024-11-28 13:41 ` kernel test robot
2024-11-28 21:17 ` kernel test robot
2024-11-27 16:15 ` [PATCH v6 3/4] intel_idle: Provide the default enter_dead() handler Patryk Wlazlyn
2024-11-27 16:15 ` [PATCH v6 4/4] x86/smp native_play_dead: Prefer cpuidle_play_dead() over mwait_play_dead() Patryk Wlazlyn
2024-12-09 10:16 ` [PATCH v6 0/4] SRF: Fix offline CPU preventing pc6 entry Gautham R. Shenoy
2024-12-09 12:58 ` Patryk Wlazlyn
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox