linuxのメモ

Linux kernelの実装を解説していきます (対象ver 4.5)

CPU操作 - percpu_add_op()

概要

CPU固有の指定されたシンボルの値に任意の値を加算する

詳細

このマクロでは以下の引数を取得する

  • 対象の値が保存されているポインタを示す : var
  • 対象に加算する値を示す : val

valの値によって実行されるアセンブラ命令の種類が以下のように変わります

  • valが定数で-1の場合
    • dec命令
  • valが定数で1の場合
    • inc命令
  • それ以外
    • add命令

これにより命令の実効速度が最速になるコードが生成できます

出力引数については__percpu_arg()マクロに0を引数として渡して実行した結果を使用しており、varのサイズに応じてb, w, l, qのsuffixが付加されるが、sizeが1, 2, 4, 8以外の場合は__bad_percpu_size()が実行される

尚、定数の確認はコンパイラの組み込み関数である__builtin_constant_p()で行う

途中で

if (0) {
  pao_T__ pao_tmp__;
  pao_tmp__ = (val);
  (void)pao_tmp__;
}

という実行時に実効されないコードがありますが、これはvalの型がvoid型に変換可能かをコンパイル時にチェックするためのもので、CPUのアーキテクチャーに応じたbit数(32bitか64bit)以上の型は扱えないことを意味します