Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 704e5bfc authored by Olav Haugan's avatar Olav Haugan
Browse files

sched: Ensure proper synch between isolation, hotplug, and suspend



Isolation code needs to be synchronized with both hotplug and suspend.
Ensure this by taking the lock that is taken by both paths and ensure
hotplug notifiers are processed for suspend/resume.

Change-Id: I663588cfd2f9e3972b9adc1a10887ef36cd70c57
Signed-off-by: default avatarOlav Haugan <ohaugan@codeaurora.org>
parent 2f088241
Loading
Loading
Loading
Loading
+4 −6
Original line number Diff line number Diff line
@@ -5682,7 +5682,7 @@ int sched_isolate_cpu(int cpu)
	if (trace_sched_isolate_enabled())
		start_time = sched_clock();

	lock_device_hotplug();
	cpu_maps_update_begin();

	cpumask_andnot(&avail_cpus, cpu_online_mask, cpu_isolated_mask);

@@ -5731,7 +5731,7 @@ int sched_isolate_cpu(int cpu)
	sched_update_group_capacities(cpu);

out:
	unlock_device_hotplug();
	cpu_maps_update_done();
	trace_sched_isolate(cpu, cpumask_bits(cpu_isolated_mask)[0],
			    start_time, 1);
	return ret_code;
@@ -5752,8 +5752,6 @@ int sched_unisolate_cpu_unlocked(int cpu)
	if (trace_sched_isolate_enabled())
		start_time = sched_clock();

	lock_device_hotplug_assert();

	if (!cpu_isolation_vote[cpu]) {
		ret_code = -EINVAL;
		goto out;
@@ -5792,9 +5790,9 @@ int sched_unisolate_cpu(int cpu)
{
	int ret_code;

	lock_device_hotplug();
	cpu_maps_update_begin();
	ret_code = sched_unisolate_cpu_unlocked(cpu);
	unlock_device_hotplug();
	cpu_maps_update_done();
	return ret_code;
}

+3 −7
Original line number Diff line number Diff line
@@ -893,14 +893,10 @@ static int __ref cpu_callback(struct notifier_block *nfb,
	unsigned int need;
	int ret = NOTIFY_OK;

	/* Don't affect suspend resume */
	if (action & CPU_TASKS_FROZEN)
		return NOTIFY_OK;

	if (unlikely(!cluster || !cluster->inited))
		return NOTIFY_OK;

	switch (action) {
	switch (action & ~CPU_TASKS_FROZEN) {
	case CPU_UP_PREPARE:

		/* If online state of CPU somehow got out of sync, fix it. */
@@ -1095,7 +1091,7 @@ static int __init core_ctl_init(void)
	cpufreq_register_notifier(&cpufreq_pol_nb, CPUFREQ_POLICY_NOTIFIER);
	cpufreq_register_notifier(&cpufreq_gov_nb, CPUFREQ_GOVINFO_NOTIFIER);

	lock_device_hotplug();
	cpu_maps_update_begin();
	for_each_online_cpu(cpu) {
		struct cpufreq_policy *policy;
		int ret;
@@ -1109,7 +1105,7 @@ static int __init core_ctl_init(void)
			cpufreq_cpu_put(policy);
		}
	}
	unlock_device_hotplug();
	cpu_maps_update_done();
	initialized = true;
	return 0;
}