On Tue, Sep 19, 2017 at 03:37:12PM -0700, Rohit Jain wrote:
@@ -6019,7 +6040,8 @@ void __update_idle_core(struct rq *rq)This is broken... they're the exact _same_ variable.
static int select_idle_core(struct task_struct *p, struct sched_domain *sd, int target)
{
struct cpumask *cpus = this_cpu_cpumask_var_ptr(select_idle_mask);
+ struct cpumask *pcpus = this_cpu_cpumask_var_ptr(select_idle_mask);
+ int core;Therefore this _must_ be true.
if (!static_branch_likely(&sched_smt_present))
return -1;
@@ -6028,20 +6050,21 @@ static int select_idle_core(struct task_struct *p, struct sched_domain *sd, int
return -1;
cpumask_and(cpus, sched_domain_span(sd), &p->cpus_allowed);
+ cpumask_and(pcpus, cpus, &p->cpus_preferred);
+ core = scan_cpu_mask_for_idle_cores(pcpus, target);
+ if (core >= 0)
+ return core;
+ if (cpumask_equal(cpus, pcpus))
+ goto out;
Also, you're touching one of the hottest paths in the whole scheduler
You further failed to teach the actual load-balancer of this new mask,
so it will still happily move tasks around.