Commit 68b0ded8 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki Committed by Lin Yujun
Browse files

cpufreq: Split cpufreq_offline()

stable inclusion
from stable-v5.10.219
commit 19b06dec363b65adb0e873f519ea50038ceecfcc
category: bugfix
bugzilla: https://gitee.com/src-openeuler/kernel/issues/IA6SHN
CVE: CVE-2024-38615

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=19b06dec363b65adb0e873f519ea50038ceecfcc



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

[ Upstream commit fddd8f86 ]

Split the "core" part running under the policy rwsem out of
cpufreq_offline() to allow the locking in cpufreq_remove_dev() to be
rearranged more easily.

As a side-effect this eliminates the unlock label that's not needed
any more.

No expected functional impact.

Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Stable-dep-of: b8f85833c057 ("cpufreq: exit() callback is optional")
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
Signed-off-by: default avatarLin Yujun <linyujun809@huawei.com>
parent c2eb6d1a
Loading
Loading
Loading
Loading
+19 −14
Original line number Diff line number Diff line
@@ -1562,21 +1562,10 @@ static int cpufreq_add_dev(struct device *dev, struct subsys_interface *sif)
	return 0;
}

static int cpufreq_offline(unsigned int cpu)
static void __cpufreq_offline(unsigned int cpu, struct cpufreq_policy *policy)
{
	struct cpufreq_policy *policy;
	int ret;

	pr_debug("%s: unregistering CPU %u\n", __func__, cpu);

	policy = cpufreq_cpu_get_raw(cpu);
	if (!policy) {
		pr_debug("%s: No cpu_data found\n", __func__);
		return 0;
	}

	down_write(&policy->rwsem);

	if (has_target())
		cpufreq_stop_governor(policy);

@@ -1594,7 +1583,7 @@ static int cpufreq_offline(unsigned int cpu)
				pr_err("%s: Failed to start governor\n", __func__);
		}

		goto unlock;
		return;
	}

	if (has_target())
@@ -1624,8 +1613,24 @@ static int cpufreq_offline(unsigned int cpu)
		cpufreq_driver->exit(policy);
		policy->freq_table = NULL;
	}
}

static int cpufreq_offline(unsigned int cpu)
{
	struct cpufreq_policy *policy;

	pr_debug("%s: unregistering CPU %u\n", __func__, cpu);

	policy = cpufreq_cpu_get_raw(cpu);
	if (!policy) {
		pr_debug("%s: No cpu_data found\n", __func__);
		return 0;
	}

	down_write(&policy->rwsem);

	__cpufreq_offline(cpu, policy);

unlock:
	up_write(&policy->rwsem);
	return 0;
}