On Tue, Aug 06, 2019 at 02:19:57PM -0700, Tim Chen wrote:
> +void account_core_idletime(struct task_struct *p, u64 exec)
> +{
> +     const struct cpumask *smt_mask;
> +     struct rq *rq;
> +     bool force_idle, refill;
> +     int i, cpu;
> +
> +     rq = task_rq(p);
> +     if (!sched_core_enabled(rq) || !p->core_cookie)
> +             return;

I don't see why return here for untagged task. Untagged task can also
preempt tagged task and force a CPU thread enter idle state.
Untagged is just another tag to me, unless we want to allow untagged
task to coschedule with a tagged task.

> +     cpu = task_cpu(p);
> +     force_idle = false;
> +     refill = true;
> +     smt_mask = cpu_smt_mask(cpu);
> +
> +     for_each_cpu(i, smt_mask) {
> +             if (cpu == i)
> +                     continue;
> +
> +             if (cpu_rq(i)->core_forceidle)
> +                     force_idle = true;
> +
> +             /* Only refill if everyone has run out of allowance */
> +             if (cpu_rq(i)->core_idle_allowance > 0)
> +                     refill = false;
> +     }
> +
> +     if (force_idle)
> +             rq->core_idle_allowance -= (s64) exec;
> +
> +     if (rq->core_idle_allowance < 0 && refill) {
> +             for_each_cpu(i, smt_mask) {
> +                     cpu_rq(i)->core_idle_allowance += (s64) 
> SCHED_IDLE_ALLOWANCE;
> +             }
> +     }
> +}

Reply via email to