| .\" Hey Emacs! This file is -*- nroff -*- source. |
| .\" |
| .\" This manpage is Copyright (C) 2006 Silicon Graphics, Inc. |
| .\" Christoph Lameter |
| .\" |
| .\" Permission is granted to make and distribute verbatim copies of this |
| .\" manual provided the copyright notice and this permission notice are |
| .\" preserved on all copies. |
| .\" |
| .\" Permission is granted to copy and distribute modified versions of this |
| .\" manual under the conditions for verbatim copying, provided that the |
| .\" entire resulting derived work is distributed under the terms of a |
| .\" permission notice identical to this one. |
| .\" |
| .TH MOVE_PAGES 2 2006-10-31 "Linux 2.6.18" "Linux Programmer's Manual" |
| .SH NAME |
| move_pages \- Move individual pages of a process to another node |
| .SH SYNOPSIS |
| .B #include <numaif.h> |
| .sp |
| .BI "long move_pages(int " pid ", unsigned long count, void ** " pages ", const int * " nodes ", int * " status ", int " flags ); |
| .SH DESCRIPTION |
| .BR move_pages () |
| moves |
| .I count |
| pages to the |
| .I nodes. |
| The result of the move is reflected in |
| .I status. |
| The |
| .I flags |
| indicate constraints on the pages to be moved. |
| |
| .I pid |
| is the process id in which pages are to be moved. Sufficient rights |
| must exist to move pages of another process. This means the moving |
| process either has root priviledges, has SYS_NICE administrative rights or |
| the same owner. If pid is 0 then we move pages of the current process. |
| |
| .I count |
| is the number of pages to move. It defines the size of the three |
| arrays |
| .I pages, |
| .I nodes |
| and |
| .I status. |
| |
| .I pages |
| is an array of pointers to the pages that should be moved. These are pointers |
| that should be aligned to page boundaries. Addresses are specified as seen by |
| the process specified by |
| .I pid. |
| |
| .I nodes |
| is either an array of integers that specify the desired location for each |
| page or it is NULL. Each integer is a node number. If NULL is specified then |
| move_pages will not move any pages but return the node of each page in |
| the |
| .I status |
| array. Having the status of each page may be necessary to determine |
| pages that need to be moved. |
| |
| .I status |
| is an array of integers that return the status of each page. The array |
| only contains valid values if |
| .I move_pages |
| did not return an error code. |
| |
| .I flags |
| specify what types of pages to move. |
| .B MPOL_MF_MOVE |
| means that only pages that are in exclusive use by the process |
| are to be moved. |
| .B MPOL_MF_MOVE_ALL |
| means that pages shared between multiple processes can also be moved. |
| The process must have root priviledges or SYS_NICE priviledges. |
| |
| .SH Page states in the status array |
| |
| .TP |
| .B 0..MAX_NUMNODES |
| Indicates that the location of the page is on this node. |
| .TP |
| .B -ENOENT |
| The page is not present. |
| .TP |
| .B -EACCES |
| The page is mapped by multiple processes and can only be moved |
| if |
| .I MPOL_MF_MOVE_ALL |
| is specified. |
| .TP |
| .B -EBUSY |
| The page is currently busy and cannot be moved. Try again later. |
| This occurs if a page is undergoing I/O or another kernel subsystem |
| is holding a reference to the page. |
| .TP |
| .B -EFAULT |
| This is a zero page or the memory area is not mapped by the process. |
| .TP |
| .B -ENOMEM |
| Unable to allocate memory on target node. |
| .TP |
| .B -EIO |
| Unable to write back a page. The page has to be written back |
| in order to move ti since the page is dirty and the filesystem |
| has not provide a migration function that would allow the move |
| of dirty pages. |
| .TP |
| .B -EINVAL |
| A dirty page cannot be moved. The filesystem does not |
| provide a migration function and has no ability to write back pages. |
| |
| .SH "RETURN VALUE" |
| On success |
| .B move_pages |
| returns zero. |
| .SH ERRORS |
| .TP |
| .B -ENOENT |
| No pages were found that require moving. All pages are either already |
| on the target node, not present, had an invalid address or could not be |
| moved because they were mapped by multiple processes. |
| .TP |
| .B -EINVAL |
| Flags other than |
| .I MPOL_MF_MOVE |
| and |
| .I MPOL_MF_MOVE_ALL |
| was specified or an attempt was made to migrate pages of a kernel thread. |
| .TP |
| .B -EPERM |
| .I MPOL_MF_MOVE_ALL |
| specified without sufficient privileges or an attempt to move a process |
| belonging to another user. |
| .TP |
| .B -EACCESS |
| On of the target nodes is not allowed by the current cpuset. |
| .TP |
| .B -ENODEV |
| On of the target nodes is not online. |
| .TP |
| .B -ESRCH |
| Process does not exist. |
| .TP |
| .B -E2BIG |
| Too many pages to move. |
| .TP |
| .B -EFAULT |
| Parameter array could not be accessed. |
| .SH "SEE ALSO" |
| .BR numa_maps (5), |
| .BR migratepages (8), |
| .BR numa_stat (8), |
| .BR numa (3) |