Messages in this thread Patch in this message | | | From | Barry Song <> | Subject | Re: [PATCH 8/9] sched/fair: select idle cpu from idle cpumask for task wakeup | Date | Fri, 17 Sep 2021 11:44:00 +0800 |
| |
[Aubrey wrote] > The idle core information is already in idle cpu mask, do we have a quick > and cheap way to extract out?
seems hard.
since we need an intermediate cpumask memory to save the result of cpumask bitmap operations, the only way i can get the idle core and make sure "cpus" isn't broken is:
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 361927803e31..abd844bcfb86 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -6187,8 +6187,14 @@ void __update_idle_core(struct rq *rq) */ static int select_idle_core(struct task_struct *p, int core, struct cpumask *cpus, int *idle_cpu) { - bool idle = true; - int cpu; + bool idle = true, possible_idle; + int cpu, wb, wa; + + wb = cpumask_weight(cpus); + cpumask_andnot(cpus, cpus, cpu_smt_mask(core)); + wa = cpumask_weight(cpus); + + possible_idle = (wa - wb == cpumask_weight(cpu_smt_mask(core))); if (!static_branch_likely(&sched_smt_present)) return __select_idle_cpu(core, p); @@ -6212,7 +6218,6 @@ static int select_idle_core(struct task_struct *p, int core, struct cpumask *cpu if (idle) return core; - cpumask_andnot(cpus, cpus, cpu_smt_mask(core)); return -1; }
but the questions are: 1. is it really cheap? 2. how to use possible_idle? right now, select_idle_core() is also selecting idle cpu. we shouldn't simply return when possible_idle is false. Thanks Barry
| |