June 2012

もう3回ぐらい忘れてコード読み直しているのでメモ


http://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/mbind.2.html


mode 引き数には、追加で モードフラグ を含めることもできる。 サポートされている モードフラグ は以下の通りである。

MPOL_F_STATIC_NODES (Linux-2.6.26 以降)
空でない nodemask は、物理ノード ID である。 Linux では、そのプロセスが異なる CPU 集合コンテキスト (cpuset context) に移動した場合でも、そのプロセスの現在の CPU 集合コンテキストで 許可されているノード集合が変化した場合でも、 nodemask をマッピングし直すことはない。
MPOL_F_RELATIVE_NODES (Linux-2.6.26 以降)
空でない nodemask は、そのプロセスの現在の CPU 集合で許可されているノード ID 集合 における相対的なノード ID である。



とmanには書いてあるがどちらも指定しなかった場合の動作が、明確に書かれていない。なので簡単に解説してみることにする。

set_mempolicy(2), mbind(2) の 追加modeには2つの意味がある 1)引数に指定するCPU番号が絶対値か(cpusetからの)相対値か 2)cpusetの /cgroup/cpusets/[group]/cpuset.mems が書き換えられたときにcpu bindingを再計算するかどうか

MPOL_F_STATIC_NODESが 1)CPU番号は絶対値 2)cpuset.mems の変更には追従しない
MPOL_F_RELATIVE_NODESが 1)CPU番号は相対値 2)cpuset.mems の変更に追従する

であり

デフォルトは 1) CPU番号は絶対値、 ただし 2)cpuset.memsの変更には追従する

である。もうすこし厳密に書く仮にCPUが4つあり、cpuset.memsが4-7に制約されているとする。
mbind()でcpu番号3を指定するとEINVAL (MPOL_BINDのときにエラーチェックが漏れてる気がする。
あとで直そう)、4を指定すると通る。

その後で、cpuset.memsが0-3に変更されたとすると 4->0, 5->1, 6->2, 7->3 というスライド変換が
実施されて束縛cpuは4から0に変化する。memsの変更前後で束縛CPU数が変わっちゃった場合の扱いは
かなり適当なので、あんまり頭いい動作を期待しないほうがいい。

というかデフォルトの追従動作とMPOL_F_RELATIVE_NODESの追従動作が微妙に仕様が違うのはバグではないかと思っているので今後仕様変更はありうる。

↑このページのトップヘ