【W(wǎng)ALT】scale_exec_time() 代碼詳解

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

代碼展示

static inline u64 scale_exec_time(u64 delta, struct rq *rq)
{
    u32 freq;
    // ⑴ 將 CPU cycles 轉(zhuǎn)換為 CPU 當(dāng)前頻率
    freq = cpu_cycles_to_freq(rq->cc.cycles, rq->cc.time);
    // ⑵ 歸一化 delta
    delta = DIV64_U64_ROUNDUP(delta * freq, max_possible_freq);
    delta *= rq->cluster->exec_scale_factor;
    delta >>= 10;

    return delta;
}

代碼邏輯:

scale_exec_time() 函數(shù)用于給任務(wù)的運(yùn)行時(shí)間 delta 進(jìn)行歸一化呐馆。

為什么歸一化续誉?

EAS 主要針對(duì)異構(gòu) CPU 架構(gòu),如 Arm big.LITTLE,因?yàn)檫@種架構(gòu)有不同性能和功耗的 CPU 核心蹦狂,不同 CPU 的最大算力厚满、最大頻率等都不同施逾。假定一個(gè)任務(wù)在當(dāng)前窗口中運(yùn)行了 5ms钉答,對(duì)不同頻率的兩個(gè) CPU 來(lái)說(shuō),5ms 帶來(lái)的負(fù)載是截然不同的灸叼。

WALT 算法引入了一種類似權(quán)重的方法神汹,根據(jù) CPU 的頻率(frequency)和 最大每周期指令數(shù)(efficiency)來(lái)對(duì)任務(wù)的運(yùn)行時(shí)間進(jìn)行歸一化庆捺。
(注:此處 efficiency 的定義并不確定,在內(nèi)核文檔中出現(xiàn)過(guò)這個(gè)定義屁魏。)

⑴ 將 CPU cycles 轉(zhuǎn)換為 CPU 當(dāng)前頻率

freq = cpu_cycles_to_freq(rq->cc.cycles, rq->cc.time);

static inline u32 cpu_cycles_to_freq(u64 cycles, u64 period)
{
    return div64_u64(cycles, period);
}

在這里 freq = rq->cc.cycles / rq->cc.time滔以。其中,rq->cc.cycles 和 rq->cc.time 在函數(shù) update_task_rq_cpu_cycles() 中更新:

static void
update_task_rq_cpu_cycles(struct task_struct *p, struct rq *rq, int event,
              u64 wallclock, u64 irqtime)
{
    u64 cur_cycles;
    int cpu = cpu_of(rq);

    lockdep_assert_held(&rq->lock);

    if (!use_cycle_counter) {
        rq->cc.cycles = cpu_cur_freq(cpu);
        rq->cc.time = 1;
        return;
    }

    cur_cycles = read_cycle_counter(cpu, wallclock);

    /*
     * If current task is idle task and irqtime == 0 CPU was
     * indeed idle and probably its cycle counter was not
     * increasing.  We still need estimatied CPU frequency
     * for IO wait time accounting.  Use the previously
     * calculated frequency in such a case.
     */
    if (!is_idle_task(rq->curr) || irqtime) {
        if (unlikely(cur_cycles < p->cpu_cycles))
            rq->cc.cycles = cur_cycles + (U64_MAX - p->cpu_cycles);
        else
            rq->cc.cycles = cur_cycles - p->cpu_cycles;
        rq->cc.cycles = rq->cc.cycles * NSEC_PER_MSEC;

        if (event == IRQ_UPDATE && is_idle_task(p))
            /*
             * Time between mark_start of idle task and IRQ handler
             * entry time is CPU cycle counter stall period.
             * Upon IRQ handler entry sched_account_irqstart()
             * replenishes idle task's cpu cycle counter so
             * rq->cc.cycles now represents increased cycles during
             * IRQ handler rather than time between idle entry and
             * IRQ exit.  Thus use irqtime as time delta.
             */
            rq->cc.time = irqtime;
        else
            rq->cc.time = wallclock - p->ravg.mark_start;
        BUG_ON((s64)rq->cc.time < 0);
    }

    p->cpu_cycles = cur_cycles;

    trace_sched_get_task_cpu_cycles(cpu, event, rq->cc.cycles, rq->cc.time, p);
}

⑵ 歸一化 delta

  1. delta = DIV64_U64_ROUNDUP(delta * freq, max_possible_freq);
    即 delta = delta * freq/max_possible_freq氓拼。

    freq 是當(dāng)前 CPU 的頻率你画,由 ⑴ 計(jì)算而得:freq = rq->cc.cycles / rq->cc.time。

    max_possible_freq 就是 max(policy->cpuinfo.max_freq)桃漾。
    policy 可以淺顯地認(rèn)為是簇號(hào)坏匪,如不同的 policy 指向小核簇、大核簇和超大核:

    • 對(duì)于擁有多個(gè) CPU 的簇來(lái)說(shuō)撬统,頻率的計(jì)算在 sugov_update_shared() 中進(jìn)行适滓,簇內(nèi)每個(gè) CPU 的頻率都是一致的秫逝,因此一個(gè)簇會(huì)擁有一個(gè)當(dāng)前頻率和一個(gè)最大頻率廓握,即 policy->cpuinfo.max_freq;
    • 對(duì)于單個(gè) CPU 來(lái)說(shuō)晦炊,頻率的計(jì)算在 sugov_update_single() 中進(jìn)行几于,它也會(huì)有一個(gè)最大頻率 policy->cpuinfo.max_freq蕊苗。

    在運(yùn)行該版本內(nèi)核的 pixel 3xl 中,8 個(gè) CPU 分為小核簇與大核簇沿彭,他們的最大頻率分別是 381 和 1024。

  2. delta *= rq->cluster->exec_scale_factor;
    cluster->exec_scale_factor = 1024 * cluster->efficiency/max_possible_efficiency

    cluster->efficiency 可能指 運(yùn)行任務(wù)的 CPU 的每周期指令數(shù) (IPC)尖滚。

    max_possible_efficiency 可能指 系統(tǒng)中任何 CPU 提供的最大 IPC喉刘。
    這個(gè)值在設(shè)備樹(shù)中給定,在運(yùn)行該版本內(nèi)核的 pixel 3xl 中漆弄,小核簇和大核簇的 max_possible_efficiency 分別是 1024 和 1740睦裳。

  3. delta >>= 10;
    即 delta = delta / 1024。

將三句代碼一起看撼唾,能得出一個(gè)等式:
delta\_s = delta\times\dfrac{curr\_freq}{max\_possible\_freq}\times\dfrac{cluster->efficiency}{max\_possible\_efficiency}

點(diǎn)擊此處回到 WALT 入口函數(shù) update_task_ravg()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末廉邑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子倒谷,更是在濱河造成了極大的恐慌蛛蒙,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渤愁,死亡現(xiàn)場(chǎng)離奇詭異牵祟,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)抖格,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門诺苹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)咕晋,“玉大人,你說(shuō)我怎么就攤上這事收奔≌莆兀” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵坪哄,是天一觀的道長(zhǎng)质蕉。 經(jīng)常有香客問(wèn)我,道長(zhǎng)损姜,這世上最難降的妖魔是什么饰剥? 我笑而不...
    開(kāi)封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮摧阅,結(jié)果婚禮上汰蓉,老公的妹妹穿的比我還像新娘。我一直安慰自己棒卷,他們只是感情好顾孽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著比规,像睡著了一般若厚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蜒什,一...
    開(kāi)封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天测秸,我揣著相機(jī)與錄音,去河邊找鬼灾常。 笑死霎冯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钞瀑。 我是一名探鬼主播沈撞,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼雕什!你這毒婦竟也來(lái)了缠俺?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贷岸,失蹤者是張志新(化名)和其女友劉穎壹士,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體凰盔,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡墓卦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了户敬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片落剪。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡睁本,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出忠怖,到底是詐尸還是另有隱情呢堰,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布凡泣,位于F島的核電站枉疼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鞋拟。R本人自食惡果不足惜骂维,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贺纲。 院中可真熱鬧航闺,春花似錦、人聲如沸猴誊。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)懈叹。三九已至乖杠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間澄成,已是汗流浹背胧洒。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留墨状,地道東北人略荡。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像歉胶,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子巴粪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容