move_pages(2) System Calls Manual move_pages(2) NOM move_pages - Deplacer des pages individuelles d'un processus sur un autre noeud BIBLIOTHEQUE Bibliotheque de regles NUMA (Non-Uniform Memory Access) (libnuma, -lnuma) SYNOPSIS #include long move_pages(int pid, unsigned long count, void *pages[.count], const int nodes[.count], int status[.count], int flags); DESCRIPTION move_pages() deplace les pages indiquees du processus pid dans les noeuds de la memoire indiques par nodes. Le resultat du deplacement est reflete dans status. Les drapeaux flags indiquent des contraintes sur les pages a deplacer. pid est l'identifiant du processus dans lequel les pages doivent etre deplacees. Si pid est 0, move_pages() deplace des pages du processus appelant. Deplacer des pages dans un autre processus exige les privileges suivants : - Jusqua Linux 4.12 compris : l'appelant doit etre privilegie (CAP_SYS_NICE) ou l'identifiant utilisateur reel ou effectif du processus appelant doit correspondre a l'identifiant utilisateur, reel ou sauvegarde, du processus cible. - Les anciennes regles autorisaient l'appelant a voir plusieurs choix d'adresse virtuelle effectues par le noyau, ce qui pouvait faire echouer la distribution aleatoire de l'espace d'adressage (ASLR) pour un processus appartenant au meme identifiant utilisateur que l'appelant, ces regles ont ete modifiees depuis Linux 4.13. Depuis Linux 4.13, ce droit est gere par une verification du mode d'acces ptrace PTRACE_MODE_READ_REALCREDS vis-a-vis du processus cible ; voir ptrace(2). count est le nombre de pages a deplacer. Il definit la taille des trois tableaux pages, nodes et status. pages est un tableau de pointeurs vers des pages a deplacer. Ces pointeurs doivent etre alignes sur des limites de pages. Les adresses sont indiquees comme elles sont vues par le processus indique par pid. nodes est un tableau d'entiers qui indiquent les emplacements voulus pour chaque page. Chaque element du tableau est un numero de noeud. nodes peut aussi etre NULL, auquel cas move_pages() ne deplace aucune page mais renvoie dans status le noeud ou chaque page reside actuellement. Obtenir l'etat de chaque page peut etre necessaire pour trouver les pages qui doivent etre deplacees. status est un tableau d'entiers qui renvoie l'etat de chaque page. Le tableau ne contient des valeurs correctes que si move_pages() n'a pas renvoye d'erreur. La pre-initialisation du tableau sur une valeur qui ne peut pas representer un inoeud NUMA reel ou une erreur valable de tableau d'etat pourraient aider a identifier les pages ayant ete migrees. flags indique quels types de page deplacer. MPOL_MF_MOVE signifie que seules les pages qui ne peuvent etre utilisees qu'exclusivement par le processus sont a deplacer. MPOL_MF_MOVE_ALL signifie que les pages partagees entre plusieurs processus peuvent aussi etre deplacees. Le processus doit etre privilegie (CAP_SYS_NICE) pour utiliser MPOL_MF_MOVE_ALL. Etats des pages dans le tableau d'etat Les valeurs suivantes peuvent etre renvoyees dans chaque element du tableau status. 0..MAX_NUMNODES Indication du noeud sur lequel la page reside. -EACCES La page est projetee par plusieurs processus et ne peut etre deplacee que si MPOL_MF_MOVE_ALL est utilise. -EBUSY La page est actuellement occupee et ne peut etre deplacee. Essayez plus tard. Cela arrive si la page est utilisee pour des entrees/sorties ou si une autre partie du noyau conserve une reference sur la page. -EFAULT C'est la page de base (page zero) ou la zone memoire n'est pas projetee par le processus. -EIO Impossible de reecrire dans la memoire une page. La page doit etre reecrite pour la deplacer puisque la page est modifiee (dirty) et que le systeme de fichiers ne fournit pas de fonction de migration qui permettrait le deplacement de pages modifiees (dirty). -EINVAL Une page modifiee (dirty) ne peut pas etre deplacee. Le systeme de fichiers ne fournit pas de fonction de deplacement et n'a pas la possibilite de reecrire la page en memoire . -ENOENT La page n'est pas presente. -ENOMEM Impossible d'allouer de la memoire sur le noeud cible. VALEUR RENVOYEE S'il reussit, move_pages() renvoie zero. En cas d'erreur, il renvoie -1 et remplit errno pour indiquer l'erreur. Si une valeur positive est renvoyee, il s'agit du nombre de pages non migrees. ERREURS Valeur positive Le nombre de pages non migrees si elles ne provenaient pas de raisons non fatales (depuis Linux 4.17). E2BIG Trop de pages a deplacer. Depuis Linux 2.6.29, le noyau ne genere plus cette erreur. EACCES Un des noeuds cible n'est pas autorise dans l'ensemble de processeurs en cours. EFAULT Impossible d'acceder a un tableau en parametre. EINVAL Un drapeau autre que MPOL_MF_MOVE ou MPOL_MF_MOVE_ALL a ete indique ou on a essaye de deplacer des pages d'un thread noyau. ENODEV Un des noeuds cibles n'est pas connecte. EPERM L'appelant a indique MPOL_MF_MOVE_ALL sans les privileges suffisants (CAP_SYS_NICE). Ou bien l'appelant a essaye de deplacer des pages d'un processus appartenant a un autre utilisateur mais n'etait pas autorise a le faire (CAP_SYS_NICE). ESRCH Le processus n'existe pas. STANDARDS Linux. HISTORIQUE Linux 2.6.18 NOTES Pour des informations sur la prise en charge des bibliotheques, consultez numa(7). Utilisez get_mempolicy(2) avec le drapeau MPOL_F_MEMS_ALLOWED pour obtenir l'ensemble des noeuds autorises par l'ensemble de processeurs courant. Notez que cette information peut changer a tout instant du fait d'une reconfiguration manuelle ou automatique de l'ensemble de processeurs. L'utilisation de cette fonction peut aboutir a des pages dont l'emplacement (le noeud) viole la politique memoire etablie pour les adresses indiquees (voir mbind(2)) ou pour le processus indique (consultez set_mempolicy(2)). En d'autres termes, la politique memoire ne restreint pas les noeuds de destination utilises par move_pages(). L'en-tete n'est pas inclus dans la glibc, mais necessite l'installation de libnuma-devel (ce nom peut varier suivant les distributions). VOIR AUSSI get_mempolicy(2), mbind(2), set_mempolicy(2), numa(3), numa_maps(5), cpuset(7), numa(7), migratepages(8), numastat(8) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Jean-Philippe MENGUAL Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 move_pages(2)