Commit 9876fd09 authored by Lifeng Zheng's avatar Lifeng Zheng
Browse files

cpufreq: Fix re-boost issue after hotplugging a CPU

mainline inclusion
from mainline-v6.7-rc5
commit 1608f0230510489d74a2e24e47054233b7e4678a
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IBQYEH
CVE: NA

Reference: https://web.git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=1608f0230510489d74a2e24e47054233b7e4678a



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

It turns out that CPUX will stay on the base frequency after performing
these operations:

 1. boost all CPUs: echo 1 > /sys/devices/system/cpu/cpufreq/boost

 2. offline one CPU: echo 0 > /sys/devices/system/cpu/cpuX/online

 3. deboost all CPUs: echo 0 > /sys/devices/system/cpu/cpufreq/boost

 4. online CPUX: echo 1 > /sys/devices/system/cpu/cpuX/online

 5. boost all CPUs again: echo 1 > /sys/devices/system/cpu/cpufreq/boost

This is because max_freq_req of the policy is not updated during the
online process, and the value of max_freq_req before the last offline is
retained.

When the CPU is boosted again, freq_qos_update_request() will do nothing
because the old value is the same as the new one. This causes the CPU to
stay at the base frequency. Updating max_freq_req  in cpufreq_online()
will solve this problem.

Signed-off-by: default avatarLifeng Zheng <zhenglifeng1@huawei.com>
Acked-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Link: https://patch.msgid.link/20250117101457.1530653-2-zhenglifeng1@huawei.com


[ rjw: Subject and changelog edits ]
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: default avatarXinghai Cen <cenxinghai@h-partners.com>
parent 0e68a81f
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -1487,6 +1487,10 @@ static int cpufreq_online(unsigned int cpu)

		blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
				CPUFREQ_CREATE_POLICY, policy);
	} else {
		ret = freq_qos_update_request(policy->max_freq_req, policy->max);
		if (ret < 0)
			goto out_destroy_policy;
	}

	if (cpufreq_driver->get && has_target()) {