Provided by: manpages-ja-dev_0.5.0.0.20131015+dfsg-2_all
名前
move_pages - あるプロセスの個々のページを別のノードに移動する
書式
#include <numaif.h> long move_pages(int pid, unsigned long count, void **pages, const int *nodes, int *status, int flags); -lnuma とリンクする。
説明
move_pages() は、プロセス pid の指定されたページ pages を nodes で指定されたメモリノード に移動する。 移動の結果は status に反映される。 flags では移動されるページに関する制約を指 定する。 pid は、移動されるページが属するプロセスの ID である。 別のプロセスのページを移動するため には、呼び出し元が特権 (CAP_SYS_NICE) を持っているか、呼び出したプロセスの実ユーザ ID か 実効ユーザ ID が ページ移動対象のプロセスの実ユーザ ID か保存 set-user-ID のどちらかと 一 致しなければならない。 pid が 0 の場合、 move_pages() は呼び出したプロセスのページを移動す る。 count は移動するページ数である。 count により pages, nodes, status の 3 つの配列の大きさが 定義される。 pages は、移動すべきページへのポインタの配列であり、 各ポインタはページ境界に揃えた値を指 定すべきである。 pid で指定されたプロセスで見えるアドレスを指定する。 nodes は、各ページの希望の移動場所を示す整数値の配列であり、 配列の各要素はノード番号であ る。 nodes には NULL を指定することもでき、この場合には move_pages() はどのページも移動し ないが、各ページが現在配置されているノードを配列 status に格納して返す。どのページを移動す る必要があるかを判断するために、 各ページの状態の取得が必要な場合もある。 status は、各ページの状態を表す整数値の配列である。 この配列に有効な値が格納されるのは、 move_pages() がエラーを返さなかった場合だけである。 flags には、どの種類のページを移動するかを指定する。 MPOL_MF_MOVE は、そのプロセスが排他的 に使用しているページだけを移動することを意味する。 MPOL_MF_MOVE_ALL は、複数のプロセス間で 共有されているページも移動できることを意味する。 MPOL_MF_MOVE_ALL を使用するためには、その プロセスが特権 (CAP_SYS_NICE) を持っていなければならない。 status 配列に格納されるページ状態 status 配列の各要素として、以下の値が返される。 0..MAX_NUMNODES そのページが配置されているノードを示す。 -EACCES そのページは複数のプロセスによりマップされており、 MPOL_MF_MOVE_ALL が指定された場 合にのみ移動できる。 -EBUSY そのページが現在ビジーであり、移動できない。後でもう一度試すこと。 この状況は、ペー ジが I/O の実行中であったり、カーネルの他のサブシステム がそのページへの参照を保持 している場合に発生する。 -EFAULT そのページが zero page であるか、そのメモリ領域はそのプロセスにより マップされてい ない。 -EIO ページを書き戻す (write back) ことができない。 ページが dirty で、ファイルシステム が dirty なページを移動できるような 移動機能を提供していないため、そのページを移動 するためにはページを 書き戻さなければならない。 -EINVAL dirty なページを移動できない。 ファイルシステムが dirty なページを移動するための機 能を提供しておらず、 ページを書き戻す能力もない。 -ENOENT ページが存在しない。 -ENOMEM 移動先のノードでメモリを確保することができない。
返り値
成功すると、 move_pages() は 0 を返す。 エラーの場合、-1 を返し、 errno にエラーを示す値 を設定する。
エラー
E2BIG 移動すべきページが多過ぎる。 EACCES 移動先のノードのいずれかが現在の CPU 集合では許可されていない。 EFAULT パラメータ配列にアクセスできなかった。 EINVAL flags に MPOL_MF_MOVE でも MPOL_MF_MOVE_ALL でもない値が指定されたか、カーネルス レッドのページを移動させようとした。 ENODEV 移動先のノードのいずれかがオンラインでない。 ENOENT 移動が必要なページが全く見つからなかった。 指定された全てのページが、すでに移動先の ノードに存在するか、存在しないか、 無効なアドレスであったか、複数のプロセスによって マップされていて移動でき なかったか、のいずれかであった。 EPERM 呼び出し元は MPOL_MF_MOVE_ALL を指定したが、十分な特権 (CAP_SYS_NICE) を持っていな い。 または、呼び出し元が他のユーザに属するプロセスのページを移動しようとしたが、 それを行えるだけの特権 (CAP_SYS_NICE) を持っていなかった。 ESRCH プロセスが存在しない。
バージョン
move_pages() は、バージョン 2.6.18 で初めて Linux に登場した。
準拠
このシステムコールは Linux 固有である。
注意
ライブラリによるサポートについては numa(7) を参照。 現在の CPU 集合で許可されているノードの集合を取得するには、フラグ MPOL_F_MEMS_ALLOWED を指 定して get_mempolicy(2) を使用すればよい。 取得した情報は、CPU 集合の手動または自動での再 構成により いつ何時変化してしまうか分からない。 この関数を使用すると、ページの位置 (ノード) が 指定されたアドレスに対して設定されたメモリ ポリシー (mbind(2) 参照) や指定されたプロセスに対して設定されたメモリポリシー (set_mempolicy(2) 参照) に違反してしまう可能性がある。 つまり、メモリポリシーは move_pages() で使われる移動先ノードを制限しないということである。 ヘッダファイル <numaif.h> は glibc には含まれておらず、 libnuma-devel か同様のパッケージを インストールする必要がある。
関連項目
get_mempolicy(2), mbind(2), set_mempolicy(2), numa(3), numa_maps(5), cpuset(7), numa(7), migratepages(8), numastat(8)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.54 の一部 である。プロジェクト の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。