• Zhang Qiao's avatar
    sched: Initialize the vruntime of a new task when it is first enqueued · c40dd90a
    Zhang Qiao authored
    When creating a new task, we initialize vruntime of the newly task at
    sched_cgroup_fork(). However, the timing of executing this action is too
    early and may not be accurate.
    
    Because it uses current CPU to init the vruntime, but the new task
    actually runs on the cpu which be assigned at wake_up_new_task().
    
    To optimize this case, we pass ENQUEUE_INITIAL flag to activate_task()
    in wake_up_new_task(), in this way, when place_entity is called in
    enqueue_entity(), the vruntime of the new task will be initialized.
    
    In addition, place_entity() in task_fork_fair() was introduced for two
    reasons:
    1. Previously, the __enqueue_entity() was in task_new_fair(),
    in order to provide vruntime for enqueueing the newly task, the
    vruntime assignment equation "se->vruntime = cfs_rq->min_vruntime" was
    introduced by commit e9acbff6 ("sched: introduce se->vruntime").
    This is the initial state of place_entity().
    
    2. commit 4d78e7b6 ("sched: new task placement for vruntime") added
    child_runs_first task placement feature which based on vruntime, this
    also requires the new task's vruntime value.
    
    After removing the child_runs_first and enqueue_entity() from
    task_fork_fair(), this place_entity() no longer makes sense, so remove
    it also.
    Signed-off-by: default avatarZhang Qiao <zhangqiao22@huawei.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20240627133359.1370598-1-zhangqiao22@huawei.com
    c40dd90a
core.c 266 KB