WALT-Windows Assisted Loading Tracking

Codebase reference: https://android.googlesource.com/kernel/common/+/android-4.9

kernel-4.14 EAS預設是PELT,4.9之前PELT還沒那麼成熟時採用的WALT

EAS關鍵的一環就是整個系統loading tracking了,那WALT是怎麼計算一個CPU的loading呢、或是更基本的一個task(泛指thread/process)的 loading(utilization)?

首先看看task_util是怎麼告訴我們一個task的loading的

這裡被config包住,在WALT定義中task的loading是要看ravg.demand這個參數

而se.avg.util_avg則是PELT會用的

那接著我們來看看task初始化的時候,ravg.demand會怎樣被定義。

fork的時候會初始化walt估計task的loading

而其實在wake_up_new_task這裡還會再重新做一次,意義不明…

可以看到這邊p->ravg.demand WALT估計loading會在這裡被assign value為 sysctl_sched_walt_init_task_load_pct  * walt_ravg_window / 100;

預設值可以在 kernel/sched/walt.c找到

sysctl_sched_walt_init_task_load_pct 這個參數可以在proc/sys/kernel/sched_walt_init_task_load_pct 做調整

所以以native kernel new task的初始loading: sysctl_sched_walt_init_task_load_pct  * 1024 / 100 = 153


初始化之後我們來看看ravg.demand是如何被更新

grep “walt_update_task_ravg” 後可以在kernel/scehed/core.c下 找到幾處有call walt_update_task_ravg

  1. scheduler_tick (週期性update)
  2. __schedule (排程要做context switch前會 update task loading)
  3. try_to_wake_up (喚醒前update)

這邊有看到一些windows start、delta的計算,但還是沒有看到ravg.demand如何被更新

註解有講到demand所以繼續往下看

一路往下可以最終在這裡看到

p->ravg.demand = demand;

從上面往下看依序看到 會蒐集 widx – samples  這區間內的windows history demand

繼續往下看可以看到walt_window_stats_policy 來決定demand是採recent max or average的決策,這也是可以調整的

大概是這樣。

之後會再繼續往下寫一篇DVFS相關的。

更多資料、圖像化可以參考這篇:

https://blog.csdn.net/wukongmingjing/article/details/81633225