|
@@ -6646,10 +6646,10 @@ int can_migrate_task(struct task_struct *p, struct lb_env *env)
|
|
|
* our sched_group. We may want to revisit it if we couldn't
|
|
|
* meet load balance goals by pulling other tasks on src_cpu.
|
|
|
*
|
|
|
- * Also avoid computing new_dst_cpu if we have already computed
|
|
|
- * one in current iteration.
|
|
|
+ * Avoid computing new_dst_cpu for NEWLY_IDLE or if we have
|
|
|
+ * already computed one in current iteration.
|
|
|
*/
|
|
|
- if (!env->dst_grpmask || (env->flags & LBF_DST_PINNED))
|
|
|
+ if (env->idle == CPU_NEWLY_IDLE || (env->flags & LBF_DST_PINNED))
|
|
|
return 0;
|
|
|
|
|
|
/* Prevent to re-select dst_cpu via env's cpus */
|
|
@@ -8022,14 +8022,7 @@ static int load_balance(int this_cpu, struct rq *this_rq,
|
|
|
.tasks = LIST_HEAD_INIT(env.tasks),
|
|
|
};
|
|
|
|
|
|
- /*
|
|
|
- * For NEWLY_IDLE load_balancing, we don't need to consider
|
|
|
- * other cpus in our group
|
|
|
- */
|
|
|
- if (idle == CPU_NEWLY_IDLE)
|
|
|
- env.dst_grpmask = NULL;
|
|
|
-
|
|
|
- cpumask_copy(cpus, cpu_active_mask);
|
|
|
+ cpumask_and(cpus, sched_domain_span(sd), cpu_active_mask);
|
|
|
|
|
|
schedstat_inc(sd->lb_count[idle]);
|
|
|
|
|
@@ -8151,7 +8144,15 @@ more_balance:
|
|
|
/* All tasks on this runqueue were pinned by CPU affinity */
|
|
|
if (unlikely(env.flags & LBF_ALL_PINNED)) {
|
|
|
cpumask_clear_cpu(cpu_of(busiest), cpus);
|
|
|
- if (!cpumask_empty(cpus)) {
|
|
|
+ /*
|
|
|
+ * Attempting to continue load balancing at the current
|
|
|
+ * sched_domain level only makes sense if there are
|
|
|
+ * active CPUs remaining as possible busiest CPUs to
|
|
|
+ * pull load from which are not contained within the
|
|
|
+ * destination group that is receiving any migrated
|
|
|
+ * load.
|
|
|
+ */
|
|
|
+ if (!cpumask_subset(cpus, env.dst_grpmask)) {
|
|
|
env.loop = 0;
|
|
|
env.loop_break = sched_nr_migrate_break;
|
|
|
goto redo;
|
|
@@ -8447,6 +8448,13 @@ static int active_load_balance_cpu_stop(void *data)
|
|
|
.src_cpu = busiest_rq->cpu,
|
|
|
.src_rq = busiest_rq,
|
|
|
.idle = CPU_IDLE,
|
|
|
+ /*
|
|
|
+ * can_migrate_task() doesn't need to compute new_dst_cpu
|
|
|
+ * for active balancing. Since we have CPU_IDLE, but no
|
|
|
+ * @dst_grpmask we need to make that test go away with lying
|
|
|
+ * about DST_PINNED.
|
|
|
+ */
|
|
|
+ .flags = LBF_DST_PINNED,
|
|
|
};
|
|
|
|
|
|
schedstat_inc(sd->alb_count);
|