From: Chen Lin <cheng.lin...@zte.com.cn> NUMA balancing has not taken *isolcpus(isolated cpus)* into consideration. It may migrate tasks onto isolated cpus and the migrated tasks will never escape from the isolated cpus, which will break the isolation provided by *isolcpus* boot parameter and intrduce various problems.
This patch ensure NUMA balancing not to balance tasks onto iaolated cpus. Signed-off-by: Cheng Lin <cheng.lin...@zte.com.cn> Signed-off-by: Tan Hu <tan...@zte.com.cn> Signed-off-by: Jiang Biao <jiang.bi...@zte.com.cn> --- kernel/sched/core.c | 9 ++++++--- kernel/sched/fair.c | 3 ++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index fe365c9..f9ce90c 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -1302,10 +1302,12 @@ int migrate_swap(struct task_struct *cur, struct task_struct *p) if (!cpu_active(arg.src_cpu) || !cpu_active(arg.dst_cpu)) goto out; - if (!cpumask_test_cpu(arg.dst_cpu, &arg.src_task->cpus_allowed)) + if ((!cpumask_test_cpu(arg.dst_cpu, &arg.src_task->cpus_allowed)) + || cpumask_test_cpu(arg.dst_cpu, cpu_isolated_map)) goto out; - if (!cpumask_test_cpu(arg.src_cpu, &arg.dst_task->cpus_allowed)) + if ((!cpumask_test_cpu(arg.src_cpu, &arg.dst_task->cpus_allowed)) + || cpumask_test_cpu(arg.src_cpu, cpu_isolated_map)) goto out; trace_sched_swap_numa(cur, arg.src_cpu, p, arg.dst_cpu); @@ -5508,7 +5510,8 @@ int migrate_task_to(struct task_struct *p, int target_cpu) if (curr_cpu == target_cpu) return 0; - if (!cpumask_test_cpu(target_cpu, &p->cpus_allowed)) + if ((!cpumask_test_cpu(target_cpu, &p->cpus_allowed)) + || cpumask_test_cpu(target_cpu, cpu_isolated_map)) return -EINVAL; /* TODO: This is not properly updating schedstats */ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 2f0a0be..a91f8fe 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -1724,7 +1724,8 @@ static void task_numa_find_cpu(struct task_numa_env *env, for_each_cpu(cpu, cpumask_of_node(env->dst_nid)) { /* Skip this CPU if the source task cannot migrate */ - if (!cpumask_test_cpu(cpu, &env->p->cpus_allowed)) + if ((!cpumask_test_cpu(cpu, &env->p->cpus_allowed)) + || cpumask_test_cpu(cpu, cpu_isolated_map)) continue; env->dst_cpu = cpu; -- 1.8.3.1