Unverified Commit 26e1a642 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!9711 fix CVE-2024-38615

Merge Pull Request from: @ci-robot 
 
PR sync from: Lin Yujun <linyujun809@huawei.com>
https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/DJTQJIX5RR3P5DGENGPKDFPGGZPMJSWE/ 
*** BLURB HERE ***

Rafael J. Wysocki (3):
  cpufreq: Reorganize checks in cpufreq_offline()
  cpufreq: Split cpufreq_offline()
  cpufreq: Rearrange locking in cpufreq_remove_dev()

Viresh Kumar (1):
  cpufreq: exit() callback is optional


-- 
2.34.1
 
https://gitee.com/src-openeuler/kernel/issues/IA6SHN 
 
Link:https://gitee.com/openeuler/kernel/pulls/9711

 

Reviewed-by: default avatarZhang Jianhua <chris.zjh@huawei.com>
Signed-off-by: default avatarJialin Zhang <zhangjialin11@huawei.com>
parents b42fa7bc 3bdd40f3
Loading
Loading
Loading
Loading
+49 −34
Original line number Diff line number Diff line
@@ -1562,47 +1562,36 @@ 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);

	cpumask_clear_cpu(cpu, policy->cpus);

	if (policy_is_inactive(policy)) {
		if (has_target())
			strncpy(policy->last_governor, policy->governor->name,
				CPUFREQ_NAME_LEN);
		else
			policy->last_policy = policy->policy;
	} else if (cpu == policy->cpu) {
		/* Nominate new CPU */
	if (!policy_is_inactive(policy)) {
		/* Nominate a new CPU if necessary. */
		if (cpu == policy->cpu)
			policy->cpu = cpumask_any(policy->cpus);
	}

	/* Start governor again for active policy */
	if (!policy_is_inactive(policy)) {
		/* Start the governor again for the active policy. */
		if (has_target()) {
			ret = cpufreq_start_governor(policy);
			if (ret)
				pr_err("%s: Failed to start governor\n", __func__);
		}

		goto unlock;
		return;
	}

	if (has_target())
		strncpy(policy->last_governor, policy->governor->name,
			CPUFREQ_NAME_LEN);
	else
		policy->last_policy = policy->policy;

	if (cpufreq_thermal_control_enabled(cpufreq_driver)) {
		cpufreq_cooling_unregister(policy->cdev);
		policy->cdev = NULL;
@@ -1620,12 +1609,31 @@ static int cpufreq_offline(unsigned int cpu)
	 */
	if (cpufreq_driver->offline) {
		cpufreq_driver->offline(policy);
	} else if (cpufreq_driver->exit) {
		return;
	}

	if (cpufreq_driver->exit)
		cpufreq_driver->exit(policy);

	policy->freq_table = NULL;
}

unlock:
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);

	up_write(&policy->rwsem);
	return 0;
}
@@ -1643,20 +1651,27 @@ static void cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif)
	if (!policy)
		return;

	down_write(&policy->rwsem);

	if (cpu_online(cpu))
		cpufreq_offline(cpu);
		__cpufreq_offline(cpu, policy);

	cpumask_clear_cpu(cpu, policy->real_cpus);
	remove_cpu_dev_symlink(policy, dev);

	if (cpumask_empty(policy->real_cpus)) {
	if (!cpumask_empty(policy->real_cpus)) {
		up_write(&policy->rwsem);
		return;
	}

	/* We did light-weight exit earlier, do full tear down now */
		if (cpufreq_driver->offline)
	if (cpufreq_driver->offline && cpufreq_driver->exit)
		cpufreq_driver->exit(policy);

	up_write(&policy->rwsem);

	cpufreq_policy_free(policy);
}
}

/**
 *	cpufreq_out_of_sync - If actual and saved CPU frequency differs, we're