move_pages - Déplacer des pages individuelles d'un processus sur un autre
nœud
Bibliothèque de règles NUMA (Non-Uniform Memory Access) (
libnuma,
-lnuma)
#include <numaif.h>
long move_pages(int pid, unsigned long count, void *pages[.count],
const int nodes[.count], int status[.count], int flags);
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.
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.
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.
- 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.
move_pages() est apparu pour la première fois dans
Linux 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 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).
get_mempolicy(2),
mbind(2),
set_mempolicy(2),
numa(3),
numa_maps(5),
cpuset(7),
numa(7),
migratepages(8),
numastat(8)
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]>, David Prévot <
[email protected]> et
Jean-Philippe MENGUAL <
[email protected]>
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 à
[email protected]