【WALT】WALT入口 update_task_ravg()代码详解

【WALT】WALT入口 update_task_ravg() 代码详解

代码版本:Linux4.9 android-msm-crosshatch-4.9-android12

代码展示

void update_task_ravg(struct task_struct *p, struct rq *rq, int event,
                        u64 wallclock, u64 irqtime) {
    u64 old_window_start;
    
    // ⑴ 判断是否进入 WALT 算法
    if (!rq->window_start || sched_disable_window_stats ||
        p->ravg.mark_start == wallclock)
        return;

    lockdep_assert_held(&rq->lock);

    // ⑵ 获取 WALT 算法中上一个窗口的开始时间
    old_window_start = update_window_start(rq, wallclock, event);

    // ⑶ 如果任务刚初始化结束,不进入 WALT 算法,进入 `done`
    if (!p->ravg.mark_start) {
        update_task_cpu_cycles(p, cpu_of(rq), wallclock);
        goto done;
    }

    // ⑷ 更新任务及 CPU 的 cycles
    update_task_rq_cpu_cycles(p, rq, event, wallclock, irqtime);
    // ⑸ 更新任务及 CPU 的 demand 及 pred_demand
    update_task_demand(p, rq, event, wallclock);
    // ⑹ 更新 CPU 的 busy time
    update_cpu_busy_time(p, rq, event, wallclock, irqtime);
    // ⑺ 更新任务的 pred_demand
    update_task_pred_demand(rq, p, event);

    // ⑻ 如果任务正在退出,进入 `done`
    if (exiting_task(p))
        goto done;

    // 两个系统自带的 tracepoint
    trace_sched_update_task_ravg(p, rq, event, wallclock, irqtime,
                rq->cc.cycles, rq->cc.time, &rq->grp_time);
    trace_sched_update_task_ravg_mini(p, rq, event, wallclock, irqtime,
                rq->cc.cycles, rq->cc.time, &rq->grp_time);

done:
    p->ravg.mark_start = wallclock;
    run_walt_irq_work(old_window_start, rq);
}

代码逻辑

WALT 算法以任务为主,当任务被唤醒、任务开始执行、任务停止执行、任务退出、窗口滚动、频率变化、任务迁移、经过一个调度tick、在中断结束时会调用update_task_ravg()

其中,窗口是 WALT 算法中的一个特殊的设定,将在 update_task_demand()update_cpu_busy_time() 中详细解释。

⑴ 判断是否进入 WALT 算法

在进入 WALT 算法后首先会判断当前任务所在的运行队列(runqueue)是否进行初始化,以及是否禁用 CPU 的窗口统计:if(!rq->window_start || sched_disable_window_stats...)。如果没有初始化,就不会记录窗口的开始时间,任务负载就无法进行计算。有几点需要注意:

  1. 该处是指 rq,而非 cfs->rq 或 rt->rq,即该处不区分实时任务或普通任务;
  2. 任务/CPU 窗口(sched_ravg_window)是自定义的,不同版本代码或不同设备中设置的窗口大小是不一样的,调整的位置也不尽相同。

然后会判断窗口开始时间是否更新:if(...p->ravg.mark_start == wallclock)。如果运行队列没有初始化,或禁用了 CPU 的窗口统计,或窗口开始时间没有更新,就会直接结束 WALT 算法。

⑵ 获取 WALT 算法中上一个窗口的开始时间

然后通过函数update_window_start()获取上一个窗口的开始时间,存在变量old_window_start中。

点击此处查看 update_window_start() 代码详解。

⑶ 如果任务刚初始化结束

如果任务刚初始化结束:if(!p->ravg.mark_start),还没有标记过任务的开始时间,就先通过函数 update_task_cpu_cycles() 更新一下该任务的 cycles 值(p->cpu_cycles),然后进入 done

⑷ 更新任务及 CPU 的 cycles

update_task_cpu_cycles() 相似,但比其多更新了 CPU 的 cycles 值(rq->cc.cycles)。

⑸ 更新任务及 CPU 的 demand 及 pred_demand

在任务满足条件后,在不同情况下根据任务的开始时间、窗口的开始时间以及当前时间来计算任务在当前及之前M个窗口中的运行时间。在窗口结束时将运行时间进行归一化,并统计进任务的历史窗口中(sum_history[RAVG_HIST_SIZE])。

WALT 算法根据历史窗口中的值计算任务的 demand,根据桶算法计算任务的 pred_demand,并将 demand 与 pred_demand 统计进任务所在 CPU 的 rq(runqueue)中。

注意:以上说的 demand 与 pred_demand 都是预测值。

点击此处查看 update_task_demand() 代码详解。

⑹ 更新 CPU 的 busy time

在任务满足条件后,在不同情况下根据任务的开始时间、窗口的开始时间以及当前时间来计算任务在当前及上一个窗口中的运行时间,将不同窗口内的运行时间进行归一化,并根据任务的状态统计进任务的 curr_windowprev_window 中,以及任务所在 rq 的 curr_runnable_sumprev_runnable_sum 中。

在窗口翻滚的时候更新任务的 window 值 以及 rq 的 runnable_sum 的值。

注意:以上说的 window 以及 runnable_sum 都是真实值。

点击此处查看 update_cpu_busy_time() 代码详解。

⑺ 更新任务的 pred_demand

如果符合条件的任务在当前窗口中预测出来的 demand 值小于 curr_window,则再次使用桶算法计算 pred_demand。

点击此处查看 update_task_pred_demand() 代码详解。

⑻ 如果任务正在退出

#define EXITING_TASK_MARKER 0xdeaddead

static inline int exiting_task(struct task_struct *p)
{
    return (p->ravg.sum_history[0] == EXITING_TASK_MARKER);
}

当任务最近一个窗口的值为 0xdeaddead 时,意味着任务正在退出,进入 done

done 结束部分:

  1. 更新一下任务的开始时间:p->ravg.mark_start = wallclock
  2. 通过函数 irq_work_queue() 处理没有 tick 的情况,循环调用 update_task_ravg()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 175,490评论 5 419
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 74,060评论 2 335
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 124,407评论 0 291
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 47,741评论 0 248
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 56,543评论 3 329
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 43,040评论 1 246
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 34,107评论 3 358
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 32,646评论 0 229
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 36,694评论 1 271
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 32,398评论 2 279
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 33,987评论 1 288
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 30,097评论 3 285
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 35,298评论 3 282
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 27,278评论 0 14
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 28,413评论 1 232
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 38,397评论 2 309
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 38,099评论 2 314

推荐阅读更多精彩内容