Commit 85db0c0a authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull power management fixes from Rafael Wysocki:
 "These revert a cpuidle menu governor commit leading to a performance
  regression, fix an amd-pstate driver regression introduced recently,
  and fix new conditional guard definitions for runtime PM.

   - Add missing _RET == 0 condition to recently introduced conditional
     guard definitions for runtime PM (Rafael Wysocki)

   - Revert a cpuidle menu governor change that introduced a serious
     performance regression on Chromebooks with Intel Jasper Lake
     processors (Rafael Wysocki)

   - Fix an amd-pstate driver regression leading to EPP=0 after
     hibernation (Mario Limonciello)"

* tag 'pm-6.18-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  PM: runtime: Fix conditional guard definitions
  Revert "cpuidle: menu: Avoid discarding useful information"
  cpufreq/amd-pstate: Fix a regression leading to EPP 0 after hibernate
parents 942048d4 b62bd2cf
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -1614,7 +1614,11 @@ static int amd_pstate_cpu_offline(struct cpufreq_policy *policy)
	 * min_perf value across kexec reboots. If this CPU is just onlined normally after this, the
	 * limits, epp and desired perf will get reset to the cached values in cpudata struct
	 */
	return amd_pstate_update_perf(policy, perf.bios_min_perf, 0U, 0U, 0U, false);
	return amd_pstate_update_perf(policy, perf.bios_min_perf,
				     FIELD_GET(AMD_CPPC_DES_PERF_MASK, cpudata->cppc_req_cached),
				     FIELD_GET(AMD_CPPC_MAX_PERF_MASK, cpudata->cppc_req_cached),
				     FIELD_GET(AMD_CPPC_EPP_PERF_MASK, cpudata->cppc_req_cached),
				     false);
}

static int amd_pstate_suspend(struct cpufreq_policy *policy)
+9 −12
Original line number Diff line number Diff line
@@ -188,20 +188,17 @@ static unsigned int get_typical_interval(struct menu_device *data)
	 *
	 * This can deal with workloads that have long pauses interspersed
	 * with sporadic activity with a bunch of short pauses.
	 *
	 * However, if the number of remaining samples is too small to exclude
	 * any more outliers, allow the deepest available idle state to be
	 * selected because there are systems where the time spent by CPUs in
	 * deep idle states is correlated to the maximum frequency the CPUs
	 * can get to.  On those systems, shallow idle states should be avoided
	 * unless there is a clear indication that the given CPU is most likley
	 * going to be woken up shortly.
	 */
	if (divisor * 4 <= INTERVALS * 3) {
		/*
		 * If there are sufficiently many data points still under
		 * consideration after the outliers have been eliminated,
		 * returning without a prediction would be a mistake because it
		 * is likely that the next interval will not exceed the current
		 * maximum, so return the latter in that case.
		 */
		if (divisor >= INTERVALS / 2)
			return max;

	if (divisor * 4 <= INTERVALS * 3)
		return UINT_MAX;
	}

	/* Update the thresholds for the next round. */
	if (avg - min > max - avg)
+4 −4
Original line number Diff line number Diff line
@@ -629,13 +629,13 @@ DEFINE_GUARD(pm_runtime_active_auto, struct device *,
 * device.
 */
DEFINE_GUARD_COND(pm_runtime_active, _try,
		  pm_runtime_get_active(_T, RPM_TRANSPARENT))
		  pm_runtime_get_active(_T, RPM_TRANSPARENT), _RET == 0)
DEFINE_GUARD_COND(pm_runtime_active, _try_enabled,
		  pm_runtime_resume_and_get(_T))
		  pm_runtime_resume_and_get(_T), _RET == 0)
DEFINE_GUARD_COND(pm_runtime_active_auto, _try,
		  pm_runtime_get_active(_T, RPM_TRANSPARENT))
		  pm_runtime_get_active(_T, RPM_TRANSPARENT), _RET == 0)
DEFINE_GUARD_COND(pm_runtime_active_auto, _try_enabled,
		  pm_runtime_resume_and_get(_T))
		  pm_runtime_resume_and_get(_T), _RET == 0)

/**
 * pm_runtime_put_sync - Drop device usage counter and run "idle check" if 0.