migrate_pages -
プロセスの全ページを別のノード集合に移動する
#include <numaif.h>
long migrate_pages(int pid, unsigned long maxnode,
const unsigned long *old_nodes,
const unsigned long *new_nodes);
-lnuma とリンクする。
MIGRATE_PAGES()
は、メモリーノード
old_nodes にあるプロセス
pid
の全ページを、メモリーノード
new_nodes
に移動しようとする。
old_nodes で
指定されたメモリーノードに置かれていないページは移動されない。
カーネルは、
new_nodes
への移動の際に、
old_nodes 内の相対的な
トポロジー関係を可能な限り維持しようとする。
引数
old_nodes と
new_nodes
は、最大で
maxnode
ビットから
構成されるノード番号のビットマスクへのポインターである。
各ビットマスクは符号なし
long
整数の配列として管理される
(
maxnode
で指定された長さを越えた部分のビットは無視される)。
引数
maxnode
は最大ノード番号であり、ビットマスクの長さに
1 を 加えた値となる
(これは
mbind(2)
と同じだが、
select(2)
とは違う)。
引数
pid
は、移動を行うページの所有者のプロセス
ID である。
別のプロセスのページを移動するには、呼び出したプロセスが特権
(
CAP_SYS_NICE)
を持っているか、呼び出したプロセスの実ユーザー
ID か 実効ユーザー ID
がページ移動の対象プロセスの実ユーザー
ID か saved-set ユーザー ID
と一致していなければならない。
pid が 0 の場合、
migrate_pages()
は呼び出したプロセスのページを移動する。
別のプロセスと共有しているページは、呼び出したプロセスが
CAP_SYS_NICE
特権を持っている場合にのみ移動される。
migrate_pages()
は、移動できなかったページ数を返す
(つまり、移動に成功した場合は返り値は
0 となる)。
エラーの場合、 -1
を返し、
errno
にエラーを示す値を設定する。
- EFAULT
-
old_nodes/new_nodes と maxnode
で指定されたメモリー領域の一部または全部が、
呼び出し元がアクセス可能なアドレス空間外を指している。
- EINVAL
- The value specified by maxnode exceeds a
kernel-imposed limit. Or, old_nodes or new_nodes specifies
one or more node IDs that are greater than the maximum supported node ID.
Or, none of the node IDs specified by new_nodes are on-line and
allowed by the process's current cpuset context, or none of the specified
nodes contain memory.
- EPERM
-
pid
で指定されたプロセスのページを移動するのに必要な特権
( CAP_SYS_NICE)
がなかった。または、指定された対象ノードにアクセス
するのに必要な権限 (
CAP_SYS_NICE) がなかった。
- ESRCH
- プロセス ID が pid
のプロセスが見つからなかった。
migrate_pages()
システムコールは Linux 2.6.16
で初めて登場した。
このシステムコールは
Linux 固有である。
ライブラリによるサポートについては
numa(7) を参照。
呼び出し元プロセスの
CPU
集合で許可されているノード集合を取得するには、
MPOL_F_MEMS_ALLOWED
フラグを付けて
get_mempolicy(2) を使うこと。
この情報は、手動/自動に限らず
CPU
集合の再構成によりいつでも
変更されることがある点に注意してほしい。
migrate_pages
を使用すると、ページが置かれる場所
(ノード) が、指定
されたアドレスに対して設定されたメモリーポリシー
(
mbind(2) 参照) や
指定されたプロセスに対して設定されたメモリーポリシー
(
set_mempolicy(2) 参照)
に違反する状況になる可能性がある。
すなわち、メモリーポリシーによる制約は
migrate_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)
Linux カーネルソースの
Documentation/vm/page_migration.rst
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。