Provided by: manpages-fr-dev_4.13-4_all bug

NOM

       ioctl_userfaultfd  -  Créer un descripteur de fichier pour gérer les erreurs de pagination
       dans l'espace utilisateur

SYNOPSIS

       #include <sys/ioctl.h>

       int ioctl(int fd, int cmd, ...);

DESCRIPTION

       Diverses opérations ioctl(2) peuvent être effectuées sur un objet userfaultfd (créé par un
       appel à userfaultfd(2)) en utilisant des appels sous la forme :

           ioctl(fd, cmd, argp);
       Dans  ce  qui  précède,  fd  est  un  descripteur  de  fichier  se  rapportant  à un objet
       userfaultfd, cmd étant une des commandes ci-dessous et argp étant  un  pointeur  vers  une
       structure de données spécifique à cmd.

       Les  opérations  ioctl(2)  sont décrites ci-dessous. Celles UFFDIO_API, UFFDIO_REGISTER et
       UFFDIO_UNREGISTER sont utilisées pour  configurer  le  comportement  de  userfaultfd.  Ces
       opérations  permettent  à l'appelant de choisir les fonctionnalités qui seront activées et
       le type d'événement transmis à l'application. Ces opérations  permettent  à  l'application
       appelante de résoudre des événements de problèmes de pages.

   UFFDIO_API
       (Depuis  Linux 4.3). Activer l'opération de userfaultfd et effectuer la poignée de main de
       l'API.

       Le paramètre argp est un pointeur vers une structure uffdio_api, définie en tant que :

           struct uffdio_api {
               __u64 api;        /* Version de l'API demandée (entrée) */
               __u64 features;   /* Fonctionnalités demandées (entrée/sortie) */
               __u64 ioctls;     /* Opérations ioctl() disponibles (sortie) */
           };

       Le champ api reflète la version de l'API demandée par l'application.

       Le noyau vérifie qu'il peut gérer la version de l'API demandée et il positionne les champs
       features  et  ioctls à des masques de bit représentant toutes les fonctions disponibles et
       les opérations ioctl(2) génériques disponibles.

       Pour les versions du noyau Linux antérieures à  la  4.11,  le  champ  features  doit  être
       initialisé  à  zéro  avant  l'appel  UFFDIO_API,  et  zéro  (c'est-à-dire  pas  de  bit de
       fonctionnalité) est mis dans le champ  features  par  le  noyau  à  partir  du  retour  de
       ioctl(2).

       À partir de Linux 4.11, le champ features peut être utilisé pour demander si des fonctions
       particulières sont prises en charge et  pour  activer  explicitement  des  fonctionnalités
       userfaultfd  désactivées  par  défaut.  Le  noyau  signale  toujours  toutes les fonctions
       disponibles dans le champ features.

       Pour activer les  fonctionnalités  userfaultfd,  l'application  doit  positionner  un  bit
       correspondant  à  chaque  fonction  qu'il veut activer dans le champ features. Si le noyau
       gère toutes les fonctionnalités demandées, il les activera. Sinon, il mettra zéro dans  la
       structure uffdio_api renvoyée et il renverra EINVAL.

       Les bits fonctionnels suivants peuvent être positionnés :

       UFFD_FEATURE_EVENT_FORK (depuis Linux 4.11)
              Quand  cette  fonctionnalité  est  activée,  les  objets  userfaultfd associés à un
              processus parent sont dupliqués dans un processus enfant lors d'un  fork(2)  et  un
              événement UFFD_EVENT_FORK est généré sur le moniteur du userfaultfd

       UFFD_FEATURE_EVENT_REMAP (depuis Linux 4.11)
              Si  cette  fonctionnalité est activée, quand le processus fautif appelle mremap(2),
              le moniteur userfaultfd recevra un événement de type UFFD_EVENT_REMAP.

       UFFD_FEATURE_EVENT_REMOVE (depuis Linux 4.11)
              Si cette fonctionnalité est ativée, quand le processus  fautif  appelle  madvise(2)
              avec  les  valeurs  MADV_DONTNEED  ou  MADV_REMOVE pour libérer une zone de mémoire
              virtuelle, le moniteur userfaultfd recevra un événement de type UFFD_EVENT_REMOVE.

       UFFD_FEATURE_EVENT_UNMAP (depuis Linux 4.11)
              Si cette fonctionnalité est  activée,  quand  le  processus  fautif  désassocie  la
              mémoire  virtuelle explicitement avec munmap(2), ou implicitement lors d'un mmap(2)
              ou  d'un  mremap(2),  le  moniteur  userfaultfd  recevra  un  événement   de   type
              UFFD_EVENT_UNMAP.

       UFFD_FEATURE_MISSING_HUGETLBFS (depuis Linux 4.11)
              Si  ce  bit  fonctionnel  est positionné, le noyau gère l'enregistrement des plages
              userfaultfd par défaut dans les zones hugetlbfs de mémoire virtuelle

       UFFD_FEATURE_MISSING_SHMEM (depuis Linux 4.11)
              Si ce bit fonctionnel est positionné, le noyau prend en charge l'enregistrement  de
              plages  userfaultfd  dans  les zones de mémoire partagées. Cela comprend toutes les
              APIs de mémoire partagée du noyau : la mémoire partagée  System  V,  tmpfs(5),  les
              tableaux  partagés  de  /dev/zero,  mmap(2)  avec l'attribut MAP_SHARED positionné,
              memfd_create(2) et ainsi de suite.

       UFFD_FEATURE_SIGBUS (depuis Linux 4.14)
              Si  ce  bit  fonctionnel  est  positionné,  aucun  événement   d'erreur   de   page
              (UFFD_EVENT_PAGEFAULT)  ne  sera  généré.  Un  signal  SIGBUS sera plutôt envoyé au
              processus fautif. Les applications qui utilisent cette  fonctionnalité  n'exigeront
              pas  qu'on utilise un moniteur userfaultfd pour gérer les accès mémoire aux régions
              enregistrées avec userfaultfd.

       Le champ ioctls renvoyé peut contenir les bits suivants :

       1 << _UFFDIO_API
              L'opération UFFDIO_API est prise en charge.

       1 << _UFFDIO_REGISTER
              L'opération UFFDIO_REGISTER est prise en charge.

       1 << _UFFDIO_UNREGISTER
              L'opération UFFDIO_UNREGISTER est prise en charge.

       Cette opération ioctl(2) renvoie 0 en cas de succès. En cas d'erreur, -1  est  renvoyé  et
       errno est positionné pour indiquer l'origine de l'erreur. Parmi les erreurs possibles :

       EFAULT argp  renvoie  à  une  adresse  en  dehors  de  l'espace  d'adressage accessible du
              processus appelant.

       EINVAL Le userfaultfd a déjà été activé par une précédente opération UFFDIO_API.

       EINVAL La version de l'API demandée dans le champ api n'est pas prise  en  charge  par  ce
              noyau  ou  le  champ  features  passé  au  noyau comprend des bits non gérés par la
              version actuelle du noyau.

   UFFDIO_REGISTER
       (Depuis Linux 4.3). Enregistrer une plage d'adresse mémoire avec l'objet userfaultfd.  Les
       pages de cette plage doivent être « compatibles »

       Jusqu'au  noyau 4.11 de Linux, seules les plages anonymes privées sont compatibles pour un
       enregistrement avec UFFDIO_REGISTER.

       Depuis Linux 4.11, hugetlbfs et les plages de mémoire partagée sont aussi compatibles avec
       UFFDIO_REGISTER.

       Le  paramètre  argp  est  un  pointeur vers une structure uffdio_register, définie en tant
       que :

           struct uffdio_range {
               __u64 start;    /* Début de la plage */
               __u64 len;      /* Longueur de la plage (octets) */
           };

           struct uffdio_register {
               struct uffdio_range range;
               __u64 mode;     /* Mode désiré de l'opération (entrée) */
               __u64 ioctls;   /* Opérations ioctl() disponibles (sortie) */
           };

       Le champ range définit une plage de mémoire commençant  à  start  et  s'étendant  sur  len
       octets qui doit être gérée par userfaultfd.

       Le champ mode définit le mode d'opération désiré pour cette région de mémoire. Les valeurs
       suivantes peuvent être mises en bits et liées pour positionner le mode userfaultfd pour la
       plage indiquée :

       UFFDIO_REGISTER_MODE_MISSING
              Retrouver les erreurs de pages du fait de pages absentes.

       UFFDIO_REGISTER_MODE_WP
              Retrouver des erreurs de page du fait de pages protégées en écriture.

       Actuellement, le seul mode pris en charge est UFFDIO_REGISTER_MODE_MISSING.

       Si  l'opération  réussit,  le noyau modifie le champ du masque de bit ioctls pour indiquer
       les opérations ioctl(2) disponibles sur la plage indiquée. Ce masque de bit renvoyé est le
       même que pour UFFDIO_API.

       Cette  opération  ioctl(2)  renvoie 0 en cas de succès. En cas d'erreur, -1 est renvoyé et
       errno est positionné pour indiquer l'origine de l'erreur. Parmi les erreurs possibles :

       EBUSY  Un tableau de la plage indiquée est enregistré avec un autre objet userfaultfd.

       EFAULT argp renvoie à  une  adresse  en  dehors  de  l'espace  d'adressage  accessible  du
              processus appelant.

       EINVAL Un  bit  non valable ou non pris en charge a été indiqué dans le champ mode ; ou le
              champ mode valait zéro.

       EINVAL Il n'y a pas de tableau dans la plage d'adresse indiquée.

       EINVAL range.start ou range.len n'est pas un multiple de la taille de la page du système ;
              ou range.len vaut zéro ; ou ces champs ne sont pas valables pour d'autres raisons.

       EINVAL Un tableau incompatible est présent dans la plage d'adresse indiquée.

   UFFDIO_UNREGISTER
       (Depuis Linux 4.3). Désenregistre une plage d'adresse mémoire de userfaultfd. Les pages de
       cette plage doivent être « compatibles » (voir la description de UFFDIO_REGISTER).

       La plage d'adresse à désenregistrer est  indiquée  dans  la  structure  uffdio_range  vers
       laquelle pointe argp.

       Cette  opération  ioctl(2)  renvoie 0 en cas de succès. En cas d'erreur, -1 est renvoyé et
       errno est positionné pour indiquer l'origine de l'erreur. Parmi les erreurs possibles :

       EINVAL Le champ start ou len de la structure ufdio_range n'était pas  un  multiple  de  la
              taille  de  la  page  système ;  ou  bien  le champ len valait zéro ; ou ces champs
              n'étaient pas valables pour d'autres raisons.

       EINVAL Un tableau incompatible est présent dans la plage d'adresse indiquée.

       EINVAL Il n'y avait pas de tableau dans la plage d'adresse spécifiée.

   UFFDIO_COPY
       (Depuis Linux 4.3). Copier de manière atomique un bloc de mémoire continu  dans  la  plage
       enregistrée  pour  le  userfault  et  réveiller  éventuellement  les  threads bloqués. Les
       adresses source et cible et le nombre d'octets à copier sont indiqués dans les champs src,
       dst et len de la structure uffdio_copy vers laquelle pointe argp :

           struct uffdio_copy {
               __u64 dst;    /* Cible de la copie */
               __u64 src;    /* Origine de la copie */
               __u64 len;    /* Nombre d'octets à copier */
               __u64 mode;   /* Drapeaux contrôlant le comportement de la copie */
               __s64 copy;   /* Nombre d'octets copiés ou erreurs de refus */
           };

       La  valeur  suivante  peut  être  liée  en  bits  à  mode pour modifier le comportement de
       l'opération UFFDIO_COPY :

       UFFDIO_COPY_MODE_DONTWAKE
              Ne pas réveiller le thread qui attend la résolution d'une erreur de page

       Le champ copy est utilisé par le noyau pour renvoyer le  nombre  d'octets  copiés  ou  une
       erreur  (une  valeur  négative  à  la  façon  errno).  Si  la valeur renvoyée dans copy ne
       correspond pas à celle indiquée dans len, l'opération  échoue  avec  l'erreur  EAGAIN.  Le
       champ copy n'est fait que pour la sortie ; il n'est pas lu par l'opération UFFDIO_COPY.

       Cette  opération  ioctl(2)  renvoie  0  en cas de succès. Dans ce cas, toute la zone a été
       copiée. En cas d'erreur, -1 est renvoyé et errno est positionné pour indiquer l'origine de
       l'erreur. Parmi les erreurs possibles :

       EAGAIN Le  nombre  d'octets  copiés (à savoir la valeur renvoyée dans le champ copy) n'est
              pas la même que celle indiquée dans le champ len.

       EINVAL dst ou len n'était pas un multiple de la taille de la page du système ou  la  plage
              indiquée dans src et len ou dst et len n'était pas valable.

       EINVAL Un bit non valable a été indiqué dans le champ mode.

       ENOENT (depuis Linux 4.11)
              Le  processus  fautif  a  modifié  sa  structure de mémoire virtuelle en même temps
              qu'une opération UFFDIO_COPY remarquable.

       ENOSPC (de Linux 4.11 à Linux 4.13)
              Le processus fautif a quitté au moment de l'opération UFFDIO_COPY.

       ESRCH (depuis Linux 4.13)
              Le processus fautif a quitté au moment de l'opération UFFDIO_COPY.

   UFFDIO_ZEROPAGE
       (Depuis Linux 4.3). Remplit de zéros une plage mémoire enregistrée avec userfaultfd.

       La plage demandée est indiquée par le champ range de  la  structure  uffdio_zeropage  vers
       laquelle pointe argp :

           struct uffdio_zeropage {
               struct uffdio_range range;
               __u64 mode;     /* Drapeaux contrôlant le comportement de la copie */
               __s64 zeropage; /* Nombre d'octets remplis de zéros ou d'erreurs de refus */
           };

       La  valeur  suivante peut être mise en bit et liée dans mode pour modifier le comportement
       de l'opération UFFDIO_ZEROPAGE :

       UFFDIO_ZEROPAGE_MODE_DONTWAKE
              Ne pas réveiller le thread qui attend la résolution d'une erreur de page.

       Le champ zeropage est utilisé par le noyau pour renvoyer le  nombre  d'octets  remplis  de
       zéros,  ou  une  erreur  de la même manière que UFFDIO_COPY. Si la valeur renvoyée dans le
       champ zeropage ne correspond pas à celle indiquée dans range.len, l'opération échoue  avec
       l'erreur  EAGAIN.  Le  champ  zeropage  ne  sert  qu'à  la  sortie ;  il  n'est pas lu par
       l'opération UFFDIO_ZEROPAGE.

       L'opération ioctl(2) renvoie 0 en cas de succès. Dans ce cas, toute la zone a été  remplie
       de  zéros. En cas d'erreur, -1 est renvoyé et errno est positionné pour indiquer l'origine
       de l'erreur. Parmi les erreurs possibles :

       EAGAIN Le nombre d'octets remplis de zéros (c'est-à-dire la valeur renvoyée dans le  champ
              zeropage) ne correspond pas à la valeur indiquée dans le champ range.len.

       EINVAL range.start  ou  range.len  n'était  pas  un  multiple  de  la taille de la page du
              système ; ou range.len était de zéro ; ou la plage indiquée n'était pas valable.

       EINVAL Un bit non valable a été indiqué dans le champ mode.

       ESRCH (depuis Linux 4.13)
              Le processus fautif a quitté au moment de l'opération UFFDIO_ZEROPAGE.

   UFFDIO_WAKE
       (Depuis Linux 4.3). Réveiller le thread qui attend la résolution de l'erreur de  page  sur
       une plage d'adresse mémoire indiquée.

       L'opération  UFFDIO_WAKE  est utilisée avec les opérations UFFDIO_COPY et UFFDIO_ZEROPAGE,
       dont le bit UFFDIO_COPY_MODE_DONTWAKE ou UFFDIO_ZEROPAGE_MODE_DONTWAKE est défini  dan  le
       champ  mode.  Le  moniteur  userfault  peut  effectuer plusieurs opérations UFFDIO_COPY et
       UFFDIO_ZEROPAGE  automatiquement,  puis  réveiller  explicitement  le  thread  fautif   en
       utilisant UFFDIO_WAKE.

       Le  paramètre  argp  est un pointeur vers une structure uffdio_range (présentée ci-dessus)
       qui indique la plage d'adresse.

       Cette opération ioctl(2) renvoie 0 en cas de succès. En cas d'erreur, -1  est  renvoyé  et
       errno est positionné pour indiquer l'origine de l'erreur. Parmi les erreurs possibles :

       EINVAL Le  champ  start  ou  len de la structure ufdio_range n'était pas un multiple de la
              taille de la page système ; ou len était zéro ; ou la plage  indiquée  n'était  pas
              valable pour une autre raison.

VALEUR RENVOYÉE

       Voir les descriptions des opérations individuelles ci-dessus.

ERREURS

       Voir  les  descriptions  des  opérations  individuelles  ci-dessus.  En outre, les erreurs
       générales suivantes peuvent se produire pour toutes les opérations décrites ci-dessus :

       EFAULT argp pointe vers une adresse illégale.

       EINVAL (Pour toutes les opérations, sauf UFFDIO_API). L'objet userfaultfd n'a  pas  encore
              été activé (avec l'opération UFFDIO_API).

CONFORMITÉ

       Ces opérations ioctl(2) sont spécifiques à Linux.

BOGUES

       Afin  de  détecter les fonctionnalités userfault disponibles et d'activer des sous-parties
       de celles-ci, le descripteur de fichier userfaultfd doit  être  fermé  après  la  première
       opération  UFFDIO_API  qui  recherche  la disponibilité des fonctionnalités, puis réouvert
       avant la deuxième opération UFFDIO_API qui active les fonctionnalités désirées.

EXEMPLES

       Voir userfaultfd(2).

VOIR AUSSI

       ioctl(2), mmap(2), userfaultfd(2)

       Documentation/admin-guide/mm/userfaultfd.rst dans  l'arborescence  des  sources  du  noyau
       Linux

COLOPHON

       Cette  page  fait partie de la publication 5.10 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/.

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  ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩   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 ⟨⟩.