对于组调度而言,需要传播负载的变化到整个cfs列表里面。propagate_entity_load_avg就负责传播组调度负载的变化
propagate_entity_load_avg
/* Update task and its cfs_rq load average */
static inline int propagate_entity_load_avg(struct sched_entity *se)
{
struct cfs_rq *cfs_rq;
//只有group下面才有cfs_rq,才需要传播
if (entity_is_task(se))
return 0;
if (!test_and_clear_tg_cfs_propagate(se))
return 0;
/* 获取se所在的cfs_rq */
cfs_rq = cfs_rq_of(se);
set_tg_cfs_propagate(cfs_rq);
/* 更新group se与其所在的cfs_rq中的负载 */
update_tg_cfs_util(cfs_rq, se);
update_tg_cfs_load(cfs_rq, se);
trace_sched_load_cfs_rq(cfs_rq);
trace_sched_load_se(se);
return 1;
}
// 将cfs_rq->propagate_avg 设置为1
static inline void set_tg_cfs_propagate(struct cfs_rq *cfs_rq)
{
cfs_rq->propagate_avg = 1;
}
// 将cfs_rq->propagate_avg 设置为0
static inline int test_and_clear_tg_cfs_propagate(struct sched_entity *se)
{
struct cfs_rq *cfs_rq = group_cfs_rq(se);
if (!cfs_rq->propagate_avg)
return 0;
cfs_rq->