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: Olav Haugan <ohaugan@codeaurora.org>
This commit is contained in:
Olav Haugan 2016-11-17 18:31:33 -08:00
parent 2f088241d7
commit 704e5bfc25
2 changed files with 7 additions and 13 deletions

View file

@ -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;
}

View file

@ -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;
}