哪个内核函数管理平衡 linux CFS 的 RB 树?

Which kernel function manages balancing the RB-tree of the linux CFS?

根据我目前对 Linux CFS 的了解,调度实体由 RB 树中的虚拟运行时 (vruntime) 索引。

调度程序通过调用 update_curr 函数定期更新此 vruntime,这基本上增加了当前 运行 实体的 vruntime 值。

我不明白的是调度程序如何使 RB 树始终井井有条。 update_curr 函数增加了 vruntime 的值,但似乎没有检查实体是否应该移回 RB-tree 的右侧。哪个函数执行此检查?

update_curr 不仅会增加 vruntime 的值,它还会调用 account_cfs_rq_runtime,后者最终会调用 resched_curr,这将修复 RB-tree (最终)

虽然 Ahmed 关于 update_curr 的说法是正确的,但我仍然对树在更新 vruntime 和最终调用 resched_curr 之间可能不平衡这一事实感到困惑。事实上,事实证明当前调度的任务 不是树的一部分 .

它从 set_next_entity(cfs_rq_of(se), se); 中的树中删除,在调用 pick_next_task_fair 时调用。所以树总是平衡的,执行平衡的唯一函数是 enqueue_entitydequeue_entity