MOVE_PAGES(2) Manuel du programmeur Linux MOVE_PAGES(2)

move_pages - Déplacer des pages individuelles d'un processus sur un autre nœud

#include <numaif.h>
long move_pages(int pid, unsigned long count, void **pages,
                const int *nodes, int *status, int flags);

Effectuez l'édition des liens avec l'option -lnuma.

move_pages() déplace les pages indiqué du processus pid dans les nœuds indiqués par nodes. Le résultat du déplacement est reflété dans status. Les drapeaux flags indiquent des contraintes sur les pages à déplacer.

pid is the ID of the process in which pages are to be moved. If pid is 0, then move_pages() moves pages of the calling process.

To move pages in another process requires the following privileges:

  • In kernels up to and including Linux 4.12: the caller must be privileged (CAP_SYS_NICE) or the real or effective user ID of the calling process must match the real or saved-set user ID of the target process.
  • The older rules allowed the caller to discover various virtual address choices made by the kernel that could lead to the defeat of address-space-layout randomization for a process owned by the same UID as the caller, the rules were changed starting with Linux 4.13. Since Linux 4.13, permission is governed by a ptrace access mode PTRACE_MODE_READ_REALCREDS check with respect to the target process; see ptrace(2).

count est le nombre de pages à déplacer. Il définit la taille des trois tableaux pages, nodes et status.

pages est un tableau de pointeurs vers des pages à déplacer. Ces pointeurs doivent être alignés sur des limites de pages. Les adresses sont indiquées comme elles sont vues par le processus indiqué par pid.

nodes est un tableau d'entiers qui indiquent les emplacements voulus pour chaque page. Chaque élément du tableau est un numéro de nœud. nodes peut aussi être NULL, auquel cas move_pages() ne déplace aucune page mais renvoie dans status le nœud où chaque page réside actuellement. Obtenir l'état de chaque page peut être nécessaire pour trouver les pages qui doivent être déplacées.

status is an array of integers that return the status of each page. The array contains valid values only if move_pages() did not return an error. Preinitialization of the array to a value which cannot represent a real numa node or valid error of status array could help to identify pages that have been migrated.

flags indique quels types de page déplacer. MPOL_MF_MOVE signifie que seules les pages qui ne peuvent être utilisées qu'exclusivement par le processus sont à déplacer. MPOL_MF_MOVE_ALL signifie que les pages partagées entre plusieurs processus peuvent aussi être déplacée. Le processus doit être privilégié (CAP_SYS_NICE) pour utiliser MPOL_MF_MOVE_ALL.

Les valeurs suivantes peuvent être renvoyées dans chaque élément du tableau status.
0..MAX_NUMNODES
Indique le nœud sur lequel la page réside.
-EACCES
La page est projetée par plusieurs processus et ne peut être déplacée que si MPOL_MF_MOVE_ALL est utilisé.
-EBUSY
La page est actuellement occupée et ne peut être déplacée. Essayez plus tard. Ceci arrive si la page est utilisée pour des entrées/sorties ou si une autre partie du noyau conserve une référence sur la page.
-EFAULT
C'est une page nulle ou la zone mémoire n'est pas projetée par le processus.
-EIO
Impossible de réécrire une page. La page doit être réécrite pour la déplacer puisque la page est sale et que le système de fichiers ne fournit pas de fonction de migration qui permettrait le déplacement de pages sales.
-EINVAL
Une page sale ne peut pas être déplacée. Le système de fichiers ne fournit pas de fonction de déplacement et n'a pas la possibilité de réécrire la page.
-ENOENT
La page n'est pas présente.
-ENOMEM
Impossible d'allouer de la mémoire sur le nœud cible.

On success move_pages() returns zero. On error, it returns -1, and sets errno to indicate the error. If positive value is returned, it is the number of nonmigrated pages.

Positive value
The number of nonmigrated pages if they were the result of nonfatal reasons (since Linux 4.17). E2BIG Too many pages to move. Since Linux 2.6.29, the kernel no longer generates this error.
EACCES
Un des nœuds cibles n'est pas autorisés dans l'ensemble de processeurs en cours.
EFAULT
Impossible d'accéder à un tableau en paramètre.
EINVAL
Un drapeau autre que MPOL_MF_MOVE ou MPOL_MF_MOVE_ALL a été indiqué ou on a essayé de déplacer des pages d'un thread noyau.
ENODEV
Un des nœuds cibles n'est pas connecté.
EPERM
L'appelant a indiqué MPOL_MF_MOVE_ALL sans les privilèges suffisants (CAP_SYS_NICE). Ou bien l'appelant a essayé de déplacer des pages d'un processus appartenant à un autre utilisateur mais n'était pas autorisé à le faire (CAP_SYS_NICE).
ESRCH
Le processus n'existe pas.

move_pages() est apparu pour la première fois sous Linux avec le noyau 2.6.18.

Cet appel système est spécifique à Linux.

Pour des informations sur la prise en charge des bibliothèques, consultez numa(7).

Utilisez get_mempolicy(2) avec le drapeau MPOL_F_MEMS_ALLOWED pour obtenir l'ensemble des nœuds autorisés par l'ensemble de processeurs courant. Notez que cette information peut changer à tout instant d'une fait d'une reconfiguration manuelle ou automatique de l'ensemble de processeurs.

L'utilisation de cette fonction peut causer des pages dont l'emplacement (le nœud) viole la politique mémoire établie pour les adresses indiquées (voir mbind(2)) ou pour le processus indiqué (consultez set_mempolicy(2)). En d'autres termes, la politique mémoire ne restreint pas les nœuds de destination utilisés par move_pages().

L'en-tête <numaif.h> n'est pas inclus dans la glibc, mais nécessite l'installation de libnuma-devel (ce nom peut varier suivant les distributions).

get_mempolicy(2), mbind(2), set_mempolicy(2), numa(3), numa_maps(5), cpuset(7), numa(7), migratepages(8), numastat(8)

Cette page fait partie de la publication 5.08 du projet man-pages Linux. Une description du projet et des instructions pour signaler des anomalies et la dernière version de cette page, peuvent être trouvées à l'adresse https://www.kernel.org/doc/man-pages/.

La traduction française de cette page de manuel a été créée par Christophe Blaess https://www.blaess.fr/christophe/, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org> et David Prévot <david@tilapin.org>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à <debian-l10n-french@lists.debian.org>.

9 juin 2020 Linux