Merge "sched/core: Fix race condition in clearing hmp request"
This commit is contained in:
commit
496c2d7a0f
1 changed files with 25 additions and 16 deletions
|
@ -1248,15 +1248,16 @@ static int __set_cpus_allowed_ptr(struct task_struct *p,
|
|||
goto out;
|
||||
|
||||
cpumask_andnot(&allowed_mask, new_mask, cpu_isolated_mask);
|
||||
cpumask_and(&allowed_mask, &allowed_mask, cpu_active_mask);
|
||||
|
||||
dest_cpu = cpumask_any_and(cpu_active_mask, &allowed_mask);
|
||||
dest_cpu = cpumask_any(&allowed_mask);
|
||||
if (dest_cpu >= nr_cpu_ids) {
|
||||
dest_cpu = cpumask_any_and(cpu_active_mask, new_mask);
|
||||
cpumask_and(&allowed_mask, cpu_active_mask, new_mask);
|
||||
dest_cpu = cpumask_any(&allowed_mask);
|
||||
if (dest_cpu >= nr_cpu_ids) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
cpumask_copy(&allowed_mask, new_mask);
|
||||
}
|
||||
|
||||
do_set_cpus_allowed(p, new_mask);
|
||||
|
@ -4635,6 +4636,8 @@ long sched_setaffinity(pid_t pid, const struct cpumask *in_mask)
|
|||
cpumask_var_t cpus_allowed, new_mask;
|
||||
struct task_struct *p;
|
||||
int retval;
|
||||
int dest_cpu;
|
||||
cpumask_t allowed_mask;
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
|
@ -4696,20 +4699,26 @@ long sched_setaffinity(pid_t pid, const struct cpumask *in_mask)
|
|||
}
|
||||
#endif
|
||||
again:
|
||||
retval = __set_cpus_allowed_ptr(p, new_mask, true);
|
||||
|
||||
if (!retval) {
|
||||
cpuset_cpus_allowed(p, cpus_allowed);
|
||||
if (!cpumask_subset(new_mask, cpus_allowed)) {
|
||||
/*
|
||||
* We must have raced with a concurrent cpuset
|
||||
* update. Just reset the cpus_allowed to the
|
||||
* cpuset's cpus_allowed
|
||||
*/
|
||||
cpumask_copy(new_mask, cpus_allowed);
|
||||
goto again;
|
||||
cpumask_andnot(&allowed_mask, new_mask, cpu_isolated_mask);
|
||||
dest_cpu = cpumask_any_and(cpu_active_mask, &allowed_mask);
|
||||
if (dest_cpu < nr_cpu_ids) {
|
||||
retval = __set_cpus_allowed_ptr(p, new_mask, true);
|
||||
if (!retval) {
|
||||
cpuset_cpus_allowed(p, cpus_allowed);
|
||||
if (!cpumask_subset(new_mask, cpus_allowed)) {
|
||||
/*
|
||||
* We must have raced with a concurrent cpuset
|
||||
* update. Just reset the cpus_allowed to the
|
||||
* cpuset's cpus_allowed
|
||||
*/
|
||||
cpumask_copy(new_mask, cpus_allowed);
|
||||
goto again;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
retval = -EINVAL;
|
||||
}
|
||||
|
||||
out_free_new_mask:
|
||||
free_cpumask_var(new_mask);
|
||||
out_free_cpus_allowed:
|
||||
|
@ -5600,6 +5609,7 @@ int do_isolation_work_cpu_stop(void *data)
|
|||
*/
|
||||
nohz_balance_clear_nohz_mask(cpu);
|
||||
|
||||
clear_hmp_request(cpu);
|
||||
local_irq_enable();
|
||||
return 0;
|
||||
}
|
||||
|
@ -5724,7 +5734,6 @@ int sched_isolate_cpu(int cpu)
|
|||
|
||||
migrate_sync_cpu(cpu, cpumask_first(&avail_cpus));
|
||||
stop_cpus(cpumask_of(cpu), do_isolation_work_cpu_stop, 0);
|
||||
clear_hmp_request(cpu);
|
||||
|
||||
calc_load_migrate(rq);
|
||||
update_max_interval();
|
||||
|
|
Loading…
Add table
Reference in a new issue