Provided by: manpages-ja-dev_0.5.0.0.20161015+dfsg-1_all bug

名前

       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 の指定されたページ pagesnodes で指定されたメモリーノー
       ドに移動する。 移動の結果は 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 flagsMPOL_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.79 の一部  である。プロジェクト
       の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。