move_pages
Section: System Calls (2)
Updated: 5 février 2023
Index
Return to Main Contents
NOM
move_pages - Déplacer des pages individuelles d'un processus sur un autre
nœud
BIBLIOTHÈQUE
Bibliothèque de règles NUMA (Non-Uniform Memory Access) (libnuma,
-lnuma)
SYNOPSIS
#include <numaif.h>
long move_pages(int pid, unsigned long count, void *pages[.count],
const int nodes[.count], int status[.count], int flags);
DESCRIPTION
move_pages() déplace les pages indiquées du processus pid dans les
nœuds de la mémoire 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 est l'identifiant du processus dans lequel les pages doivent être
déplacées. Si pid est 0, move_pages() déplace des pages du
processus appelant.
Déplacer des pages dans un autre processus exige les privilèges suivants :
- •
-
Jusquà Linux 4.12 compris : l'appelant doit être privilégié
(CAP_SYS_NICE) ou l'identifiant utilisateur réel ou effectif du processus
appelant doit correspondre à l'identifiant utilisateur, réel ou sauvegardé,
du processus cible.
- •
-
Les anciennes règles autorisaient l'appelant à voir plusieurs choix
d'adresse virtuelle effectués par le noyau, ce qui pouvait faire échouer la
distribution aléatoire de l'espace d'adressage (ASLR) pour un processus
appartenant au même identifiant utilisateur que l'appelant, ces règles ont
été modifiées depuis Linux 4.13. Depuis Linux 4.13, ce droit est géré par
une vérification du mode d'accès ptrace PTRACE_MODE_READ_REALCREDS
vis-à-vis du processus cible ; voir 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 est un tableau d'entiers qui renvoie l'état de chaque page. Le
tableau ne contient des valeurs correctes que si move_pages() n'a pas
renvoyé d'erreur. La pré-initialisation du tableau sur une valeur qui ne
peut pas représenter un inœud NUMA réel ou une erreur valable de tableau
d'état pourraient aider à identifier les pages ayant été migrées.
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ées. Le
processus doit être privilégié (CAP_SYS_NICE) pour utiliser
MPOL_MF_MOVE_ALL.
États des pages dans le tableau d’état
Les valeurs suivantes peuvent être renvoyées dans chaque élément du tableau
status.
- 0..MAX_NUMNODES
-
Indication du 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. Cela 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 la page de base (page zéro) ou la zone mémoire n'est pas projetée par
le processus.
- -EIO
-
Impossible de réécrire dans la mémoire une page. La page doit être réécrite
pour la déplacer puisque la page est modifiée (dirty) et que le système de
fichiers ne fournit pas de fonction de migration qui permettrait le
déplacement de pages modifiées (dirty).
- -EINVAL
-
Une page modifiée (dirty) 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 en mémoire .
- -ENOENT
-
La page n'est pas présente.
- -ENOMEM
-
Impossible d'allouer de la mémoire sur le nœud cible.
VALEUR RENVOYÉE
S'il réussit, move_pages() renvoie zéro. En cas d'erreur, il renvoie
-1 et remplit errno pour indiquer l'erreur. Si une valeur positive est
renvoyée, il s'agit du nombre de pages non migrées.
ERREURS
- Valeur positive
-
Le nombre de pages non migrées si elles ne provenaient pas de raisons non
fatales (depuis Linux 4.17).
- E2BIG
-
Trop de pages à déplacer. Depuis Linux 2.6.29, le noyau ne génère plus cette
erreur.
- EACCES
-
Un des nœuds cible n'est pas autorisé 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.
VERSIONS
move_pages() est apparu pour la première fois dans Linux 2.6.18.
STANDARDS
Cet appel système est spécifique à Linux.
NOTES
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 du fait
d'une reconfiguration manuelle ou automatique de l'ensemble de processeurs.
L'utilisation de cette fonction peut aboutir à 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).
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 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>,
David Prévot <david@tilapin.org>
et
Jean-Philippe MENGUAL <jpmengual@debian.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 à
Index
- NOM
-
- BIBLIOTHÈQUE
-
- SYNOPSIS
-
- DESCRIPTION
-
- États des pages dans le tableau d’état
-
- VALEUR RENVOYÉE
-
- ERREURS
-
- VERSIONS
-
- STANDARDS
-
- NOTES
-
- VOIR AUSSI
-
- TRADUCTION
-
This document was created by
man2html,
using the manual pages.
Time: 13:55:20 GMT, May 22, 2024