Linuxの備忘録とか・・・(目次へ)Linuxの備忘録とか・・・(目次へ)numaのノードID取得alloc_pages()でpageを取得する時、NUMAはalloc_pages_current()、SMPはnuma_node_id()をノードとしてalloc_pages_node()をコールします。numa_node_id()はCPU変数から取得したカレント動作しているCPUのノードです。order)#endifmempolicyにはv/wの2つのノードマスクで、mode/flagsの組み合わせによって、どのノードを使うかを決定します。通常vのノードを使うことになります。(wのノードの使い方は調査中です。w;};MPOL_DEFAULTは、MPOL_PREFERRED/MPOL_F_LOCALとなります。MPOL_F_LOCAL,};alloc_pages_current()でNUMA時のpage割り当てを行います。mempolicyのmodeに応じてどのノードからpageを割り当てるかと云う事です。MPOL_INTERLEAVEなら、interleave_nodes()でカレントプロセスcurrent->il_nextをノードIDとしalloc_page_interleave()を、そうでないならpolicy_zonelist()でノードIDを取得し、__alloc_pages_nodemask()をコールします。page;}EXPORT_SYMBOL(alloc_pages_current);MPOL_INTERLEAVEのノードID取得を行います。カレントプロセスのil_nextをノードIDとし、next_node()でその次のノードIDを次回のノードIDとして、カレントプロセスのil_nextに設定することで、ノードを順に使用することになります。カレントプロセス下から取得することで、異なるエレメント間でのpage取得においても、ノード順に相互に反映されます。nid;}MPOL_INTERLEAVE以外の時のノードIDそしてノードリストの取得を行います。引数のndはnuma_node_id()で、カレントノードIDです。・MPOL_PREFERREDの時MPOL_F_LOCALが設定されていれば、カレントノードがノードIDとなります。mempolicyのpreferred_nodeが。このノードは一般的に優先度の高いノードあるいは特別なノードを設定します。・MPOL_BINDの時__GFP_THISNODEでないか、カレントノードがmempolicyに設定されていなければ、mempolicy->v.nodesの最初(下位ビットから検索)のノードを取得する。なければカレントノードがノードIDとなる。gfp);}以上概略要約すれば、MPOL_DEFAULT/MPOL_INTERLEAVEは、使用可能なノードを順番に、MPOL_PREFERREDはmempolicyのv.preferred_nodeを、MPOL_BINDはカレントノードが使用可能ノードならカレントノードを、そうでないなら使用可能な最初のノードを。gfpにも依存しています。node_zonelists[MAX_ZONELISTS]のnode_zonelists[0]のリストを選択することになります。これは全ゾーンのメモリがリストされています。ノースAdsense広告情報が設定されていません。