Commit a3c70918 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki Committed by Jia, Yingbao
Browse files

cpufreq: intel_pstate: Check turbo_is_disabled() in store_no_turbo()

mainline inclusion
from mainline-v6.10
commit 350cbb5d2f676bff22c49e5e81764c3b8da342a9
category: bugfix
bugzilla: https://gitee.com/openeuler/intel-kernel/issues/IB6QC4
CVE: NA
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=350cbb5d2f676bff22c49e5e81764c3b8da342a9

-------------------------------------------------

Intel-SIG: commit 350cbb5d2f67 cpufreq: intel_pstate: Check turbo_is_disabled() in store_no_turbo().
Backport intel_pstate driver update for 6.6 from 6.11

After recent changes in intel_pstate, global.turbo_disabled is only set
at the initialization time and never changed.  However, it turns out
that on some systems the "turbo disabled" bit in MSR_IA32_MISC_ENABLE,
the initial state of which is reflected by global.turbo_disabled, can be
flipped later and there should be a way to take that into account (other
than checking that MSR every time the driver runs which is costly and
useless overhead on the vast majority of systems).

For this purpose, notice that before the changes in question,
store_no_turbo() contained a turbo_is_disabled() check that was used
for updating global.turbo_disabled if the "turbo disabled" bit in
MSR_IA32_MISC_ENABLE had been flipped and that functionality can be
restored.  Then, users will be able to reset global.turbo_disabled
by writing 0 to no_turbo which used to work before on systems with
flipping "turbo disabled" bit.

This guarantees the driver state to remain in sync, but READ_ONCE()
annotations need to be added in two places where global.turbo_disabled
is accessed locklessly, so modify the driver to make that happen.

Fixes: 0940f1a8011f ("cpufreq: intel_pstate: Do not update global.turbo_disabled after initialization")
Closes: https://lore.kernel.org/linux-pm/bf3ebf1571a4788e97daf861eb493c12d42639a3.camel@xry111.site


Suggested-by: default avatarSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Reported-by: default avatarXi Ruoyao <xry111@xry111.site>
Tested-by: default avatarXi Ruoyao <xry111@xry111.site>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
[ Yingbao Jia: amend commit log ]
Signed-off-by: default avatarYingbao Jia <yingbao.jia@intel.com>
parent cb76812b
Loading
Loading
Loading
Loading
+12 −7
Original line number Diff line number Diff line
@@ -1298,12 +1298,17 @@ static ssize_t store_no_turbo(struct kobject *a, struct kobj_attribute *b,

	no_turbo = !!clamp_t(int, input, 0, 1);

	if (no_turbo == global.no_turbo)
	WRITE_ONCE(global.turbo_disabled, turbo_is_disabled());
	if (global.turbo_disabled && !no_turbo) {
		pr_notice("Turbo disabled by BIOS or unavailable on processor\n");
		count = -EPERM;
		if (global.no_turbo)
			goto unlock_driver;
		else
			no_turbo = 1;
	}

	if (global.turbo_disabled) {
		pr_notice_once("Turbo disabled by BIOS or unavailable on processor\n");
		count = -EPERM;
	if (no_turbo == global.no_turbo) {
		goto unlock_driver;
	}

@@ -1761,7 +1766,7 @@ static u64 atom_get_val(struct cpudata *cpudata, int pstate)
	u32 vid;

	val = (u64)pstate << 8;
	if (READ_ONCE(global.no_turbo) && !global.turbo_disabled)
	if (READ_ONCE(global.no_turbo) && !READ_ONCE(global.turbo_disabled))
		val |= (u64)1 << 32;

	vid_fp = cpudata->vid.min + mul_fp(
@@ -1926,7 +1931,7 @@ static u64 core_get_val(struct cpudata *cpudata, int pstate)
	u64 val;

	val = (u64)pstate << 8;
	if (READ_ONCE(global.no_turbo) && !global.turbo_disabled)
	if (READ_ONCE(global.no_turbo) && !READ_ONCE(global.turbo_disabled))
		val |= (u64)1 << 32;

	return val;