On Mon, Aug 26, 2019 at 07:46:50PM +0800, QiaoChong wrote:
> From: Chong Qiao <qiaoch...@loongson.cn>
> 
> Such as:
> cpu_cgroup_attach>
>  sched_move_task>
>   task_change_group_fair>
>    task_move_group_fair>
>     detach_task_cfs_rq>
>      vruntime_normalized>
> 
>       /*
>        * When !on_rq, vruntime of the task has usually NOT been normalized.
>        * But there are some cases where it has already been normalized:
>        *
>        * - A forked child which is waiting for being woken up by
>        *   wake_up_new_task().
>        * - A task which has been woken up by try_to_wake_up() and
>        *   waiting for actually being woken up by sched_ttwu_pending().
>        */
>       if (!se->sum_exec_runtime ||
>           (p->state == TASK_WAKING && p->sched_remote_wakeup))
>               return true;
> 
> p->se.sum_exec_runtime is 0, does not mean task not been run (A forked child 
> which is waiting for being woken up by  wake_up_new_task()).
> 
> Task may have been scheduled multimes, but p->se.sum_exec_runtime is still 0, 
> because delta_exec maybe 0 in update_curr.
> 
> static void update_curr(struct cfs_rq *cfs_rq)
> {
> ...
>       delta_exec = now - curr->exec_start;
>       if (unlikely((s64)delta_exec <= 0))
>               return;
> ...
> 
>       curr->sum_exec_runtime += delta_exec;
> ...
> }
> 
> Task has been run and is stopped(on_rq == 0), vruntime not been normalized, 
> but se->sum_exec_runtime == 0.
> This cause vruntime_normalized set on_rq 1, and does not normalize vruntime.
> This may cause task use old vruntime in old cgroup, which maybe very large 
> than task's vruntime in new cgroup.
> Which may cause task may not scheduled in run queue for long time after been 
> waked up.
> 
> Now I change sum_exec_runtime to 1 when sum_exec_runtime == 0 in update_curr 
> to make sun_exec_runtime not 0.

Have you actually observed this? It is very hard to have a 0 delta
between two scheduling events.

Reply via email to