vmstatのソースコードリーディング3

kernel_stat構造体はcpu_usage_stat構造体, irq配列, 割り込みの合計値, softirqの配列を保持しており,
DECLARE_PER_CPUでCPU毎に保持されている.

1. include/linux/kernel_stat.hで外部関数としてaccount_***_timeの関数が定義されている.
2. 実際の関数はkernel/sched.cに実装されている.
 例えば,account_user_time関数の場合,
 ここでtask_struct構造体で表現される各プロセスが利用したuser timeを加算し,
 そのついでに,kstat->userの値も加算している.
 このとき,TASK_NICE(p)が 0より大きい場合には niceに加算している.
3. account-***-time関数はuser,system,guest,idleについて定義されており,
これらの関数は, account-***-ticks関数で呼び出されている.
account-process-ticks関数では,最初に割り込みであったかどうかを判定し,
そうで無い場合にさらにuser,system,idleのどれに時間を追加するのかを判断している.
4. account-process-ticksはkernel/timer.cのupdate_process_times関数で呼ばれている.
ここで,run_local_timers関数で時計を進めることと,rcu_check_callbacksでtiemr時間が経過したcallbackの確認をしている.
5. update_process_times関数はkernel/time/tick-sched.cで呼ばれている.
ここから先はsckedulerのコードを読まないとわからないかも。

とりあえず,kstatの情報がどのように更新されるのかが把握できたため,よしとする。
次は,プロセス毎の値がどのように管理,取得されているのかを調べる.
top.cのソースコードから順にトレースしていきたい.