高精度カーネルタイマ hrtimer のコールバックの仕組み(途中)

hrtimer は、 tick ベースの timer_list を用いた従来のカーネルタイマよりも、よりきめ細やかにタイマ管理を行いたい、というニーズに合わせて実装されました*1. カーネルタイマはタイマ割り込みのカウンタ jiffies が指定した値になると起動しますが、hrtimerでは ktime_t という単位を使ってコールバックが発生する時間を指定します.
hrtimerを使うための api の一覧は以下の通りです:

  1. hrtimer_init
    • hrtimer 構造体の初期化を行う.
  2. hrtimer_start
  3. hrtimer_try_to_cancel
    • 高精度カーネルタイマのキャンセルを試みる. コールバック処理が実行中だったら、あきらめる.
  4. hrtimer_cancel
    • 高精度カーネルタイマのキャンセル. 成功するまで hrtimer_try_to_cancel し続ける.
  5. hrtimer_get_remaining
    • タイマが起動するまでの残り時間を、 ktime_t 型で返す.
  6. hrtimer_forward
    • 現在時刻から、 ktime_t 分だけタイマの起動時間を進める.

その他、ktime_t と timespec 構造体の変換や、ktime_tの計算を行うための関数がいくつか用意されています.

(続く)

ktime_t の定義

 // linux-2.6.27.8/linux/ktime.h
 46 union ktime {
 47         s64     tv64;
 48 #if BITS_PER_LONG != 64 && !defined(CONFIG_KTIME_SCALAR)
 49         struct {
 50 # ifdef __BIG_ENDIAN
 51         s32     sec, nsec;
 52 # else
 53         s32     nsec, sec;
 54 # endif
 55         } tv;
 56 #endif
 57 };

*1:どうもPOSIXタイマtimer_crateなどを実装するために導入されたように見えます.