文章目录
【WALT】predict_and_update_buckets() 与 update_task_pred_demand() 代码详解
代码版本:Linux4.9 android-msm-crosshatch-4.9-android12
代码展示
static inline u32 predict_and_update_buckets(struct rq *rq,
struct task_struct *p, u32 runtime) {
int bidx;
u32 pred_demand;
if (!sched_predl)
return 0;
// ⑴ 根据 runtime 给出桶的下标
bidx = busy_to_bucket(runtime);
// ⑵ 根据桶的下标预测 pred_demand
pred_demand = get_pred_busy(rq, p, bidx, runtime);
// ⑶ 根据桶的下标更新桶
bucket_increase(p->ravg.busy_buckets, bidx);
return pred_demand;
}
void update_task_pred_demand(struct rq *rq, struct task_struct *p, int event)
{
u32 new, old;
if (!sched_predl)
return;
if (is_idle_task(p) || exiting_task(p))
return;
if (event != PUT_PREV_TASK && event != TASK_UPDATE &&
(!SCHED_FREQ_ACCOUNT_WAIT_TIME ||
(event != TASK_MIGRATE &&
event != PICK_NEXT_TASK)))
return;
if (event == TASK_UPDATE) {
if (!p->on_rq && !SCHED_FREQ_ACCOUNT_WAIT_TIME)
return;
}
new = calc_pred_demand(rq, p);
old = p->ravg.pred_demand;
if (old >= new)
return;
if (task_on_rq_queued(p) && (!task_has_dl_policy(p) ||
!p->dl.dl_throttled))
p->sched_class->fixup_walt_sched_stats(rq, p, p->ravg.demand, new);
p->ravg.pred_demand = new;
}
代码逻辑
sched_predl 默认为 1,意味着正常情况下这两个函数都会执行。
predict_and_update_buckets() 主要通过桶算法来预测 pred_demand。其中,runtime 是在 update_task_demand() 中根据 scale_exec_time() 归一化过后的执行时间。
update_task_pred_demand() 主要是在任务的 perd_demand 值小于 curr_window 时再次计算 pred_demand。
桶算法的核心是数组 busy_buckets[NUM_BUSY_BUCKETS]。
代码中对数组 busy_buckets 的描述是:‘busy_buckets’ 将历史 busy time 分组到用于预测的不同桶中。(‘busy_buckets’ groups historical busy time into different buckets used for prediction.)
我将数组 busy_buckets 称之为一种类似 PELT 的机制,数组中每一个
WALT代码predict与update函数详解

本文详细解析了Linux 4.9 android - msm - crosshatch - 4.9 - android12版本中【WALT】的predict_and_update_buckets()与update_task_pred_demand()代码。介绍了代码逻辑,包括根据runtime给出桶下标、根据下标预测和更新pred_demand、更新桶等内容,还说明了桶算法的核心机制。
最低0.47元/天 解锁文章
685






