linux kernel scheduler cfs的update_min_vruntime() 看起来还挺绕的。含义其实也简单,总一句话,将 cfs_rq->min_vruntime 设置为:
max( cfs_rq->vruntime, min(leftmost_se->vruntime, cfs_rq->curr->vruntime) )。
画个流程图,给它整个明明白白。
// 将 cfs_rq->min_vruntime 更新为 min(leftmost_se->vruntime, cfs_rq->curr->vruntime)
static void update_min_vruntime(struct cfs_rq *cfs_rq)
{struct sched_entity *curr = cfs_rq->curr;struct rb_node *leftmost = rb_first_cached(&cfs_rq->tasks_timeline);u64 vruntime = cfs_rq->min_vruntime;if (curr) {if (curr->on_rq)vruntime = curr->vruntime;elsecurr = NULL;}if (leftmost) { /* non-empty tree */struct sched_entity *se = __node_2_se(leftmost);if (!curr)vruntime = se->vruntime;elsevruntime = min_vruntime(vruntime, se->vruntime);}/* ensure we never gain time by being placed backwards. */cfs_rq->min_vruntime = max_vruntime(cfs_rq->min_vruntime, vruntime);
#ifndef CONFIG_64BITsmp_wmb();cfs_rq->min_vruntime_copy = cfs_rq->min_vruntime;
#endif
}