Merge "sched: Fix deadlock between cpu hotplug and upmigrate change"
This commit is contained in:
commit
9a18201fc8
1 changed files with 19 additions and 8 deletions
|
@ -1470,7 +1470,20 @@ int sched_hmp_proc_update_handler(struct ctl_table *table, int write,
|
||||||
int ret;
|
int ret;
|
||||||
unsigned int old_val;
|
unsigned int old_val;
|
||||||
unsigned int *data = (unsigned int *)table->data;
|
unsigned int *data = (unsigned int *)table->data;
|
||||||
int update_min_nice = 0;
|
int update_task_count = 0;
|
||||||
|
|
||||||
|
if (!sched_enable_hmp)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The policy mutex is acquired with cpu_hotplug.lock
|
||||||
|
* held from cpu_up()->cpufreq_governor_interactive()->
|
||||||
|
* sched_set_window(). So enforce the same order here.
|
||||||
|
*/
|
||||||
|
if (write && (data == &sysctl_sched_upmigrate_pct)) {
|
||||||
|
update_task_count = 1;
|
||||||
|
get_online_cpus();
|
||||||
|
}
|
||||||
|
|
||||||
mutex_lock(&policy_mutex);
|
mutex_lock(&policy_mutex);
|
||||||
|
|
||||||
|
@ -1478,7 +1491,7 @@ int sched_hmp_proc_update_handler(struct ctl_table *table, int write,
|
||||||
|
|
||||||
ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
|
ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
|
||||||
|
|
||||||
if (ret || !write || !sched_enable_hmp)
|
if (ret || !write)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
if (write && (old_val == *data))
|
if (write && (old_val == *data))
|
||||||
|
@ -1500,20 +1513,18 @@ int sched_hmp_proc_update_handler(struct ctl_table *table, int write,
|
||||||
* includes taking runqueue lock of all online cpus and re-initiatizing
|
* includes taking runqueue lock of all online cpus and re-initiatizing
|
||||||
* their big counter values based on changed criteria.
|
* their big counter values based on changed criteria.
|
||||||
*/
|
*/
|
||||||
if ((data == &sysctl_sched_upmigrate_pct || update_min_nice)) {
|
if (update_task_count)
|
||||||
get_online_cpus();
|
|
||||||
pre_big_task_count_change(cpu_online_mask);
|
pre_big_task_count_change(cpu_online_mask);
|
||||||
}
|
|
||||||
|
|
||||||
set_hmp_defaults();
|
set_hmp_defaults();
|
||||||
|
|
||||||
if ((data == &sysctl_sched_upmigrate_pct || update_min_nice)) {
|
if (update_task_count)
|
||||||
post_big_task_count_change(cpu_online_mask);
|
post_big_task_count_change(cpu_online_mask);
|
||||||
put_online_cpus();
|
|
||||||
}
|
|
||||||
|
|
||||||
done:
|
done:
|
||||||
mutex_unlock(&policy_mutex);
|
mutex_unlock(&policy_mutex);
|
||||||
|
if (update_task_count)
|
||||||
|
put_online_cpus();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue