mirror-linux/drivers/cpuidle
Rafael J. Wysocki 10fad40122 Revert "cpuidle: menu: Avoid discarding useful information"
It is reported that commit 85975daeaa ("cpuidle: menu: Avoid discarding
useful information") led to a performance regression on Intel Jasper Lake
systems because it reduced the time spent by CPUs in idle state C7 which
is correlated to the maximum frequency the CPUs can get to because of an
average running power limit [1].

Before that commit, get_typical_interval() would have returned UINT_MAX
whenever it had been unable to make a high-confidence prediction which
had led to selecting the deepest available idle state too often and
both power and performance had been inadequate as a result of that on
some systems.  However, this had not been a problem on systems with
relatively aggressive average running power limits, like the Jasper Lake
systems in question, because on those systems it was compensated by the
ability to run CPUs faster.

It was addressed by causing get_typical_interval() to return a number
based on the recent idle duration information available to it even if it
could not make a high-confidence prediction, but that clearly did not
take the possible correlation between idle power and available CPU
capacity into account.

For this reason, revert most of the changes made by commit 85975daeaa,
except for one cosmetic cleanup, and add a comment explaining the
rationale for returning UINT_MAX from get_typical_interval() when it
is unable to make a high-confidence prediction.

Fixes: 85975daeaa ("cpuidle: menu: Avoid discarding useful information")
Closes: https://lore.kernel.org/linux-pm/36iykr223vmcfsoysexug6s274nq2oimcu55ybn6ww4il3g3cv@cohflgdbpnq7/ [1]
Reported-by: Sergey Senozhatsky <senozhatsky@chromium.org>
Cc: All applicable <stable@vger.kernel.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Link: https://patch.msgid.link/3663603.iIbC2pHGDl@rafael.j.wysocki
2025-10-20 21:27:16 +02:00
..
governors Revert "cpuidle: menu: Avoid discarding useful information" 2025-10-20 21:27:16 +02:00
Kconfig cpuidle-haltpoll: select haltpoll governor 2023-01-13 20:50:46 +01:00
Kconfig.arm cpuidle: psci: Do not suspend topology CPUs on PREEMPT_RT 2023-02-13 17:15:42 +01:00
Kconfig.mips
Kconfig.powerpc
Kconfig.riscv cpuidle: Add RISC-V SBI CPU idle driver 2022-03-10 09:29:51 -08:00
Makefile tracing: Disable branch profiling in noinstr code 2025-03-22 09:49:26 +01:00
coupled.c cpuidle: Avoid explicit cpumask allocation on stack 2024-04-24 21:23:49 +02:00
cpuidle-arm.c cpuidle: Init cpuidle only for present CPUs 2025-03-12 21:31:59 +01:00
cpuidle-at91.c treewide: Replace GPLv2 boilerplate/reference with SPDX - gpl-2.0_56.RULE (part 2) 2022-06-10 14:51:35 +02:00
cpuidle-big_little.c cpuidle: Init cpuidle only for present CPUs 2025-03-12 21:31:59 +01:00
cpuidle-calxeda.c
cpuidle-clps711x.c
cpuidle-cps.c
cpuidle-exynos.c
cpuidle-haltpoll.c cpuidle: haltpoll: add missing MODULE_DESCRIPTION() macro 2024-06-14 18:15:38 +02:00
cpuidle-kirkwood.c Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
cpuidle-mvebu-v7.c cpuidle: mvebu: Fix duplicate flags assignment 2023-01-18 12:03:54 +01:00
cpuidle-powernv.c powerpc/cpuidle: Set CPUIDLE_FLAG_POLLING for snooze state 2022-12-06 23:18:19 +11:00
cpuidle-psci-domain.c cpuidle: psci: Drop redundant sync_state support 2025-07-09 13:30:01 +02:00
cpuidle-psci.c cpuidle: psci: Fix cpuhotplug routine with PREEMPT_RT=y 2025-07-14 13:09:04 +02:00
cpuidle-psci.h cpuidle: psci: Correct the domain-idlestate statistics in debugfs 2025-04-23 10:08:34 +02:00
cpuidle-pseries.c powerpc/machdep: Drop include of dma-mapping.h 2024-10-29 23:01:05 +11:00
cpuidle-qcom-spm.c cpuidle: qcom-spm: drop unnecessary initialisations 2025-09-10 12:49:52 +02:00
cpuidle-riscv-sbi.c cpuidle: riscv-sbi: Drop redundant sync_state support 2025-07-09 13:30:06 +02:00
cpuidle-tegra.c cpuidle, arch: Mark all ct_cpuidle_enter() callers __cpuidle 2023-01-13 11:48:17 +01:00
cpuidle-ux500.c mfd/cpuidle: ux500: Rename driver symbol 2021-08-16 13:42:34 +01:00
cpuidle-zynq.c
cpuidle.c cpuidle: Fail cpuidle device registration if there is one already 2025-09-20 13:08:54 +02:00
cpuidle.h cpuidle: move to use bus_get_dev_root() 2023-03-22 20:25:23 +01:00
driver.c cpuidle: Correct some typos in comments 2024-10-18 18:44:32 +02:00
dt_idle_genpd.c cpuidle: dt_idle_genpd: Simplify with scoped for each OF child loop 2024-08-20 11:30:39 +02:00
dt_idle_genpd.h cpuidle: dt_idle_genpd: Add helper function to remove genpd topology 2023-08-08 16:06:20 +02:00
dt_idle_states.c cpuidle: dt: fix opencoded for_each_cpu() in idle_state_valid() 2025-07-10 14:53:28 +02:00
dt_idle_states.h
governor.c cpuidle: Remove redundant check in cpuidle_switch_governor() 2022-09-03 20:14:51 +02:00
poll_state.c cpuidle: Use local_clock_noinstr() 2023-06-05 21:11:09 +02:00
sysfs.c cpuidle: sysfs: Use sysfs_emit()/sysfs_emit_at() instead of sprintf()/scnprintf() 2025-09-20 13:06:37 +02:00