summaryrefslogtreecommitdiffstats
path: root/po/fr/man2/userfaultfd.2.po
diff options
context:
space:
mode:
Diffstat (limited to 'po/fr/man2/userfaultfd.2.po')
-rw-r--r--po/fr/man2/userfaultfd.2.po3509
1 files changed, 3509 insertions, 0 deletions
diff --git a/po/fr/man2/userfaultfd.2.po b/po/fr/man2/userfaultfd.2.po
new file mode 100644
index 00000000..fb13e3bf
--- /dev/null
+++ b/po/fr/man2/userfaultfd.2.po
@@ -0,0 +1,3509 @@
+# French translation of manpages
+# This file is distributed under the same license as the manpages-l10n package.
+# Copyright © of this file:
+# Christophe Blaess <https://www.blaess.fr/christophe/>, 1996-2003.
+# Stéphan Rafin <stephan.rafin@laposte.net>, 2002.
+# Thierry Vignaud <tvignaud@mandriva.com>, 1999, 2002.
+# François Micaux, 2002.
+# Alain Portal <aportal@univ-montp2.fr>, 2003-2008.
+# Jean-Philippe Guérard <fevrier@tigreraye.org>, 2005-2006.
+# Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, 2006-2007.
+# Julien Cristau <jcristau@debian.org>, 2006-2007.
+# Thomas Huriaux <thomas.huriaux@gmail.com>, 2006-2008.
+# Nicolas François <nicolas.francois@centraliens.net>, 2006-2008.
+# Florentin Duneau <fduneau@gmail.com>, 2006-2010.
+# Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, 2006, 2013, 2014.
+# Denis Barbier <barbier@debian.org>, 2006, 2010, 2011.
+# David Prévot <david@tilapin.org>, 2010, 2012-2014.
+# Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>, 2024.
+msgid ""
+msgstr ""
+"Project-Id-Version: manpages-l10n\n"
+"POT-Creation-Date: 2024-03-01 17:12+0100\n"
+"PO-Revision-Date: 2024-01-23 22:37+0100\n"
+"Last-Translator: Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>\n"
+"Language-Team: French <debian-l10n-french@lists.debian.org>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Lokalize 22.12.1\n"
+
+#. type: TH
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "userfaultfd"
+msgstr "userfaultfd"
+
+#. type: TH
+#: archlinux fedora-40 fedora-rawhide mageia-cauldron
+#, no-wrap
+msgid "2024-02-12"
+msgstr "12 février 2024"
+
+#. type: TH
+#: archlinux fedora-40 fedora-rawhide mageia-cauldron
+#, no-wrap
+msgid "Linux man-pages 6.06"
+msgstr "Pages du manuel de Linux 6.06"
+
+#. type: SH
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "NAME"
+msgstr "NOM"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"userfaultfd - create a file descriptor for handling page faults in user space"
+msgstr ""
+"userfaultfd - Créer un descripteur de fichier pour gérer les erreurs de page "
+"en espace utilisateur"
+
+#. type: SH
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "LIBRARY"
+msgstr "BIBLIOTHÈQUE"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "Standard C library (I<libc>, I<-lc>)"
+msgstr "Bibliothèque C standard (I<libc>, I<-lc>)"
+
+#. type: SH
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "SYNOPSIS"
+msgstr "SYNOPSIS"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid ""
+"B<#include E<lt>fcntl.hE<gt>> /* Definition of B<O_*> constants */\n"
+"B<#include E<lt>sys/syscall.hE<gt>> /* Definition of B<SYS_*> constants */\n"
+"B<#include E<lt>linux/userfaultfd.hE<gt>> /* Definition of B<UFFD_*> constants */\n"
+"B<#include E<lt>unistd.hE<gt>>\n"
+msgstr ""
+"B<#include E<lt>fcntl.hE<gt>> /* Définition des constantes B<O_*> */\n"
+"B<#include E<lt>sys/syscall.hE<gt>> /* Définition des constantes B<SYS_*> */\n"
+"B<#include E<lt>linux/userfaultfd.hE<gt>> /* Définition des constantes B<UFFD_*> */\n"
+"B<#include E<lt>unistd.hE<gt>>\n"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<int syscall(SYS_userfaultfd, int >I<flags>B<);>\n"
+msgstr "B<int syscall(SYS_userfaultfd, int >I<flags>B<);>\n"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"I<Note>: glibc provides no wrapper for B<userfaultfd>(), necessitating the "
+"use of B<syscall>(2)."
+msgstr ""
+"I<Note> : la glibc ne fournit pas d'enveloppe pour B<userfaultfd>(), "
+"imposant l'utilisation de B<syscall>(2)."
+
+#. type: SH
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "DESCRIPTION"
+msgstr "DESCRIPTION"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"B<userfaultfd>() creates a new userfaultfd object that can be used for "
+"delegation of page-fault handling to a user-space application, and returns a "
+"file descriptor that refers to the new object. The new userfaultfd object "
+"is configured using B<ioctl>(2)."
+msgstr ""
+"B<userfaultfd>() crée un nouvel objet userfaultfd qui peut être utilisé pour "
+"la délégation de la gestion des erreurs de page à une application de "
+"l'espace utilisateur et renvoie un descripteur de fichier qui fait référence "
+"au nouvel objet. Le nouvel objet userfaultfd est configuré en utilisant "
+"B<ioctl>(2)."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Once the userfaultfd object is configured, the application can use "
+"B<read>(2) to receive userfaultfd notifications. The reads from "
+"userfaultfd may be blocking or non-blocking, depending on the value of "
+"I<flags> used for the creation of the userfaultfd or subsequent calls to "
+"B<fcntl>(2)."
+msgstr ""
+"Une fois l'objet userfaultfd configuré, l'application peut utiliser "
+"B<read>(2) pour recevoir des notification d'userfaultfd. Les lectures à "
+"partir d'userfaultfd peuvent être bloquantes ou non bloquantes en fonction "
+"de la valeur des attributs (I<flags>) utilisés pour la création de "
+"l'userfaultfd ou des appels suivants à B<fcntl>(2)."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The following values may be bitwise ORed in I<flags> to change the behavior "
+"of B<userfaultfd>():"
+msgstr ""
+"Les valeurs suivantes peuvent être combinées dans I<flags> par un OU binaire "
+"pour modifier le comportement d'B<userfaultfd>() :"
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<O_CLOEXEC>"
+msgstr "B<O_CLOEXEC>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Enable the close-on-exec flag for the new userfaultfd file descriptor. See "
+"the description of the B<O_CLOEXEC> flag in B<open>(2)."
+msgstr ""
+"Activer l'attribut close-on-exec pour le nouveau descripteur de fichier "
+"userfaultfd. Consultez la description de l'attribut B<O_CLOEXEC> dans "
+"B<open>(2)."
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<O_NONBLOCK>"
+msgstr "B<O_NONBLOCK>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Enables non-blocking operation for the userfaultfd object. See the "
+"description of the B<O_NONBLOCK> flag in B<open>(2)."
+msgstr ""
+"Permettre une opération non bloquante pour l'objet userfaultfd. Voir la "
+"description de l'attribut B<O_NONBLOCK> dans B<open>(2)."
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<UFFD_USER_MODE_ONLY>"
+msgstr "B<UFFD_USER_MODE_ONLY>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"This is an userfaultfd-specific flag that was introduced in Linux 5.11. "
+"When set, the userfaultfd object will only be able to handle page faults "
+"originated from the user space on the registered regions. When a kernel-"
+"originated fault was triggered on the registered range with this "
+"userfaultfd, a B<SIGBUS> signal will be delivered."
+msgstr ""
+"C'est un attribut spécifique à userfaultfd qui a été introduit dans Linux\\ "
+"5.11. Quand il est défini, l'objet userfaultfd ne pourra gérer que les "
+"erreurs de page provenant de l'espace utilisateur dans les régions "
+"enregistrées. Quand une erreur provenant du noyau est déclenchée dans "
+"l'intervalle enregistré avec cet userfaultfd, un signal B<SIGBUS> sera "
+"envoyé."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"When the last file descriptor referring to a userfaultfd object is closed, "
+"all memory ranges that were registered with the object are unregistered and "
+"unread events are flushed."
+msgstr ""
+"Quand le dernier descripteur de fichier faisant référence à un objet "
+"userfaultfd est fermé, tous les intervalles de mémoire qui ont été "
+"enregistrés avec l'objet sont désenregistrés et les événements non lus sont "
+"vidés."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "Userfaultfd supports three modes of registration:"
+msgstr "Userfaultfd gère trois modes d'enregistrement :"
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<UFFDIO_REGISTER_MODE_MISSING> (since Linux 4.10)"
+msgstr "B<UFFDIO_REGISTER_MODE_MISSING> (depuis Linux 4.10)"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"When registered with B<UFFDIO_REGISTER_MODE_MISSING> mode, user-space will "
+"receive a page-fault notification when a missing page is accessed. The "
+"faulted thread will be stopped from execution until the page fault is "
+"resolved from user-space by either an B<UFFDIO_COPY> or an "
+"B<UFFDIO_ZEROPAGE> ioctl."
+msgstr ""
+"Quand il est enregistré avec le mode B<UFFDIO_REGISTER_MODE_MISSING>, "
+"l'espace utilisateur recevra une notification d'erreur de page lors de "
+"l'accès à une page manquante. L'exécution du thread fautif sera arrêtée "
+"jusqu'à ce que l'erreur de page soit résolue à partir de l'espace "
+"utilisateur par un ioctl B<UFFDIO_COPY> ou B<UFFDIO_ZEROPAGE>."
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<UFFDIO_REGISTER_MODE_MINOR> (since Linux 5.13)"
+msgstr "B<UFFDIO_REGISTER_MODE_MINOR> (depuis Linux 5.13)"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"When registered with B<UFFDIO_REGISTER_MODE_MINOR> mode, user-space will "
+"receive a page-fault notification when a minor page fault occurs. That is, "
+"when a backing page is in the page cache, but page table entries don't yet "
+"exist. The faulted thread will be stopped from execution until the page "
+"fault is resolved from user-space by an B<UFFDIO_CONTINUE> ioctl."
+msgstr ""
+"Quand il est enregistré avec le mode B<UFFDIO_REGISTER_MODE_MINOR>, l'espace "
+"utilisateur recevra une notification d'erreur de page lorsqu'une erreur de "
+"page mineure survient. C'est-à-dire quand une page de sauvegarde est dans le "
+"cache de page, mais les entrées dans la table de pages n'existent pas "
+"encore. L'exécution du thread fautif sera arrêtée jusqu'à ce que l'erreur de "
+"page soit résolue à partir de l'espace utilisateur par un ioctl "
+"B<UFFDIO_CONTINUE>."
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<UFFDIO_REGISTER_MODE_WP> (since Linux 5.7)"
+msgstr "B<UFFDIO_REGISTER_MODE_WP> (depuis Linux 5.7)"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"When registered with B<UFFDIO_REGISTER_MODE_WP> mode, user-space will "
+"receive a page-fault notification when a write-protected page is written. "
+"The faulted thread will be stopped from execution until user-space write-"
+"unprotects the page using an B<UFFDIO_WRITEPROTECT> ioctl."
+msgstr ""
+"Quand il est enregistré avec le mode B<UFFDIO_REGISTER_MODE_WP>, l'espace "
+"utilisateur recevra une notification d'erreur de page lors d'une écriture "
+"sur une page protégée en écriture. L'exécution du thread fautif sera arrêtée "
+"jusqu'à ce que l'espace utilisateur supprime la protection de la page en "
+"utilisant un ioctl B<UFFDIO_WRITEPROTECT>."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Multiple modes can be enabled at the same time for the same memory range."
+msgstr ""
+"Plusieurs modes peuvent être activés en même temps pour le même intervalle "
+"de mémoire."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Since Linux 4.14, a userfaultfd page-fault notification can selectively "
+"embed faulting thread ID information into the notification. One needs to "
+"enable this feature explicitly using the B<UFFD_FEATURE_THREAD_ID> feature "
+"bit when initializing the userfaultfd context. By default, thread ID "
+"reporting is disabled."
+msgstr ""
+"Depuis Linux 4.14, une notification d'erreur de page d'userfaultfd peut "
+"incorporer de façon sélective des informations d'identifiant des threads en "
+"erreur dans une notification. Il est nécessaire d'activer cette "
+"fonctionnalité explicitement en utilisant le bit de fonction "
+"B<UFFD_FEATURE_THREAD_ID> lors de l'initialisation du contexte "
+"d'userfaultfd. Par défaut, la déclaration de l'identifiant du thread est "
+"désactivée."
+
+#. type: SS
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "Usage"
+msgstr "Utilisation"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The userfaultfd mechanism is designed to allow a thread in a multithreaded "
+"program to perform user-space paging for the other threads in the process. "
+"When a page fault occurs for one of the regions registered to the "
+"userfaultfd object, the faulting thread is put to sleep and an event is "
+"generated that can be read via the userfaultfd file descriptor. The fault-"
+"handling thread reads events from this file descriptor and services them "
+"using the operations described in B<ioctl_userfaultfd>(2). When servicing "
+"the page fault events, the fault-handling thread can trigger a wake-up for "
+"the sleeping thread."
+msgstr ""
+"Le mécanisme d'userfaultfd est conçu pour permettre à un thread dans un "
+"programme multi-thread de réaliser la pagination en espace utilisateur pour "
+"d'autres threads dans le processus. Lorsqu'un erreur de page survient pour "
+"une des régions enregistrées dans l'objet userfaultfd, le thread en erreur "
+"est mis en sommeil et un événement est généré qui peut être lu au moyen du "
+"descripteur de fichier userfaultfd. Le thread de gestion d'erreur lit les "
+"événements à partir de ce descripteur de fichier et les corrige en utilisant "
+"les opérations décrites dans B<ioctl_userfaultfd>(2). Lors de l'intervention "
+"sur les événements d'erreur de page, le thread de gestion d'erreur peut "
+"déclencher le réveil d'un thread endormi."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"It is possible for the faulting threads and the fault-handling threads to "
+"run in the context of different processes. In this case, these threads may "
+"belong to different programs, and the program that executes the faulting "
+"threads will not necessarily cooperate with the program that handles the "
+"page faults. In such non-cooperative mode, the process that monitors "
+"userfaultfd and handles page faults needs to be aware of the changes in the "
+"virtual memory layout of the faulting process to avoid memory corruption."
+msgstr ""
+"Il est possible que les threads en erreur et les threads traitant les "
+"erreurs soient exécutés dans le contexte de processus différents. Dans ce "
+"cas, ces threads peuvent appartenir à différents programmes, et le programme "
+"qui exécute les threads en erreur ne collaborera pas nécessairement avec le "
+"programme qui gère les erreurs de page. Dans ce mode non coopératif, le "
+"processus qui contrôle userfaultfd et gère les erreurs de page a besoin "
+"d'avoir connaissance des modifications dans la disposition de la mémoire "
+"virtuelle du processus en erreur pour éviter une corruption de mémoire.'"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Since Linux 4.11, userfaultfd can also notify the fault-handling threads "
+"about changes in the virtual memory layout of the faulting process. In "
+"addition, if the faulting process invokes B<fork>(2), the userfaultfd "
+"objects associated with the parent may be duplicated into the child process "
+"and the userfaultfd monitor will be notified (via the B<UFFD_EVENT_FORK> "
+"described below) about the file descriptor associated with the userfault "
+"objects created for the child process, which allows the userfaultfd monitor "
+"to perform user-space paging for the child process. Unlike page faults "
+"which have to be synchronous and require an explicit or implicit wakeup, all "
+"other events are delivered asynchronously and the non-cooperative process "
+"resumes execution as soon as the userfaultfd manager executes B<read>(2). "
+"The userfaultfd manager should carefully synchronize calls to B<UFFDIO_COPY> "
+"with the processing of events."
+msgstr ""
+"Depuis Linux 4.11, userfaultfd peut aussi informer les threads gérant les "
+"erreurs des modifications dans la disposition de la mémoire virtuelle du "
+"processus en erreur. De plus, si le processus en erreur invoque B<fork>(2), "
+"les objets userfaultfd associés au parent peuvent être dupliqués dans le "
+"processus enfant et le contrôleur d'userfaultfd sera informé (au moyen de "
+"B<UFFD_EVENT_FORK> décrit plus bas) sur le descripteur de fichier associé "
+"aux objets userfault créés pour le processus enfant, ce qui permet au "
+"contrôleur d'userfaultfd de réaliser la pagination de l'espace utilisateur "
+"pour le processus enfant. À la différence des erreurs de page qui doivent "
+"être synchrones et réclament un réveil explicite ou explicite, tous les "
+"autres événements sont envoyés de façon asynchrone et le processus non "
+"coopératif reprend son exécution dès que le gestionnaire d'userfaultfd "
+"exécute B<read>(2). Le gestionnaire d'userfaultfd doit soigneusement "
+"synchroniser les appels à B<UFFDIO_COPY> avec le traitement des événements."
+
+#. #-#-#-#-# archlinux: userfaultfd.2.pot (PACKAGE VERSION) #-#-#-#-#
+#. Regarding the preceding sentence, Mike Rapoport says:
+#. The major point here is that current events delivery model could be
+#. problematic for multi-threaded monitor. I even suspect that it would be
+#. impossible to ensure synchronization between page faults and non-page
+#. fault events in multi-threaded monitor.
+#. .P
+#. FIXME elaborate about non-cooperating mode, describe its limitations
+#. for kernels before Linux 4.11, features added in Linux 4.11
+#. and limitations remaining in Linux 4.11
+#. Maybe it's worth adding a dedicated sub-section...
+#. type: Plain text
+#. #-#-#-#-# debian-bookworm: userfaultfd.2.pot (PACKAGE VERSION) #-#-#-#-#
+#. Regarding the preceding sentence, Mike Rapoport says:
+#. The major point here is that current events delivery model could be
+#. problematic for multi-threaded monitor. I even suspect that it would be
+#. impossible to ensure synchronization between page faults and non-page
+#. fault events in multi-threaded monitor.
+#. .PP
+#. FIXME elaborate about non-cooperating mode, describe its limitations
+#. for kernels before Linux 4.11, features added in Linux 4.11
+#. and limitations remaining in Linux 4.11
+#. Maybe it's worth adding a dedicated sub-section...
+#. type: Plain text
+#. #-#-#-#-# debian-unstable: userfaultfd.2.pot (PACKAGE VERSION) #-#-#-#-#
+#. Regarding the preceding sentence, Mike Rapoport says:
+#. The major point here is that current events delivery model could be
+#. problematic for multi-threaded monitor. I even suspect that it would be
+#. impossible to ensure synchronization between page faults and non-page
+#. fault events in multi-threaded monitor.
+#. .PP
+#. FIXME elaborate about non-cooperating mode, describe its limitations
+#. for kernels before Linux 4.11, features added in Linux 4.11
+#. and limitations remaining in Linux 4.11
+#. Maybe it's worth adding a dedicated sub-section...
+#. type: Plain text
+#. #-#-#-#-# fedora-40: userfaultfd.2.pot (PACKAGE VERSION) #-#-#-#-#
+#. Regarding the preceding sentence, Mike Rapoport says:
+#. The major point here is that current events delivery model could be
+#. problematic for multi-threaded monitor. I even suspect that it would be
+#. impossible to ensure synchronization between page faults and non-page
+#. fault events in multi-threaded monitor.
+#. .P
+#. FIXME elaborate about non-cooperating mode, describe its limitations
+#. for kernels before Linux 4.11, features added in Linux 4.11
+#. and limitations remaining in Linux 4.11
+#. Maybe it's worth adding a dedicated sub-section...
+#. type: Plain text
+#. #-#-#-#-# fedora-rawhide: userfaultfd.2.pot (PACKAGE VERSION) #-#-#-#-#
+#. Regarding the preceding sentence, Mike Rapoport says:
+#. The major point here is that current events delivery model could be
+#. problematic for multi-threaded monitor. I even suspect that it would be
+#. impossible to ensure synchronization between page faults and non-page
+#. fault events in multi-threaded monitor.
+#. .P
+#. FIXME elaborate about non-cooperating mode, describe its limitations
+#. for kernels before Linux 4.11, features added in Linux 4.11
+#. and limitations remaining in Linux 4.11
+#. Maybe it's worth adding a dedicated sub-section...
+#. type: Plain text
+#. #-#-#-#-# mageia-cauldron: userfaultfd.2.pot (PACKAGE VERSION) #-#-#-#-#
+#. Regarding the preceding sentence, Mike Rapoport says:
+#. The major point here is that current events delivery model could be
+#. problematic for multi-threaded monitor. I even suspect that it would be
+#. impossible to ensure synchronization between page faults and non-page
+#. fault events in multi-threaded monitor.
+#. .P
+#. FIXME elaborate about non-cooperating mode, describe its limitations
+#. for kernels before Linux 4.11, features added in Linux 4.11
+#. and limitations remaining in Linux 4.11
+#. Maybe it's worth adding a dedicated sub-section...
+#. type: Plain text
+#. #-#-#-#-# opensuse-leap-15-6: userfaultfd.2.pot (PACKAGE VERSION) #-#-#-#-#
+#. Regarding the preceding sentence, Mike Rapoport says:
+#. The major point here is that current events delivery model could be
+#. problematic for multi-threaded monitor. I even suspect that it would be
+#. impossible to ensure synchronization between page faults and non-page
+#. fault events in multi-threaded monitor.
+#. .PP
+#. FIXME elaborate about non-cooperating mode, describe its limitations
+#. for kernels before Linux 4.11, features added in Linux 4.11
+#. and limitations remaining in Linux 4.11
+#. Maybe it's worth adding a dedicated sub-section...
+#. type: Plain text
+#. #-#-#-#-# opensuse-tumbleweed: userfaultfd.2.pot (PACKAGE VERSION) #-#-#-#-#
+#. Regarding the preceding sentence, Mike Rapoport says:
+#. The major point here is that current events delivery model could be
+#. problematic for multi-threaded monitor. I even suspect that it would be
+#. impossible to ensure synchronization between page faults and non-page
+#. fault events in multi-threaded monitor.
+#. .PP
+#. FIXME elaborate about non-cooperating mode, describe its limitations
+#. for kernels before Linux 4.11, features added in Linux 4.11
+#. and limitations remaining in Linux 4.11
+#. Maybe it's worth adding a dedicated sub-section...
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The current asynchronous model of the event delivery is optimal for single "
+"threaded non-cooperative userfaultfd manager implementations."
+msgstr ""
+"Le modèle asynchrone actuel d'envoi d'événement est optimal pour des "
+"implémentations de gestionnaire userfaultfd non coopératif à thread unique."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Since Linux 5.7, userfaultfd is able to do synchronous page dirty tracking "
+"using the new write-protect register mode. One should check against the "
+"feature bit B<UFFD_FEATURE_PAGEFAULT_FLAG_WP> before using this feature. "
+"Similar to the original userfaultfd missing mode, the write-protect mode "
+"will generate a userfaultfd notification when the protected page is "
+"written. The user needs to resolve the page fault by unprotecting the "
+"faulted page and kicking the faulted thread to continue. For more "
+"information, please refer to the \"Userfaultfd write-protect mode\" section."
+msgstr ""
+"Depuis Linux 5.7, userfaultfd peut effectuer le suivi synchrone de page sale "
+"en utilisant le nouveau mode d'enregistrement de page protégée en écriture. "
+"Il faut vérifier le bit de fonction B<UFFD_FEATURE_PAGEFAULT_FLAG_WP> avant "
+"d'utiliser cette fonctionnalité. Le mode protection en écriture, similaire "
+"au mode d'origine page manquante d'userfaultfd, génère une notification "
+"d'userfaultfd quand la page protégée en écriture est écrite. L'utilisateur "
+"doit résoudre l'erreur de page en déprotégeant la page fautive et en forçant "
+"le thread fautif à continuer. Pour plus d'informations, consultez la section "
+"«\\ Mode protection d'écriture d'userfaultfd\\ »"
+
+#. type: SS
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "Userfaultfd operation"
+msgstr "Fonctionnement d'userfaultfd"
+
+#. type: Plain text
+#: archlinux fedora-40 fedora-rawhide mageia-cauldron
+#, fuzzy
+#| msgid ""
+#| "After the userfaultfd object is created with B<userfaultfd>(), the "
+#| "application must enable it using the B<UFFDIO_API> B<ioctl>(2) "
+#| "operation. This operation allows a handshake between the kernel and user "
+#| "space to determine the API version and supported features. This "
+#| "operation must be performed before any of the other B<ioctl>(2) "
+#| "operations described below (or those operations fail with the B<EINVAL> "
+#| "error)."
+msgid ""
+"After the userfaultfd object is created with B<userfaultfd>(), the "
+"application must enable it using the B<UFFDIO_API> B<ioctl>(2) operation. "
+"This operation allows a two-step handshake between the kernel and user space "
+"to determine what API version and features the kernel supports, and then to "
+"enable those features user space wants. This operation must be performed "
+"before any of the other B<ioctl>(2) operations described below (or those "
+"operations fail with the B<EINVAL> error)."
+msgstr ""
+"Après la création de l'objet userfaultfd avec B<userfaultfd>(), "
+"l'application doit l'activer en utilisant l'opération B<UFFDIO_API> de "
+"B<ioctl>(2). Cette opération permet une connexion entre le noyau et l'espace "
+"utilisateur pour déterminer la version de l'API et les fonctions prises en "
+"charge. Cette opération doit être réalisée avant toutes les autres "
+"opérations B<ioctl>(2) décrites plus bas (ou ces opérations échouent avec "
+"l'erreur B<EINVAL>.)"
+
+#. type: Plain text
+#: archlinux fedora-40 fedora-rawhide mageia-cauldron
+#, fuzzy
+#| msgid ""
+#| "After a successful B<UFFDIO_API> operation, the application then "
+#| "registers memory address ranges using the B<UFFDIO_REGISTER> B<ioctl>(2) "
+#| "operation. After successful completion of a B<UFFDIO_REGISTER> "
+#| "operation, a page fault occurring in the requested memory range, and "
+#| "satisfying the mode defined at the registration time, will be forwarded "
+#| "by the kernel to the user-space application. The application can then "
+#| "use the B<UFFDIO_COPY ,> B<UFFDIO_ZEROPAGE ,> or B<UFFDIO_CONTINUE> "
+#| "B<ioctl>(2) operations to resolve the page fault."
+msgid ""
+"After a successful B<UFFDIO_API> operation, the application then registers "
+"memory address ranges using the B<UFFDIO_REGISTER> B<ioctl>(2) operation. "
+"After successful completion of a B<UFFDIO_REGISTER> operation, a page fault "
+"occurring in the requested memory range, and satisfying the mode defined at "
+"the registration time, will be forwarded by the kernel to the user-space "
+"application. The application can then use various (e.g., B<UFFDIO_COPY>, "
+"B<UFFDIO_ZEROPAGE>, or B<UFFDIO_CONTINUE>) B<ioctl>(2) operations to "
+"resolve the page fault."
+msgstr ""
+"Après le succès d'une opération B<UFFDIO_API>, l'application enregistre "
+"alors les intervalles d'adresses mémoire en utilisant l'opération "
+"d'B<ioctl>(2) B<UFFDIO_REGISTER>. Quand l'opération B<UFFDIO_REGISTER> s'est "
+"achevée avec succès, une erreur de page, se produisant dans l'intervalle de "
+"mémoire requis et satisfaisant au mode défini au moment de l'enregistrement, "
+"sera transmis par le noyau à l'application de l'espace utilisateur. "
+"L'application peut alors utiliser les opérations d'B<ioctl>(2) "
+"B<UFFDIO_COPY>, B<UFFDIO_ZEROPAGE> ou B<UFFDIO_CONTINUE> pour résoudre "
+"l'erreur de page."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Since Linux 4.14, if the application sets the B<UFFD_FEATURE_SIGBUS> feature "
+"bit using the B<UFFDIO_API> B<ioctl>(2), no page-fault notification will be "
+"forwarded to user space. Instead a B<SIGBUS> signal is delivered to the "
+"faulting process. With this feature, userfaultfd can be used for robustness "
+"purposes to simply catch any access to areas within the registered address "
+"range that do not have pages allocated, without having to listen to "
+"userfaultfd events. No userfaultfd monitor will be required for dealing "
+"with such memory accesses. For example, this feature can be useful for "
+"applications that want to prevent the kernel from automatically allocating "
+"pages and filling holes in sparse files when the hole is accessed through a "
+"memory mapping."
+msgstr ""
+"Depuis Linux 4.4, si l'application définit le bit de la fonction "
+"B<UFFD_FEATURE_SIGBUS> en utilisant l'B<ioctl>(2) B<UFFDIO_API>, aucune "
+"notification d'erreur d page ne sera transmise à l'espace utilisateur. Un "
+"signal est envoyé à la place au processus en erreur. Avec cette fonction, "
+"userfaultfd peut être utilisé à des fins de robustesse pour capturer "
+"simplement tout accès aux zones dans l'intervalle d'adresses enregistré qui "
+"n'ont pas de pages allouées sans avoir à écouter les événements "
+"d'userfaultfd. Aucun contrôleur d'userfaultfd ne sera requis pour traiter ce "
+"type d'accès mémoire. Par exemple, cette fonction peut être utile à des "
+"applications qui désirent empêcher le noyau d'allouer des pages "
+"automatiquement et de remplir des trous dans des fichiers creux quand c'est "
+"un mappage mémoire qui permet l'accès aux trous."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The B<UFFD_FEATURE_SIGBUS> feature is implicitly inherited through "
+"B<fork>(2) if used in combination with B<UFFD_FEATURE_FORK>."
+msgstr ""
+"La fonction B<UFFD_FEATURE_SIGBUS> est héritée de façon implicite avec "
+"B<fork>(2) si elle est utilisée en combinaison avec B<UFFD_FEATURE_FORK>."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Details of the various B<ioctl>(2) operations can be found in "
+"B<ioctl_userfaultfd>(2)."
+msgstr ""
+"Des détails sur les différentes opérations d'B<ioctl>(2) sont disponibles "
+"dans B<ioctl_userfaultfd>(2)."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Since Linux 4.11, events other than page-fault may enabled during "
+"B<UFFDIO_API> operation."
+msgstr ""
+"Depuis Linux 4.11, les événements autres que les erreurs de page peuvent "
+"être activés pendant l'opération B<UFFDIO_API>."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Up to Linux 4.11, userfaultfd can be used only with anonymous private memory "
+"mappings. Since Linux 4.11, userfaultfd can be also used with hugetlbfs and "
+"shared memory mappings."
+msgstr ""
+"Jusqu'à Linux 4.11, userfaultfd ne peut être utilisé qu'avec des mappages de "
+"mémoire privée anonyme. Depuis Linux 4.11, userfaultfd peut aussi être "
+"utilisé avec des mappages de mémoire hugelbfs et partagée."
+
+#. type: SS
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "Userfaultfd write-protect mode (since Linux 5.7)"
+msgstr "Mode protection d'écriture d'userfaultfd (depuis Linux 5.7)"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Since Linux 5.7, userfaultfd supports write-protect mode for anonymous "
+"memory. The user needs to first check availability of this feature using "
+"B<UFFDIO_API> ioctl against the feature bit "
+"B<UFFD_FEATURE_PAGEFAULT_FLAG_WP> before using this feature."
+msgstr ""
+"Depuis Linux 5.7, userfaultfd prend en charge le mode protection d'écriture "
+"pour la mémoire anonyme. L'utilisateur doit d'abord vérifier la "
+"disponibilité de cette fonctionnalité en utilisant l'ioctl B<UFFDIO_API> sur "
+"le bit de fonction B<UFFD_FEATURE_PAGEFAULT_FLAG_WP> avant d'utiliser cette "
+"fonctionnalité."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Since Linux 5.19, the write-protection mode was also supported on shmem and "
+"hugetlbfs memory types. It can be detected with the feature bit "
+"B<UFFD_FEATURE_WP_HUGETLBFS_SHMEM>."
+msgstr ""
+"Depuis Linux 5.19, le mode protection d'écriture est aussi pris en charge "
+"sur la mémoire de type shmem ou hugetlbfs. Il peut être détecté avec le bit "
+"de fonction B<UFFD_FEATURE_WP_HUGETLBFS_SHMEM>."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"To register with userfaultfd write-protect mode, the user needs to initiate "
+"the B<UFFDIO_REGISTER> ioctl with mode B<UFFDIO_REGISTER_MODE_WP> set. Note "
+"that it is legal to monitor the same memory range with multiple modes. For "
+"example, the user can do B<UFFDIO_REGISTER> with the mode set to "
+"B<UFFDIO_REGISTER_MODE_MISSING | UFFDIO_REGISTER_MODE_WP>. When there is "
+"only B<UFFDIO_REGISTER_MODE_WP> registered, user-space will I<not> receive "
+"any notification when a missing page is written. Instead, user-space will "
+"receive a write-protect page-fault notification only when an existing but "
+"write-protected page got written."
+msgstr ""
+"Pour enregistrer avec le mode page protégée en écriture de userfaultfd, "
+"l'utilisateur doit initier l'ioctl B<UFFDIO_REGISTER> avec le mode "
+"B<UFFDIO_REGISTER_MODE_WP> défini. Notez qu'il est permis de surveiller le "
+"même intervalle de mémoire avec plusieurs modes. Par exemple, un utilisateur "
+"peut effectuer B<UFFDIO_REGISTER> avec le mode défini à "
+"B<UFFDIO_REGISTER_MODE_MISSING | UFFDIO_REGISTER_MODE_WP>. Quand seul le "
+"mode B<UFFDIO_REGISTER_MODE_WP> est enregistré, l'espace utilisateur ne "
+"recevra I<aucune> notification quand une page manquante est écrite. À la "
+"place, l'espace utilisateur ne recevra une notification d'erreur de page "
+"protégée en écriture que quand une page existante et protégée en écriture "
+"est écrite."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"After the B<UFFDIO_REGISTER> ioctl completed with B<UFFDIO_REGISTER_MODE_WP> "
+"mode set, the user can write-protect any existing memory within the range "
+"using the ioctl B<UFFDIO_WRITEPROTECT> where I<uffdio_writeprotect.mode> "
+"should be set to B<UFFDIO_WRITEPROTECT_MODE_WP>."
+msgstr ""
+"Après que l'ioctl B<UFFDIO_REGISTER> s'est terminé avec le mode "
+"B<UFFDIO_REGISTER_MODE_WP> défini, l'utilisateur peut protéger en écriture "
+"toute mémoire dans l'intervalle en utilisant l'ioctl B<UFFDIO_WRITEPROTECT> "
+"où I<uffdio_writeprotect.mode> devrait être défini à "
+"B<UFFDIO_WRITEPROTECT_MODE_WP>."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"When a write-protect event happens, user-space will receive a page-fault "
+"notification whose I<uffd_msg.pagefault.flags> will be with "
+"B<UFFD_PAGEFAULT_FLAG_WP> flag set. Note: since only writes can trigger "
+"this kind of fault, write-protect notifications will always have the "
+"B<UFFD_PAGEFAULT_FLAG_WRITE> bit set along with the "
+"B<UFFD_PAGEFAULT_FLAG_WP> bit."
+msgstr ""
+"Quand un événement de protection en écriture survient, l'espace utilisateur "
+"recevra une notification d'erreur de page dont l'I<uffd_msg.pagefault.flags> "
+"aura l'attribut B<UFFD_PAGEFAULT_FLAG_WP> défini. Notez : dans la mesure où "
+"seulement les écritures peuvent déclencher ce genre d'erreur, les "
+"notifications de protection en écriture auront toujours le bit "
+"B<UFFD_PAGEFAULT_FLAG_WRITE> défini en même temps que le bit "
+"B<UFFD_PAGEFAULT_FLAG_WP>."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"To resolve a write-protection page fault, the user should initiate another "
+"B<UFFDIO_WRITEPROTECT> ioctl, whose I<uffd_msg.pagefault.flags> should have "
+"the flag B<UFFDIO_WRITEPROTECT_MODE_WP> cleared upon the faulted page or "
+"range."
+msgstr ""
+"Pour résoudre une erreur de page de protection d'écriture, l'utilisateur "
+"doit initier un autre ioctl B<UFFDIO_WRITEPROTECT> dont l'I<uffd_msg."
+"pagefault.flags> doit avoir l'attribut B<UFFDIO_WRITEPROTECT_MODE_WP> effacé "
+"après la page ou l'intervalle fautif."
+
+#. type: SS
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "Userfaultfd minor fault mode (since Linux 5.13)"
+msgstr "Mode erreur mineure d'userfaultfd (depuis Linux 5.13)"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Since Linux 5.13, userfaultfd supports minor fault mode. In this mode, "
+"fault messages are produced not for major faults (where the page was "
+"missing), but rather for minor faults, where a page exists in the page "
+"cache, but the page table entries are not yet present. The user needs to "
+"first check availability of this feature using the B<UFFDIO_API> ioctl with "
+"the appropriate feature bits set before using this feature: "
+"B<UFFD_FEATURE_MINOR_HUGETLBFS> since Linux 5.13, or "
+"B<UFFD_FEATURE_MINOR_SHMEM> since Linux 5.14."
+msgstr ""
+"Depuis Linux 5.13, userfaultfd prend en charge le mode erreur mineure. Dans "
+"ce mode, les messages d’erreur ne sont pas produits pour des erreurs "
+"majeures (où les pages étaient absentes), mais plutôt pour des erreurs "
+"mineures où une page existe dans le cache de page, mais où les entrées de la "
+"table de pages ne sont pas encore présentes. L'utilisateur doit d'abord "
+"vérifier la disponibilité de cette fonctionnalité en utilisant l'ioctl "
+"B<UFFDIO_API> avec les bits de fonction appropriés avant d'utiliser cette "
+"fonctionnalité : B<UFFD_FEATURE_MINOR_HUGETLBFS> depuis Linux 5.13 ou "
+"B<UFFD_FEATURE_MINOR_SHMEM> depuis Linux 5.14."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"To register with userfaultfd minor fault mode, the user needs to initiate "
+"the B<UFFDIO_REGISTER> ioctl with mode B<UFFD_REGISTER_MODE_MINOR> set."
+msgstr ""
+"Pour enregistrer avec le mode erreur mineure d'userfaultfd, l'utilisateur "
+"doit initier l'ioctl B<UFFDIO_REGISTER> avec le mode "
+"B<UFFD_REGISTER_MODE_MINOR> défini."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"When a minor fault occurs, user-space will receive a page-fault notification "
+"whose I<uffd_msg.pagefault.flags> will have the B<UFFD_PAGEFAULT_FLAG_MINOR> "
+"flag set."
+msgstr ""
+"Quand une erreur mineure survient, l'espace utilisateur recevra une "
+"notification d'erreur de page dont l'I<uffd_msg.pagefault.flags> aura "
+"l'attribut B<UFFD_PAGEFAULT_FLAG_MINOR> défini."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"To resolve a minor page fault, the handler should decide whether or not the "
+"existing page contents need to be modified first. If so, this should be "
+"done in-place via a second, non-userfaultfd-registered mapping to the same "
+"backing page (e.g., by mapping the shmem or hugetlbfs file twice). Once the "
+"page is considered \"up to date\", the fault can be resolved by initiating "
+"an B<UFFDIO_CONTINUE> ioctl, which installs the page table entries and (by "
+"default) wakes up the faulting thread(s)."
+msgstr ""
+"Pour résoudre une erreur de page mineure, le gestionnaire doit décider si le "
+"contenu de la page existante doit être modifiée d'abord, ou non. Si c'est le "
+"cas, cela doit être fait à son emplacement au moyen d'un second mappage non "
+"enregistré par userfaultfd vers la même page de sauvegarde (par exemple en "
+"mappant deux fois le fichier shmem ou hugetlbfs). Une fois que la page est "
+"considérée « à jour », l'erreur peut être résolue en initiant un ioctl "
+"B<UFFDIO_CONTINUE> qui installe les entrées de la table de pages et (par "
+"défaut) réveille le ou les threads en erreur."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Minor fault mode supports only hugetlbfs-backed (since Linux 5.13) and "
+"shmem-backed (since Linux 5.14) memory."
+msgstr ""
+"Le mode erreur mineure ne prend en charge que la mémoire s'appuyant sur "
+"hugetlbfs (depuis Linux 5.13) et sur shmem (depuis Linux 5.14)."
+
+#. type: SS
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "Reading from the userfaultfd structure"
+msgstr "Lire à partir de la structure userfaultfd"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Each B<read>(2) from the userfaultfd file descriptor returns one or more "
+"I<uffd_msg> structures, each of which describes a page-fault event or an "
+"event required for the non-cooperative userfaultfd usage:"
+msgstr ""
+"Chaque B<read>(2) à partir du descripteur de fichier userfaultfd renvoie une "
+"ou plusieurs structures I<uffd_msg>, chacune d'elles décrit un événement "
+"d'erreur de page ou un événement requis pour l'utilisation non coopérative "
+"d'userfaultfd :"
+
+#. type: Plain text
+#: archlinux debian-unstable fedora-40 fedora-rawhide mageia-cauldron
+#: opensuse-tumbleweed
+#, no-wrap
+msgid ""
+"struct uffd_msg {\n"
+" __u8 event; /* Type of event */\n"
+" ...\n"
+" union {\n"
+" struct {\n"
+" __u64 flags; /* Flags describing fault */\n"
+" __u64 address; /* Faulting address */\n"
+" union {\n"
+" __u32 ptid; /* Thread ID of the fault */\n"
+" } feat;\n"
+" } pagefault;\n"
+"\\&\n"
+" struct { /* Since Linux 4.11 */\n"
+" __u32 ufd; /* Userfault file descriptor\n"
+" of the child process */\n"
+" } fork;\n"
+"\\&\n"
+" struct { /* Since Linux 4.11 */\n"
+" __u64 from; /* Old address of remapped area */\n"
+" __u64 to; /* New address of remapped area */\n"
+" __u64 len; /* Original mapping length */\n"
+" } remap;\n"
+"\\&\n"
+" struct { /* Since Linux 4.11 */\n"
+" __u64 start; /* Start address of removed area */\n"
+" __u64 end; /* End address of removed area */\n"
+" } remove;\n"
+" ...\n"
+" } arg;\n"
+"\\&\n"
+" /* Padding fields omitted */\n"
+"} __packed;\n"
+msgstr ""
+"struct uffd_msg {\n"
+" __u8 event; /* Type d'événement */\n"
+" ...\n"
+" union {\n"
+" struct {\n"
+" __u64 flags; /* Attributs décrivant l'erreur */\n"
+" __u64 address; /* Adresse fautive */\n"
+" union {\n"
+" __u32 ptid; /* ID du thread de l'erreur */\n"
+" } feat;\n"
+" } pagefault;\n"
+"\\&\n"
+" struct { /* Depuis Linux 4.11 */\n"
+" __u32 ufd; /* Descripteur de ficher d'userfault\n"
+" du processus enfant */\n"
+" } fork;\n"
+"\\&\n"
+" struct { /* Depuis Linux 4.11 */\n"
+" __u64 from; /* Ancienne adresse de la zone remappée */\n"
+" __u64 to; /* Nouvelle adresse de la zone remappée */\n"
+" __u64 len; /* Taille originale du mappage */\n"
+" } remap;\n"
+"\\&\n"
+" struct { /* Depuis Linux 4.11 */\n"
+" __u64 start; /* Adresse de début de la zone supprimée */\n"
+" __u64 end; /* Adresse de fin de la zone supprimée */\n"
+" } remove;\n"
+" ...\n"
+" } arg;\n"
+"\\&\n"
+" /* Remplissage des champs omis */\n"
+"} __packed;\n"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"If multiple events are available and the supplied buffer is large enough, "
+"B<read>(2) returns as many events as will fit in the supplied buffer. If "
+"the buffer supplied to B<read>(2) is smaller than the size of the "
+"I<uffd_msg> structure, the B<read>(2) fails with the error B<EINVAL>."
+msgstr ""
+"Si plusieurs événements sont disponibles et si le tampon fourni est "
+"suffisamment grand, B<read>(2) renvoie autant d'événements qu'il en tient "
+"dans le tampon fourni. Si le tampon fourni à B<read>(2) est plus petit que "
+"la taille de la structure I<uffd_msg>, B<read>(2) échoue avec l'erreur "
+"B<EINVAL>."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "The fields set in the I<uffd_msg> structure are as follows:"
+msgstr "Les champs définis dans la structure I<uffd_msg> sont les suivants :"
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "I<event>"
+msgstr "I<event>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The type of event. Depending of the event type, different fields of the "
+"I<arg> union represent details required for the event processing. The non-"
+"page-fault events are generated only when appropriate feature is enabled "
+"during API handshake with B<UFFDIO_API> B<ioctl>(2)."
+msgstr ""
+"Le type d'événement. Selon le type d'événement, différents champs de l'union "
+"I<arg> représentent les détails nécessaires au traitement de l'événement. "
+"Les événements qui ne sont pas des erreurs de page ne sont générés que quand "
+"la fonctionnalité appropriée est activée durant la connexion de l'API à "
+"l'B<ioctl>(2) B<UFFDIO_API>."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "The following values can appear in the I<event> field:"
+msgstr "Les valeurs suivantes peuvent apparaître dans le champ I<event> :"
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<UFFD_EVENT_PAGEFAULT> (since Linux 4.3)"
+msgstr "B<UFFD_EVENT_PAGEFAULT> (depuis Linux 4.3)"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"A page-fault event. The page-fault details are available in the "
+"I<pagefault> field."
+msgstr ""
+"Un événement d'erreur de page. Les détails de l'erreur de page sont "
+"disponibles dans le champ I<pagefault>."
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<UFFD_EVENT_FORK> (since Linux 4.11)"
+msgstr "B<UFFD_EVENT_FORK> (depuis Linux 4.11)"
+
+#. FIXME describe duplication of userfault file descriptor during fork
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Generated when the faulting process invokes B<fork>(2) (or B<clone>(2) "
+"without the B<CLONE_VM> flag). The event details are available in the "
+"I<fork> field."
+msgstr ""
+"Généré lorsque le processus en erreur invoque B<fork>(2) (ou B<clone>(2) "
+"sans l'attribut B<CLONE_VM>). Les détails de l'événement sont disponibles "
+"dans le champ I<fork>."
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<UFFD_EVENT_REMAP> (since Linux 4.11)"
+msgstr "B<UFFD_EVENT_REMAP> (depuis Linux 4.11)"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Generated when the faulting process invokes B<mremap>(2). The event details "
+"are available in the I<remap> field."
+msgstr ""
+"Généré lorsque le processus en erreur invoque B<mremap>(2). Les détails de "
+"l'événement sont disponibles dans le champ I<remap>."
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<UFFD_EVENT_REMOVE> (since Linux 4.11)"
+msgstr "B<UFFD_EVENT_REMOVE> (depuis Linux 4.11)"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Generated when the faulting process invokes B<madvise>(2) with "
+"B<MADV_DONTNEED> or B<MADV_REMOVE> advice. The event details are available "
+"in the I<remove> field."
+msgstr ""
+"Généré lorsque le processus en erreur invoque B<madvise>(2) avec les "
+"conseils B<MADV_DONTNEED> ou B<MADV_REMOVE>. Les détails de l'événement sont "
+"disponibles dans le champ I<remove>."
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<UFFD_EVENT_UNMAP> (since Linux 4.11)"
+msgstr "B<UFFD_EVENT_UNMAP> (depuis Linux 4.11)"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Generated when the faulting process unmaps a memory range, either explicitly "
+"using B<munmap>(2) or implicitly during B<mmap>(2) or B<mremap>(2). The "
+"event details are available in the I<remove> field."
+msgstr ""
+"Généré lorsque le processus en erreur supprime le mappage d'un intervalle de "
+"mémoire soit explicitement avec B<munmap>(2), soit implicitement durant "
+"l'exécution de B<mmap>(2) ou B<mremap>(2). Les détails de l'événement sont "
+"disponibles dans le champ I<remove>."
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "I<pagefault.address>"
+msgstr "I<pagefault.address>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "The address that triggered the page fault."
+msgstr "L'adresse qui a déclenché l'erreur de page."
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "I<pagefault.flags>"
+msgstr "I<pagefault.flags>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"A bit mask of flags that describe the event. For B<UFFD_EVENT_PAGEFAULT>, "
+"the following flag may appear:"
+msgstr ""
+"Un masque de bits qui décrit l'événement. Pour B<UFFD_EVENT_PAGEFAULT>, les "
+"attributs suivants peuvent apparaître :"
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<UFFD_PAGEFAULT_FLAG_WP>"
+msgstr "B<UFFD_PAGEFAULT_FLAG_WP>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "If this flag is set, then the fault was a write-protect fault."
+msgstr ""
+"Si cet attribut est défini, alors l'erreur était une erreur de protection en "
+"écriture."
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<UFFD_PAGEFAULT_FLAG_MINOR>"
+msgstr "B<UFFD_PAGEFAULT_FLAG_MINOR>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "If this flag is set, then the fault was a minor fault."
+msgstr "Si cet attribut est défini, alors l'erreur était une erreur mineure."
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<UFFD_PAGEFAULT_FLAG_WRITE>"
+msgstr "B<UFFD_PAGEFAULT_FLAG_WRITE>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "If this flag is set, then the fault was a write fault."
+msgstr ""
+"Si cet attribut est défini, alors l'erreur était une erreur d'écriture."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"If neither B<UFFD_PAGEFAULT_FLAG_WP> nor B<UFFD_PAGEFAULT_FLAG_MINOR> are "
+"set, then the fault was a missing fault."
+msgstr ""
+"Si ni B<UFFD_PAGEFAULT_FLAG_WP> ni B<UFFD_PAGEFAULT_FLAG_MINOR> ne sont "
+"définis, l'erreur était une erreur d'absence."
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "I<pagefault.feat.pid>"
+msgstr "I<pagefault.feat.pid>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "The thread ID that triggered the page fault."
+msgstr "L'identifiant du thread qui a déclenché l'erreur de page."
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "I<fork.ufd>"
+msgstr "I<fork.ufd>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The file descriptor associated with the userfault object created for the "
+"child created by B<fork>(2)."
+msgstr ""
+"Le descripteur de fichier associé à l'objet userfault créé pour l'enfant "
+"créé par B<fork>(2)."
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "I<remap.from>"
+msgstr "I<remap.from>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The original address of the memory range that was remapped using "
+"B<mremap>(2)."
+msgstr ""
+"L'adresse d'origine de la plage de mémoire dont le mappage a été modifié en "
+"utilisant B<madvise>(2)."
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "I<remap.to>"
+msgstr "I<remap.to>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The new address of the memory range that was remapped using B<mremap>(2)."
+msgstr ""
+"La nouvelle adresse de la plage de mémoire dont le mappage a été modifié en "
+"utilisant B<madvise>(2)."
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "I<remap.len>"
+msgstr "I<remap.len>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The original length of the memory range that was remapped using B<mremap>(2)."
+msgstr ""
+"La taille d'origine de la plage de mémoire dont le mappage a été modifié en "
+"utilisant B<madvise>(2)."
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "I<remove.start>"
+msgstr "I<remove.start>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The start address of the memory range that was freed using B<madvise>(2) or "
+"unmapped"
+msgstr ""
+"L'adresse de début de la plage de mémoire qui a été libérée en utilisant "
+"B<madvise>(2) ou dont le mappage a été supprimé."
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "I<remove.end>"
+msgstr "I<remove.end>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The end address of the memory range that was freed using B<madvise>(2) or "
+"unmapped"
+msgstr ""
+"L'adresse terminale de la plage de mémoire qui a été libérée en utilisant "
+"B<madvise>(2) ou dont le mappage a été supprimé."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"A B<read>(2) on a userfaultfd file descriptor can fail with the following "
+"errors:"
+msgstr ""
+"B<read>(2) sur un descripteur de fichier userfaultfd peut échouer pour les "
+"raisons suivantes :"
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<EINVAL>"
+msgstr "B<EINVAL>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The userfaultfd object has not yet been enabled using the B<UFFDIO_API> "
+"B<ioctl>(2) operation"
+msgstr ""
+"L'objet userfaultfd n'a pas encore été activé avec l'opération d'B<ioctl>(2) "
+"B<UFFDIO_API>."
+
+#. FIXME What is the reason for this seemingly odd behavior with respect
+#. to the O_NONBLOCK flag? (see userfaultfd_poll() in fs/userfaultfd.c).
+#. Something needs to be said about this.
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"If the B<O_NONBLOCK> flag is enabled in the associated open file "
+"description, the userfaultfd file descriptor can be monitored with "
+"B<poll>(2), B<select>(2), and B<epoll>(7). When events are available, the "
+"file descriptor indicates as readable. If the B<O_NONBLOCK> flag is not "
+"enabled, then B<poll>(2) (always) indicates the file as having a B<POLLERR> "
+"condition, and B<select>(2) indicates the file descriptor as both readable "
+"and writable."
+msgstr ""
+"Si l'attribut B<O_NONBLOCK> est activé dans la description de fichier ouvert "
+"associée, le descripteur de fichier userfaultfd peut être surveillé avec "
+"B<poll>(2), B<select>(2) et B<epoll>(7). Quand les événements sont "
+"disponibles, le descripteur de fichier l'indique comme lisible. Si "
+"l'attribut B<O_NONBLOCK> n'est pas activé, alors B<poll>(2) indique "
+"(toujours) que le fichier comme ayant une condition B<POLLERR> et "
+"B<select>(2) indique que le descripteur de fichier est à la fois accessible "
+"en lecture et en écriture."
+
+#. type: SH
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "RETURN VALUE"
+msgstr "VALEUR RENVOYÉE"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"On success, B<userfaultfd>() returns a new file descriptor that refers to "
+"the userfaultfd object. On error, -1 is returned, and I<errno> is set to "
+"indicate the error."
+msgstr ""
+"En cas de succès, B<userfaultfd>() renvoie un nouveau descripteur de fichier "
+"qui fait référence à l'objet userfaultfd. En cas d'erreur, la fonction "
+"renvoie B<-1> et I<errno> est défini pour indiquer l'erreur."
+
+#. type: SH
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "ERRORS"
+msgstr "ERREURS"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "An unsupported value was specified in I<flags>."
+msgstr "Une valeur non prise en compte a été spécifiée dans I<flags>."
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<EMFILE>"
+msgstr "B<EMFILE>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The per-process limit on the number of open file descriptors has been reached"
+msgstr ""
+"La limite par processus du nombre de descripteurs de fichier ouverts a été "
+"atteinte."
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<ENFILE>"
+msgstr "B<ENFILE>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The system-wide limit on the total number of open files has been reached."
+msgstr ""
+"La limite du nombre total de fichiers ouverts pour le système entier a été "
+"atteinte."
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<ENOMEM>"
+msgstr "B<ENOMEM>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "Insufficient kernel memory was available."
+msgstr "La mémoire disponible du noyau n'était pas suffisante."
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<EPERM> (since Linux 5.2)"
+msgstr "B<EPERM> (depuis Linux 5.2)"
+
+#. cefdca0a86be517bc390fc4541e3674b8e7803b0
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The caller is not privileged (does not have the B<CAP_SYS_PTRACE> capability "
+"in the initial user namespace), and I</proc/sys/vm/unprivileged_userfaultfd> "
+"has the value 0."
+msgstr ""
+"L'appelant n'est pas privilégié (il n'a pas la capacité B<CAP_SYS_PTRACE> "
+"dans l'espace de noms initial) et I</proc/sys/vm/unprivileged_userfaultfd> a "
+"la valeur B<0>."
+
+#. type: SH
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "STANDARDS"
+msgstr "STANDARDS"
+
+#. type: Plain text
+#: archlinux debian-unstable fedora-40 fedora-rawhide mageia-cauldron
+#: opensuse-leap-15-6 opensuse-tumbleweed
+msgid "Linux."
+msgstr "Linux."
+
+#. type: SH
+#: archlinux debian-unstable fedora-40 fedora-rawhide mageia-cauldron
+#: opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "HISTORY"
+msgstr "HISTORIQUE"
+
+#. type: Plain text
+#: archlinux debian-unstable fedora-40 fedora-rawhide mageia-cauldron
+#: opensuse-leap-15-6 opensuse-tumbleweed
+msgid "Linux 4.3."
+msgstr "Linux 4.3."
+
+#. type: Plain text
+#: archlinux debian-unstable fedora-40 fedora-rawhide mageia-cauldron
+#: opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Support for hugetlbfs and shared memory areas and non-page-fault events was "
+"added in Linux 4.11"
+msgstr ""
+"La prise en charge des zones de mémoire hugetlbfs et partagée et des "
+"événements qui ne sont pas des erreurs de page a été ajoutée dans Linux 4.11"
+
+#. type: SH
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "NOTES"
+msgstr "NOTES"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The userfaultfd mechanism can be used as an alternative to traditional user-"
+"space paging techniques based on the use of the B<SIGSEGV> signal and "
+"B<mmap>(2). It can also be used to implement lazy restore for checkpoint/"
+"restore mechanisms, as well as post-copy migration to allow (nearly) "
+"uninterrupted execution when transferring virtual machines and Linux "
+"containers from one host to another."
+msgstr ""
+"Le mécanisme d'userfaultfd peut être utilisé comme une alternative aux "
+"techniques traditionnelles de pagination de l'espace utilisateur basées sur "
+"l'utilisation du signal B<SIGSEGV> et de B<mmap>(2). Il peut aussi être "
+"utilisé pour implémenter la restauration en mode paresseux (« lazy "
+"restore ») pour les mécanismes de la fonctionnalité de gel des applications "
+"(checkpoint/restore), aussi bien que la migration après copie pour permettre "
+"une exécution (presque) ininterrompue lors du transfert de machines "
+"virtuelles et de conteneurs Linux d'un hôte à un autre."
+
+#. type: SH
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "BUGS"
+msgstr "BOGUES"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"If the B<UFFD_FEATURE_EVENT_FORK> is enabled and a system call from the "
+"B<fork>(2) family is interrupted by a signal or failed, a stale userfaultfd "
+"descriptor might be created. In this case, a spurious B<UFFD_EVENT_FORK> "
+"will be delivered to the userfaultfd monitor."
+msgstr ""
+"Si B<UFFD_FEATURE_EVENT_FORK> est activé et si un appel système issu de la "
+"famille de B<fork>(2) est interrompu par un signal ou échoue, un descripteur "
+"périmé d'userfaultfd peut être créé. Dans ce cas, un faux B<UFFD_EVENT_FORK> "
+"sera fourni au surveillant d'userfaultfd."
+
+#. type: SH
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "EXAMPLES"
+msgstr "EXEMPLES"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The program below demonstrates the use of the userfaultfd mechanism. The "
+"program creates two threads, one of which acts as the page-fault handler for "
+"the process, for the pages in a demand-page zero region created using "
+"B<mmap>(2)."
+msgstr ""
+"Le programme ci-dessous démontre l'utilisation du mécanisme userfaultfd. Le "
+"programme crée deux threads, un qui agit comme gestionnaire d'erreur de page "
+"pour le processus, pour les pages dans une région sans demande de page en "
+"utilisant B<mmap>(2)."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The program takes one command-line argument, which is the number of pages "
+"that will be created in a mapping whose page faults will be handled via "
+"userfaultfd. After creating a userfaultfd object, the program then creates "
+"an anonymous private mapping of the specified size and registers the address "
+"range of that mapping using the B<UFFDIO_REGISTER> B<ioctl>(2) operation. "
+"The program then creates a second thread that will perform the task of "
+"handling page faults."
+msgstr ""
+"Le programme prend un argument en ligne de commande, qui est le nombre de "
+"pages qui seront créées dans un mappage dont les erreurs de pages seront "
+"gérées au moyen d'userfaultfd. Après la création d'un objet userfaultfd, le "
+"programme crée alors un mappage privé anonyme de la taille spécifiée et "
+"enregistre l'intervalle d'adresses de ce mappage en utilisant l'opération "
+"d'B<ioctl>(2) B<UFFDIO_REGISTER>. Le programme crée alors un second thread "
+"qui exécutera la tâche de gestion des erreurs de page."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The main thread then walks through the pages of the mapping fetching bytes "
+"from successive pages. Because the pages have not yet been accessed, the "
+"first access of a byte in each page will trigger a page-fault event on the "
+"userfaultfd file descriptor."
+msgstr ""
+"Le thread principal parcourt les pages du mappage à la recherche des octets "
+"des pages successives. Comme il n'y a pas eu encore d'accès aux pages, le "
+"premier accès à un octet de chaque page déclenchera un événement d'erreur de "
+"page sur le descripteur de fichier userfaultfd."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Each of the page-fault events is handled by the second thread, which sits in "
+"a loop processing input from the userfaultfd file descriptor. In each loop "
+"iteration, the second thread first calls B<poll>(2) to check the state of "
+"the file descriptor, and then reads an event from the file descriptor. All "
+"such events should be B<UFFD_EVENT_PAGEFAULT> events, which the thread "
+"handles by copying a page of data into the faulting region using the "
+"B<UFFDIO_COPY> B<ioctl>(2) operation."
+msgstr ""
+"Chaque événement d'erreur de page est géré par le second thread qui "
+"s'installe dans une boucle traitant l'entrée du descripteur de fichier "
+"userfaultfd. À chaque itération de la boucle, le second thread appelle "
+"B<poll>(2) pour vérifier l'état du descripteur de fichier puis lit un "
+"événement à partir de ce descripteur de fichier. Tout ce type d'événements "
+"doit être un événement B<UFFD_EVENT_PAGEFAULT> que le thread traite en "
+"copiant un page de données dans la région en erreur en utilisant l'opération "
+"d'B<ioctl>(2) B<UFFDIO_COPY>."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "The following is an example of what we see when running the program:"
+msgstr ""
+"La suite est un exemple de ce qui est observé lors de l'exécution du "
+"programme :"
+
+#. type: Plain text
+#: archlinux debian-unstable fedora-40 fedora-rawhide mageia-cauldron
+#: opensuse-tumbleweed
+#, no-wrap
+msgid ""
+"$ B<./userfaultfd_demo 3>\n"
+"Address returned by mmap() = 0x7fd30106c000\n"
+"\\&\n"
+"fault_handler_thread():\n"
+" poll() returns: nready = 1; POLLIN = 1; POLLERR = 0\n"
+" UFFD_EVENT_PAGEFAULT event: flags = 0; address = 7fd30106c00f\n"
+" (uffdio_copy.copy returned 4096)\n"
+"Read address 0x7fd30106c00f in main(): A\n"
+"Read address 0x7fd30106c40f in main(): A\n"
+"Read address 0x7fd30106c80f in main(): A\n"
+"Read address 0x7fd30106cc0f in main(): A\n"
+"\\&\n"
+"fault_handler_thread():\n"
+" poll() returns: nready = 1; POLLIN = 1; POLLERR = 0\n"
+" UFFD_EVENT_PAGEFAULT event: flags = 0; address = 7fd30106d00f\n"
+" (uffdio_copy.copy returned 4096)\n"
+"Read address 0x7fd30106d00f in main(): B\n"
+"Read address 0x7fd30106d40f in main(): B\n"
+"Read address 0x7fd30106d80f in main(): B\n"
+"Read address 0x7fd30106dc0f in main(): B\n"
+"\\&\n"
+"fault_handler_thread():\n"
+" poll() returns: nready = 1; POLLIN = 1; POLLERR = 0\n"
+" UFFD_EVENT_PAGEFAULT event: flags = 0; address = 7fd30106e00f\n"
+" (uffdio_copy.copy returned 4096)\n"
+"Read address 0x7fd30106e00f in main(): C\n"
+"Read address 0x7fd30106e40f in main(): C\n"
+"Read address 0x7fd30106e80f in main(): C\n"
+"Read address 0x7fd30106ec0f in main(): C\n"
+msgstr ""
+"$ B<./userfaultfd_demo 3>\n"
+"Address returned by mmap() = 0x7fd30106c000\n"
+"\\&\n"
+"fault_handler_thread():\n"
+" poll() returns: nready = 1; POLLIN = 1; POLLERR = 0\n"
+" UFFD_EVENT_PAGEFAULT event: flags = 0; address = 7fd30106c00f\n"
+" (uffdio_copy.copy returned 4096)\n"
+"Read address 0x7fd30106c00f in main(): A\n"
+"Read address 0x7fd30106c40f in main(): A\n"
+"Read address 0x7fd30106c80f in main(): A\n"
+"Read address 0x7fd30106cc0f in main(): A\n"
+"\\&\n"
+"fault_handler_thread():\n"
+" poll() returns: nready = 1; POLLIN = 1; POLLERR = 0\n"
+" UFFD_EVENT_PAGEFAULT event: flags = 0; address = 7fd30106d00f\n"
+" (uffdio_copy.copy returned 4096)\n"
+"Read address 0x7fd30106d00f in main(): B\n"
+"Read address 0x7fd30106d40f in main(): B\n"
+"Read address 0x7fd30106d80f in main(): B\n"
+"Read address 0x7fd30106dc0f in main(): B\n"
+"\\&\n"
+"fault_handler_thread():\n"
+" poll() returns: nready = 1; POLLIN = 1; POLLERR = 0\n"
+" UFFD_EVENT_PAGEFAULT event: flags = 0; address = 7fd30106e00f\n"
+" (uffdio_copy.copy returned 4096)\n"
+"Read address 0x7fd30106e00f in main(): C\n"
+"Read address 0x7fd30106e40f in main(): C\n"
+"Read address 0x7fd30106e80f in main(): C\n"
+"Read address 0x7fd30106ec0f in main(): C\n"
+
+#. type: SS
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "Program source"
+msgstr "Source du programme"
+
+#. type: Plain text
+#: archlinux fedora-40 fedora-rawhide mageia-cauldron
+#, fuzzy, no-wrap
+#| msgid ""
+#| "/* userfaultfd_demo.c\n"
+#| "\\&\n"
+#| " Licensed under the GNU General Public License version 2 or later.\n"
+#| "*/\n"
+#| "#define _GNU_SOURCE\n"
+#| "#include E<lt>err.hE<gt>\n"
+#| "#include E<lt>errno.hE<gt>\n"
+#| "#include E<lt>fcntl.hE<gt>\n"
+#| "#include E<lt>inttypes.hE<gt>\n"
+#| "#include E<lt>linux/userfaultfd.hE<gt>\n"
+#| "#include E<lt>poll.hE<gt>\n"
+#| "#include E<lt>pthread.hE<gt>\n"
+#| "#include E<lt>stdio.hE<gt>\n"
+#| "#include E<lt>stdlib.hE<gt>\n"
+#| "#include E<lt>string.hE<gt>\n"
+#| "#include E<lt>sys/ioctl.hE<gt>\n"
+#| "#include E<lt>sys/mman.hE<gt>\n"
+#| "#include E<lt>sys/syscall.hE<gt>\n"
+#| "#include E<lt>unistd.hE<gt>\n"
+#| "\\&\n"
+#| "static int page_size;\n"
+#| "\\&\n"
+#| "static void *\n"
+#| "fault_handler_thread(void *arg)\n"
+#| "{\n"
+#| " int nready;\n"
+#| " long uffd; /* userfaultfd file descriptor */\n"
+#| " ssize_t nread;\n"
+#| " struct pollfd pollfd;\n"
+#| " struct uffdio_copy uffdio_copy;\n"
+#| "\\&\n"
+#| " static int fault_cnt = 0; /* Number of faults so far handled */\n"
+#| " static char *page = NULL;\n"
+#| " static struct uffd_msg msg; /* Data read from userfaultfd */\n"
+#| "\\&\n"
+#| " uffd = (long) arg;\n"
+#| "\\&\n"
+#| " /* Create a page that will be copied into the faulting region. */\n"
+#| "\\&\n"
+#| " if (page == NULL) {\n"
+#| " page = mmap(NULL, page_size, PROT_READ | PROT_WRITE,\n"
+#| " MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n"
+#| " if (page == MAP_FAILED)\n"
+#| " err(EXIT_FAILURE, \"mmap\");\n"
+#| " }\n"
+#| "\\&\n"
+#| " /* Loop, handling incoming events on the userfaultfd\n"
+#| " file descriptor. */\n"
+#| "\\&\n"
+#| " for (;;) {\n"
+#| "\\&\n"
+#| " /* See what poll() tells us about the userfaultfd. */\n"
+#| "\\&\n"
+#| " pollfd.fd = uffd;\n"
+#| " pollfd.events = POLLIN;\n"
+#| " nready = poll(&pollfd, 1, -1);\n"
+#| " if (nready == -1)\n"
+#| " err(EXIT_FAILURE, \"poll\");\n"
+#| "\\&\n"
+#| " printf(\"\\enfault_handler_thread():\\en\");\n"
+#| " printf(\" poll() returns: nready = %d; \"\n"
+#| " \"POLLIN = %d; POLLERR = %d\\en\", nready,\n"
+#| " (pollfd.revents & POLLIN) != 0,\n"
+#| " (pollfd.revents & POLLERR) != 0);\n"
+#| "\\&\n"
+#| " /* Read an event from the userfaultfd. */\n"
+#| "\\&\n"
+#| " nread = read(uffd, &msg, sizeof(msg));\n"
+#| " if (nread == 0) {\n"
+#| " printf(\"EOF on userfaultfd!\\en\");\n"
+#| " exit(EXIT_FAILURE);\n"
+#| " }\n"
+#| "\\&\n"
+#| " if (nread == -1)\n"
+#| " err(EXIT_FAILURE, \"read\");\n"
+#| "\\&\n"
+#| " /* We expect only one kind of event; verify that assumption. */\n"
+#| "\\&\n"
+#| " if (msg.event != UFFD_EVENT_PAGEFAULT) {\n"
+#| " fprintf(stderr, \"Unexpected event on userfaultfd\\en\");\n"
+#| " exit(EXIT_FAILURE);\n"
+#| " }\n"
+#| "\\&\n"
+#| " /* Display info about the page-fault event. */\n"
+#| "\\&\n"
+#| " printf(\" UFFD_EVENT_PAGEFAULT event: \");\n"
+#| " printf(\"flags = %\"PRIx64\"; \", msg.arg.pagefault.flags);\n"
+#| " printf(\"address = %\"PRIx64\"\\en\", msg.arg.pagefault.address);\n"
+#| "\\&\n"
+#| " /* Copy the page pointed to by \\[aq]page\\[aq] into the faulting\n"
+#| " region. Vary the contents that are copied in, so that it\n"
+#| " is more obvious that each fault is handled separately. */\n"
+#| "\\&\n"
+#| " memset(page, \\[aq]A\\[aq] + fault_cnt % 20, page_size);\n"
+#| " fault_cnt++;\n"
+#| "\\&\n"
+#| " uffdio_copy.src = (unsigned long) page;\n"
+#| "\\&\n"
+#| " /* We need to handle page faults in units of pages(!).\n"
+#| " So, round faulting address down to page boundary. */\n"
+#| "\\&\n"
+#| " uffdio_copy.dst = (unsigned long) msg.arg.pagefault.address &\n"
+#| " \\[ti](page_size - 1);\n"
+#| " uffdio_copy.len = page_size;\n"
+#| " uffdio_copy.mode = 0;\n"
+#| " uffdio_copy.copy = 0;\n"
+#| " if (ioctl(uffd, UFFDIO_COPY, &uffdio_copy) == -1)\n"
+#| " err(EXIT_FAILURE, \"ioctl-UFFDIO_COPY\");\n"
+#| "\\&\n"
+#| " printf(\" (uffdio_copy.copy returned %\"PRId64\")\\en\",\n"
+#| " uffdio_copy.copy);\n"
+#| " }\n"
+#| "}\n"
+#| "\\&\n"
+#| "int\n"
+#| "main(int argc, char *argv[])\n"
+#| "{\n"
+#| " int s;\n"
+#| " char c;\n"
+#| " char *addr; /* Start of region handled by userfaultfd */\n"
+#| " long uffd; /* userfaultfd file descriptor */\n"
+#| " size_t len, l; /* Length of region handled by userfaultfd */\n"
+#| " pthread_t thr; /* ID of thread that handles page faults */\n"
+#| " struct uffdio_api uffdio_api;\n"
+#| " struct uffdio_register uffdio_register;\n"
+#| "\\&\n"
+#| " if (argc != 2) {\n"
+#| " fprintf(stderr, \"Usage: %s num-pages\\en\", argv[0]);\n"
+#| " exit(EXIT_FAILURE);\n"
+#| " }\n"
+#| "\\&\n"
+#| " page_size = sysconf(_SC_PAGE_SIZE);\n"
+#| " len = strtoull(argv[1], NULL, 0) * page_size;\n"
+#| "\\&\n"
+#| " /* Create and enable userfaultfd object. */\n"
+#| "\\&\n"
+#| " uffd = syscall(SYS_userfaultfd, O_CLOEXEC | O_NONBLOCK);\n"
+#| " if (uffd == -1)\n"
+#| " err(EXIT_FAILURE, \"userfaultfd\");\n"
+#| "\\&\n"
+#| " uffdio_api.api = UFFD_API;\n"
+#| " uffdio_api.features = 0;\n"
+#| " if (ioctl(uffd, UFFDIO_API, &uffdio_api) == -1)\n"
+#| " err(EXIT_FAILURE, \"ioctl-UFFDIO_API\");\n"
+#| "\\&\n"
+#| " /* Create a private anonymous mapping. The memory will be\n"
+#| " demand-zero paged--that is, not yet allocated. When we\n"
+#| " actually touch the memory, it will be allocated via\n"
+#| " the userfaultfd. */\n"
+#| "\\&\n"
+#| " addr = mmap(NULL, len, PROT_READ | PROT_WRITE,\n"
+#| " MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n"
+#| " if (addr == MAP_FAILED)\n"
+#| " err(EXIT_FAILURE, \"mmap\");\n"
+#| "\\&\n"
+#| " printf(\"Address returned by mmap() = %p\\en\", addr);\n"
+#| "\\&\n"
+#| " /* Register the memory range of the mapping we just created for\n"
+#| " handling by the userfaultfd object. In mode, we request to track\n"
+#| " missing pages (i.e., pages that have not yet been faulted in). */\n"
+#| "\\&\n"
+#| " uffdio_register.range.start = (unsigned long) addr;\n"
+#| " uffdio_register.range.len = len;\n"
+#| " uffdio_register.mode = UFFDIO_REGISTER_MODE_MISSING;\n"
+#| " if (ioctl(uffd, UFFDIO_REGISTER, &uffdio_register) == -1)\n"
+#| " err(EXIT_FAILURE, \"ioctl-UFFDIO_REGISTER\");\n"
+#| "\\&\n"
+#| " /* Create a thread that will process the userfaultfd events. */\n"
+#| "\\&\n"
+#| " s = pthread_create(&thr, NULL, fault_handler_thread, (void *) uffd);\n"
+#| " if (s != 0) {\n"
+#| " errc(EXIT_FAILURE, s, \"pthread_create\");\n"
+#| " }\n"
+#| "\\&\n"
+#| " /* Main thread now touches memory in the mapping, touching\n"
+#| " locations 1024 bytes apart. This will trigger userfaultfd\n"
+#| " events for all pages in the region. */\n"
+#| "\\&\n"
+#| " l = 0xf; /* Ensure that faulting address is not on a page\n"
+#| " boundary, in order to test that we correctly\n"
+#| " handle that case in fault_handling_thread(). */\n"
+#| " while (l E<lt> len) {\n"
+#| " c = addr[l];\n"
+#| " printf(\"Read address %p in %s(): \", addr + l, __func__);\n"
+#| " printf(\"%c\\en\", c);\n"
+#| " l += 1024;\n"
+#| " usleep(100000); /* Slow things down a little */\n"
+#| " }\n"
+#| "\\&\n"
+#| " exit(EXIT_SUCCESS);\n"
+#| "}\n"
+msgid ""
+"/* userfaultfd_demo.c\n"
+"\\&\n"
+" Licensed under the GNU General Public License version 2 or later.\n"
+"*/\n"
+"#define _GNU_SOURCE\n"
+"#include E<lt>err.hE<gt>\n"
+"#include E<lt>errno.hE<gt>\n"
+"#include E<lt>fcntl.hE<gt>\n"
+"#include E<lt>inttypes.hE<gt>\n"
+"#include E<lt>linux/userfaultfd.hE<gt>\n"
+"#include E<lt>poll.hE<gt>\n"
+"#include E<lt>pthread.hE<gt>\n"
+"#include E<lt>stdio.hE<gt>\n"
+"#include E<lt>stdlib.hE<gt>\n"
+"#include E<lt>string.hE<gt>\n"
+"#include E<lt>sys/ioctl.hE<gt>\n"
+"#include E<lt>sys/mman.hE<gt>\n"
+"#include E<lt>sys/syscall.hE<gt>\n"
+"#include E<lt>unistd.hE<gt>\n"
+"\\&\n"
+"static int page_size;\n"
+"\\&\n"
+"static void *\n"
+"fault_handler_thread(void *arg)\n"
+"{\n"
+" int nready;\n"
+" long uffd; /* userfaultfd file descriptor */\n"
+" ssize_t nread;\n"
+" struct pollfd pollfd;\n"
+" struct uffdio_copy uffdio_copy;\n"
+"\\&\n"
+" static int fault_cnt = 0; /* Number of faults so far handled */\n"
+" static char *page = NULL;\n"
+" static struct uffd_msg msg; /* Data read from userfaultfd */\n"
+"\\&\n"
+" uffd = (long) arg;\n"
+"\\&\n"
+" /* Create a page that will be copied into the faulting region. */\n"
+"\\&\n"
+" if (page == NULL) {\n"
+" page = mmap(NULL, page_size, PROT_READ | PROT_WRITE,\n"
+" MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n"
+" if (page == MAP_FAILED)\n"
+" err(EXIT_FAILURE, \"mmap\");\n"
+" }\n"
+"\\&\n"
+" /* Loop, handling incoming events on the userfaultfd\n"
+" file descriptor. */\n"
+"\\&\n"
+" for (;;) {\n"
+"\\&\n"
+" /* See what poll() tells us about the userfaultfd. */\n"
+"\\&\n"
+" pollfd.fd = uffd;\n"
+" pollfd.events = POLLIN;\n"
+" nready = poll(&pollfd, 1, -1);\n"
+" if (nready == -1)\n"
+" err(EXIT_FAILURE, \"poll\");\n"
+"\\&\n"
+" printf(\"\\enfault_handler_thread():\\en\");\n"
+" printf(\" poll() returns: nready = %d; \"\n"
+" \"POLLIN = %d; POLLERR = %d\\en\", nready,\n"
+" (pollfd.revents & POLLIN) != 0,\n"
+" (pollfd.revents & POLLERR) != 0);\n"
+"\\&\n"
+" /* Read an event from the userfaultfd. */\n"
+"\\&\n"
+" nread = read(uffd, &msg, sizeof(msg));\n"
+" if (nread == 0) {\n"
+" printf(\"EOF on userfaultfd!\\en\");\n"
+" exit(EXIT_FAILURE);\n"
+" }\n"
+"\\&\n"
+" if (nread == -1)\n"
+" err(EXIT_FAILURE, \"read\");\n"
+"\\&\n"
+" /* We expect only one kind of event; verify that assumption. */\n"
+"\\&\n"
+" if (msg.event != UFFD_EVENT_PAGEFAULT) {\n"
+" fprintf(stderr, \"Unexpected event on userfaultfd\\en\");\n"
+" exit(EXIT_FAILURE);\n"
+" }\n"
+"\\&\n"
+" /* Display info about the page-fault event. */\n"
+"\\&\n"
+" printf(\" UFFD_EVENT_PAGEFAULT event: \");\n"
+" printf(\"flags = %\"PRIx64\"; \", msg.arg.pagefault.flags);\n"
+" printf(\"address = %\"PRIx64\"\\en\", msg.arg.pagefault.address);\n"
+"\\&\n"
+" /* Copy the page pointed to by \\[aq]page\\[aq] into the faulting\n"
+" region. Vary the contents that are copied in, so that it\n"
+" is more obvious that each fault is handled separately. */\n"
+"\\&\n"
+" memset(page, \\[aq]A\\[aq] + fault_cnt % 20, page_size);\n"
+" fault_cnt++;\n"
+"\\&\n"
+" uffdio_copy.src = (unsigned long) page;\n"
+"\\&\n"
+" /* We need to handle page faults in units of pages(!).\n"
+" So, round faulting address down to page boundary. */\n"
+"\\&\n"
+" uffdio_copy.dst = (unsigned long) msg.arg.pagefault.address &\n"
+" \\[ti](page_size - 1);\n"
+" uffdio_copy.len = page_size;\n"
+" uffdio_copy.mode = 0;\n"
+" uffdio_copy.copy = 0;\n"
+" if (ioctl(uffd, UFFDIO_COPY, &uffdio_copy) == -1)\n"
+" err(EXIT_FAILURE, \"ioctl-UFFDIO_COPY\");\n"
+"\\&\n"
+" printf(\" (uffdio_copy.copy returned %\"PRId64\")\\en\",\n"
+" uffdio_copy.copy);\n"
+" }\n"
+"}\n"
+"\\&\n"
+"int\n"
+"main(int argc, char *argv[])\n"
+"{\n"
+" int s;\n"
+" char c;\n"
+" char *addr; /* Start of region handled by userfaultfd */\n"
+" long uffd; /* userfaultfd file descriptor */\n"
+" size_t len, l; /* Length of region handled by userfaultfd */\n"
+" pthread_t thr; /* ID of thread that handles page faults */\n"
+" struct uffdio_api uffdio_api;\n"
+" struct uffdio_register uffdio_register;\n"
+"\\&\n"
+" if (argc != 2) {\n"
+" fprintf(stderr, \"Usage: %s num-pages\\en\", argv[0]);\n"
+" exit(EXIT_FAILURE);\n"
+" }\n"
+"\\&\n"
+" page_size = sysconf(_SC_PAGE_SIZE);\n"
+" len = strtoull(argv[1], NULL, 0) * page_size;\n"
+"\\&\n"
+" /* Create and enable userfaultfd object. */\n"
+"\\&\n"
+" uffd = syscall(SYS_userfaultfd, O_CLOEXEC | O_NONBLOCK);\n"
+" if (uffd == -1)\n"
+" err(EXIT_FAILURE, \"userfaultfd\");\n"
+"\\&\n"
+" /* NOTE: Two-step feature handshake is not needed here, since this\n"
+" example doesn't require any specific features.\n"
+"\\&\n"
+" Programs that *do* should call UFFDIO_API twice: once with\n"
+" `features = 0` to detect features supported by this kernel, and\n"
+" again with the subset of features the program actually wants to\n"
+" enable. */\n"
+" uffdio_api.api = UFFD_API;\n"
+" uffdio_api.features = 0;\n"
+" if (ioctl(uffd, UFFDIO_API, &uffdio_api) == -1)\n"
+" err(EXIT_FAILURE, \"ioctl-UFFDIO_API\");\n"
+"\\&\n"
+" /* Create a private anonymous mapping. The memory will be\n"
+" demand-zero paged--that is, not yet allocated. When we\n"
+" actually touch the memory, it will be allocated via\n"
+" the userfaultfd. */\n"
+"\\&\n"
+" addr = mmap(NULL, len, PROT_READ | PROT_WRITE,\n"
+" MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n"
+" if (addr == MAP_FAILED)\n"
+" err(EXIT_FAILURE, \"mmap\");\n"
+"\\&\n"
+" printf(\"Address returned by mmap() = %p\\en\", addr);\n"
+"\\&\n"
+" /* Register the memory range of the mapping we just created for\n"
+" handling by the userfaultfd object. In mode, we request to track\n"
+" missing pages (i.e., pages that have not yet been faulted in). */\n"
+"\\&\n"
+" uffdio_register.range.start = (unsigned long) addr;\n"
+" uffdio_register.range.len = len;\n"
+" uffdio_register.mode = UFFDIO_REGISTER_MODE_MISSING;\n"
+" if (ioctl(uffd, UFFDIO_REGISTER, &uffdio_register) == -1)\n"
+" err(EXIT_FAILURE, \"ioctl-UFFDIO_REGISTER\");\n"
+"\\&\n"
+" /* Create a thread that will process the userfaultfd events. */\n"
+"\\&\n"
+" s = pthread_create(&thr, NULL, fault_handler_thread, (void *) uffd);\n"
+" if (s != 0) {\n"
+" errc(EXIT_FAILURE, s, \"pthread_create\");\n"
+" }\n"
+"\\&\n"
+" /* Main thread now touches memory in the mapping, touching\n"
+" locations 1024 bytes apart. This will trigger userfaultfd\n"
+" events for all pages in the region. */\n"
+"\\&\n"
+" l = 0xf; /* Ensure that faulting address is not on a page\n"
+" boundary, in order to test that we correctly\n"
+" handle that case in fault_handling_thread(). */\n"
+" while (l E<lt> len) {\n"
+" c = addr[l];\n"
+" printf(\"Read address %p in %s(): \", addr + l, __func__);\n"
+" printf(\"%c\\en\", c);\n"
+" l += 1024;\n"
+" usleep(100000); /* Slow things down a little */\n"
+" }\n"
+"\\&\n"
+" exit(EXIT_SUCCESS);\n"
+"}\n"
+msgstr ""
+"/* userfaultfd_demo.c\n"
+"\\&\n"
+" Licensed under the GNU General Public License version 2 or later.\n"
+"*/\n"
+"#define _GNU_SOURCE\n"
+"#include E<lt>err.hE<gt>\n"
+"#include E<lt>errno.hE<gt>\n"
+"#include E<lt>fcntl.hE<gt>\n"
+"#include E<lt>inttypes.hE<gt>\n"
+"#include E<lt>linux/userfaultfd.hE<gt>\n"
+"#include E<lt>poll.hE<gt>\n"
+"#include E<lt>pthread.hE<gt>\n"
+"#include E<lt>stdio.hE<gt>\n"
+"#include E<lt>stdlib.hE<gt>\n"
+"#include E<lt>string.hE<gt>\n"
+"#include E<lt>sys/ioctl.hE<gt>\n"
+"#include E<lt>sys/mman.hE<gt>\n"
+"#include E<lt>sys/syscall.hE<gt>\n"
+"#include E<lt>unistd.hE<gt>\n"
+"\\&\n"
+"static int page_size;\n"
+"\\&\n"
+"static void *\n"
+"fault_handler_thread(void *arg)\n"
+"{\n"
+" int nready;\n"
+" long uffd; /* descripteur du fichier userfaultfd */\n"
+" ssize_t nread;\n"
+" struct pollfd pollfd;\n"
+" struct uffdio_copy uffdio_copy;\n"
+"\\&\n"
+" static int fault_cnt = 0; /* Nombres d'erreurs déjà gérées */\n"
+" static char *page = NULL;\n"
+" static struct uffd_msg msg; /* Données lues à partir de userfaultfd */\n"
+"\\&\n"
+" uffd = (long) arg;\n"
+"\\&\n"
+" /* Créer une page qui sera copiée dans la région en erreur. */\n"
+"\\&\n"
+" if (page == NULL) {\n"
+" page = mmap(NULL, page_size, PROT_READ | PROT_WRITE,\n"
+" MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n"
+" if (page == MAP_FAILED)\n"
+" err(EXIT_FAILURE, \"mmap\");\n"
+" }\n"
+"\\&\n"
+" /* Boucle gérant les événements entrants sur le descripteur\n"
+" de fichier userfaultfd. */\n"
+"\\&\n"
+" for (;;) {\n"
+"\\&\n"
+" /* Voir ce que poll() nous dit sur l'userfaultfd. */\n"
+"\\&\n"
+" pollfd.fd = uffd;\n"
+" pollfd.events = POLLIN;\n"
+" nready = poll(&pollfd, 1, -1);\n"
+" if (nready == -1)\n"
+" err(EXIT_FAILURE, \"poll\");\n"
+"\\&\n"
+" printf(\"\\enfault_handler_thread():\\en\");\n"
+" printf(\" poll() returns: nready = %d; \"\n"
+" \"POLLIN = %d; POLLERR = %d\\en\", nready,\n"
+" (pollfd.revents & POLLIN) != 0,\n"
+" (pollfd.revents & POLLERR) != 0);\n"
+"\\&\n"
+" /* Lire un événement à partir de l'userfaultfd. */\n"
+"\\&\n"
+" nread = read(uffd, &msg, sizeof(msg));\n"
+" if (nread == 0) {\n"
+" printf(\"EOF on userfaultfd!\\en\");\n"
+" exit(EXIT_FAILURE);\n"
+" }\n"
+"\\&\n"
+" if (nread == -1)\n"
+" err(EXIT_FAILURE, \"read\");\n"
+"\\&\n"
+" /* Un seul type d'événement est attendu ; il faut vérifier\n"
+" cette supposition. */\n"
+"\\&\n"
+" if (msg.event != UFFD_EVENT_PAGEFAULT) {\n"
+" fprintf(stderr, \"Unexpected event on userfaultfd\\en\");\n"
+" exit(EXIT_FAILURE);\n"
+" }\n"
+"\\&\n"
+" /* Afficher une information sur l'événement erreur de page. */\n"
+"\\&\n"
+" printf(\" UFFD_EVENT_PAGEFAULT event: \");\n"
+" printf(\"flags = %\"PRIx64\"; \", msg.arg.pagefault.flags);\n"
+" printf(\"address = %\"PRIx64\"\\en\", msg.arg.pagefault.address);\n"
+"\\&\n"
+" /* Copier la page sur laquelle pointe la « page » dans la région\n"
+" fautive. Varier le contenu copié, afin qu'il soit plus\n"
+" évident que chaque erreur soit gérée séparément. */\n"
+"\\&\n"
+" memset(page, \\[aq]A\\[aq] + fault_cnt % 20, page_size);\n"
+" fault_cnt++;\n"
+"\\&\n"
+" uffdio_copy.src = (unsigned long) page;\n"
+"\\&\n"
+" /* Il est nécessaire de gérer les erreurs de page en\n"
+" unités de pages(!). Aussi, il faut arrondir les\n"
+" adresses fautives à la limite de page. */\n"
+"\\&\n"
+" uffdio_copy.dst = (unsigned long) msg.arg.pagefault.address &\n"
+" \\[ti](page_size - 1);\n"
+" uffdio_copy.len = page_size;\n"
+" uffdio_copy.mode = 0;\n"
+" uffdio_copy.copy = 0;\n"
+" if (ioctl(uffd, UFFDIO_COPY, &uffdio_copy) == -1)\n"
+" err(EXIT_FAILURE, \"ioctl-UFFDIO_COPY\");\n"
+"\\&\n"
+" printf(\" (uffdio_copy.copy returned %\"PRId64\")\\en\",\n"
+" uffdio_copy.copy);\n"
+" }\n"
+"}\n"
+"\\&\n"
+"int\n"
+"main(int argc, char *argv[])\n"
+"{\n"
+" int s;\n"
+" char c;\n"
+" char *addr; /* Début de la région gérée par userfaultfd */\n"
+" long uffd; /* Descripteur de fichier userfaultfd */\n"
+" size_t len, l; /* Taille de la région gérée par userfaultfd */\n"
+" pthread_t thr; /* ID du thread qui gère les erreurs de page */\n"
+" struct uffdio_api uffdio_api;\n"
+" struct uffdio_register uffdio_register;\n"
+"\\&\n"
+" if (argc != 2) {\n"
+" fprintf(stderr, \"Utilisation : %s num-pages\\en\", argv[0]);\n"
+" exit(EXIT_FAILURE);\n"
+" }\n"
+"\\&\n"
+" page_size = sysconf(_SC_PAGE_SIZE);\n"
+" len = strtoull(argv[1], NULL, 0) * page_size;\n"
+"\\&\n"
+" /* Créer et activer un objet userfaultfd. */\n"
+"\\&\n"
+" uffd = syscall(SYS_userfaultfd, O_CLOEXEC | O_NONBLOCK);\n"
+" if (uffd == -1)\n"
+" err(EXIT_FAILURE, \"userfaultfd\");\n"
+"\\&\n"
+" uffdio_api.api = UFFD_API;\n"
+" uffdio_api.features = 0;\n"
+" if (ioctl(uffd, UFFDIO_API, &uffdio_api) == -1)\n"
+" err(EXIT_FAILURE, \"ioctl-UFFDIO_API\");\n"
+"\\&\n"
+" /* Créer un mappage anonyme privé. La mémoire sera paginée\n"
+" avec aucune demande — c'est-à-dire, sans être encore\n"
+" allouée. Quand la mémoire sera réellement utilisée,\n"
+" elle sera allouée au moyen de l'userfaultfd. */\n"
+"\\&\n"
+" addr = mmap(NULL, len, PROT_READ | PROT_WRITE,\n"
+" MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n"
+" if (addr == MAP_FAILED)\n"
+" err(EXIT_FAILURE, \"mmap\");\n"
+"\\&\n"
+" printf(\"Address returned by mmap() = %p\\en\", addr);\n"
+"\\&\n"
+" /* Enregistrer l'intervalle de mémoire du mappage qui vient d'être\n"
+" créé pour le traitement par l'objet userfaultfd. Dans mode,\n"
+" suivre les pages manquantes (c'est-à-dire, les pages qui ne sont\n"
+" pas encore fautives). */\n"
+"\\&\n"
+" uffdio_register.range.start = (unsigned long) addr;\n"
+" uffdio_register.range.len = len;\n"
+" uffdio_register.mode = UFFDIO_REGISTER_MODE_MISSING;\n"
+" if (ioctl(uffd, UFFDIO_REGISTER, &uffdio_register) == -1)\n"
+" err(EXIT_FAILURE, \"ioctl-UFFDIO_REGISTER\");\n"
+"\\&\n"
+" /* Créer un thread qui traitera les événements userfaultfd. */\n"
+"\\&\n"
+" s = pthread_create(&thr, NULL, fault_handler_thread, (void *) uffd);\n"
+" if (s != 0) {\n"
+" errc(EXIT_FAILURE, s, \"pthread_create\");\n"
+" }\n"
+"\\&\n"
+" /* Le thread principal utilise la mémoire dans le mappage,\n"
+" utilisant des emplacements séparés de 1024 octets. Cela va\n"
+" déclencher des événements userfaultfd pour toutes les pages\n"
+" dans la région. */\n"
+"\\&\n"
+" l = 0xf; /* Assurer que l'adresse fautive n'est pas sur une\n"
+" limite de page afin de vérifier que ce cas est\n"
+" correctement géré dans le fault_handling_thread(). */\n"
+" while (l E<lt> len) {\n"
+" c = addr[l];\n"
+" printf(\"Read address %p in %s(): \", addr + l, __func__);\n"
+" printf(\"%c\\en\", c);\n"
+" l += 1024;\n"
+" usleep(100000); /* Ralentir un peu le traitement */\n"
+" }\n"
+"\\&\n"
+" exit(EXIT_SUCCESS);\n"
+"}\n"
+
+#. SRC END
+#. type: SH
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "SEE ALSO"
+msgstr "VOIR AUSSI"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"B<fcntl>(2), B<ioctl>(2), B<ioctl_userfaultfd>(2), B<madvise>(2), B<mmap>(2)"
+msgstr ""
+"B<fcntl>(2), B<ioctl>(2), B<ioctl_userfaultfd>(2), B<madvise>(2), B<mmap>(2)"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"I<Documentation/admin-guide/mm/userfaultfd.rst> in the Linux kernel source "
+"tree"
+msgstr ""
+"I<Documentation/admin-guide/mm/userfaultfd.rst> dans l'arborescence des "
+"sources du noyau Linux"
+
+#. type: TH
+#: debian-bookworm
+#, no-wrap
+msgid "2023-02-05"
+msgstr "5 février 2023"
+
+#. type: TH
+#: debian-bookworm
+#, no-wrap
+msgid "Linux man-pages 6.03"
+msgstr "Pages du manuel de Linux 6.03"
+
+#. type: Plain text
+#: debian-bookworm debian-unstable opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"After the userfaultfd object is created with B<userfaultfd>(), the "
+"application must enable it using the B<UFFDIO_API> B<ioctl>(2) operation. "
+"This operation allows a handshake between the kernel and user space to "
+"determine the API version and supported features. This operation must be "
+"performed before any of the other B<ioctl>(2) operations described below "
+"(or those operations fail with the B<EINVAL> error)."
+msgstr ""
+"Après la création de l'objet userfaultfd avec B<userfaultfd>(), "
+"l'application doit l'activer en utilisant l'opération B<UFFDIO_API> de "
+"B<ioctl>(2). Cette opération permet une connexion entre le noyau et l'espace "
+"utilisateur pour déterminer la version de l'API et les fonctions prises en "
+"charge. Cette opération doit être réalisée avant toutes les autres "
+"opérations B<ioctl>(2) décrites plus bas (ou ces opérations échouent avec "
+"l'erreur B<EINVAL>.)"
+
+#. type: Plain text
+#: debian-bookworm debian-unstable opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"After a successful B<UFFDIO_API> operation, the application then registers "
+"memory address ranges using the B<UFFDIO_REGISTER> B<ioctl>(2) operation. "
+"After successful completion of a B<UFFDIO_REGISTER> operation, a page fault "
+"occurring in the requested memory range, and satisfying the mode defined at "
+"the registration time, will be forwarded by the kernel to the user-space "
+"application. The application can then use the B<UFFDIO_COPY ,> "
+"B<UFFDIO_ZEROPAGE ,> or B<UFFDIO_CONTINUE> B<ioctl>(2) operations to "
+"resolve the page fault."
+msgstr ""
+"Après le succès d'une opération B<UFFDIO_API>, l'application enregistre "
+"alors les intervalles d'adresses mémoire en utilisant l'opération "
+"d'B<ioctl>(2) B<UFFDIO_REGISTER>. Quand l'opération B<UFFDIO_REGISTER> s'est "
+"achevée avec succès, une erreur de page, se produisant dans l'intervalle de "
+"mémoire requis et satisfaisant au mode défini au moment de l'enregistrement, "
+"sera transmis par le noyau à l'application de l'espace utilisateur. "
+"L'application peut alors utiliser les opérations d'B<ioctl>(2) "
+"B<UFFDIO_COPY>, B<UFFDIO_ZEROPAGE> ou B<UFFDIO_CONTINUE> pour résoudre "
+"l'erreur de page."
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+"struct uffd_msg {\n"
+" __u8 event; /* Type of event */\n"
+" ...\n"
+" union {\n"
+" struct {\n"
+" __u64 flags; /* Flags describing fault */\n"
+" __u64 address; /* Faulting address */\n"
+" union {\n"
+" __u32 ptid; /* Thread ID of the fault */\n"
+" } feat;\n"
+" } pagefault;\n"
+msgstr ""
+"struct uffd_msg {\n"
+" __u8 event; /* Type d'événement */\n"
+" ...\n"
+" union {\n"
+" struct {\n"
+" __u64 flags; /* Attributs décrivant l'erreur */\n"
+" __u64 address; /* Adresse fautive */\n"
+" union {\n"
+" __u32 ptid; /* ID du thread de l'erreur */\n"
+" } feat;\n"
+" } pagefault;\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" struct { /* Since Linux 4.11 */\n"
+" __u32 ufd; /* Userfault file descriptor\n"
+" of the child process */\n"
+" } fork;\n"
+msgstr ""
+" struct { /* Depuis Linux 4.11 */\n"
+" __u32 ufd; /* Descripteur de ficher d'userfault\n"
+" du processus enfant */\n"
+" } fork;\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" struct { /* Since Linux 4.11 */\n"
+" __u64 from; /* Old address of remapped area */\n"
+" __u64 to; /* New address of remapped area */\n"
+" __u64 len; /* Original mapping length */\n"
+" } remap;\n"
+msgstr ""
+" struct { /* Depuis Linux 4.11 */\n"
+" __u64 from; /* Ancienne adresse de la zone remappée */\n"
+" __u64 to; /* Nouvelle adresse de la zone remappée */\n"
+" __u64 len; /* Taille originale du mappage */\n"
+" } remap;\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" struct { /* Since Linux 4.11 */\n"
+" __u64 start; /* Start address of removed area */\n"
+" __u64 end; /* End address of removed area */\n"
+" } remove;\n"
+" ...\n"
+" } arg;\n"
+msgstr ""
+" struct { /* Depuis Linux 4.11 */\n"
+" __u64 start; /* Adresse de début de la zone supprimée */\n"
+" __u64 end; /* Adresse de fin de la zone supprimée */\n"
+" } remove;\n"
+" ...\n"
+" } arg;\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" /* Padding fields omitted */\n"
+"} __packed;\n"
+msgstr ""
+" /* Remplissage des champs omis */\n"
+"} __packed;\n"
+
+#. type: SH
+#: debian-bookworm
+#, no-wrap
+msgid "VERSIONS"
+msgstr "VERSIONS"
+
+#. type: Plain text
+#: debian-bookworm
+msgid "The B<userfaultfd>() system call first appeared in Linux 4.3."
+msgstr ""
+"L'appel système B<userfaultfd>() est apparu pour la première fois dans "
+"Linux 4.3."
+
+#. type: Plain text
+#: debian-bookworm
+msgid ""
+"The support for hugetlbfs and shared memory areas and non-page-fault events "
+"was added in Linux 4.11"
+msgstr ""
+"La prise en charge des zones de mémoire hugetlbfs et partagée et des "
+"événements qui ne sont pas des erreurs de page a été ajoutée dans Linux 4.11"
+
+#. type: Plain text
+#: debian-bookworm
+msgid ""
+"B<userfaultfd>() is Linux-specific and should not be used in programs "
+"intended to be portable."
+msgstr ""
+"B<userfaultfd>() est spécifique à Linux et ne devrait pas être employé dans "
+"des programmes destinés à être portables."
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+"$ B<./userfaultfd_demo 3>\n"
+"Address returned by mmap() = 0x7fd30106c000\n"
+msgstr ""
+"$ B<./userfaultfd_demo 3>\n"
+"Address returned by mmap() = 0x7fd30106c000\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+"fault_handler_thread():\n"
+" poll() returns: nready = 1; POLLIN = 1; POLLERR = 0\n"
+" UFFD_EVENT_PAGEFAULT event: flags = 0; address = 7fd30106c00f\n"
+" (uffdio_copy.copy returned 4096)\n"
+"Read address 0x7fd30106c00f in main(): A\n"
+"Read address 0x7fd30106c40f in main(): A\n"
+"Read address 0x7fd30106c80f in main(): A\n"
+"Read address 0x7fd30106cc0f in main(): A\n"
+msgstr ""
+"fault_handler_thread():\n"
+" poll() returns: nready = 1; POLLIN = 1; POLLERR = 0\n"
+" UFFD_EVENT_PAGEFAULT event: flags = 0; address = 7fd30106c00f\n"
+" (uffdio_copy.copy returned 4096)\n"
+"Read address 0x7fd30106c00f in main(): A\n"
+"Read address 0x7fd30106c40f in main(): A\n"
+"Read address 0x7fd30106c80f in main(): A\n"
+"Read address 0x7fd30106cc0f in main(): A\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+"fault_handler_thread():\n"
+" poll() returns: nready = 1; POLLIN = 1; POLLERR = 0\n"
+" UFFD_EVENT_PAGEFAULT event: flags = 0; address = 7fd30106d00f\n"
+" (uffdio_copy.copy returned 4096)\n"
+"Read address 0x7fd30106d00f in main(): B\n"
+"Read address 0x7fd30106d40f in main(): B\n"
+"Read address 0x7fd30106d80f in main(): B\n"
+"Read address 0x7fd30106dc0f in main(): B\n"
+msgstr ""
+"fault_handler_thread():\n"
+" poll() returns: nready = 1; POLLIN = 1; POLLERR = 0\n"
+" UFFD_EVENT_PAGEFAULT event: flags = 0; address = 7fd30106d00f\n"
+" (uffdio_copy.copy returned 4096)\n"
+"Read address 0x7fd30106d00f in main(): B\n"
+"Read address 0x7fd30106d40f in main(): B\n"
+"Read address 0x7fd30106d80f in main(): B\n"
+"Read address 0x7fd30106dc0f in main(): B\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+"fault_handler_thread():\n"
+" poll() returns: nready = 1; POLLIN = 1; POLLERR = 0\n"
+" UFFD_EVENT_PAGEFAULT event: flags = 0; address = 7fd30106e00f\n"
+" (uffdio_copy.copy returned 4096)\n"
+"Read address 0x7fd30106e00f in main(): C\n"
+"Read address 0x7fd30106e40f in main(): C\n"
+"Read address 0x7fd30106e80f in main(): C\n"
+"Read address 0x7fd30106ec0f in main(): C\n"
+msgstr ""
+"fault_handler_thread():\n"
+" poll() returns: nready = 1; POLLIN = 1; POLLERR = 0\n"
+" UFFD_EVENT_PAGEFAULT event: flags = 0; address = 7fd30106e00f\n"
+" (uffdio_copy.copy returned 4096)\n"
+"Read address 0x7fd30106e00f in main(): C\n"
+"Read address 0x7fd30106e40f in main(): C\n"
+"Read address 0x7fd30106e80f in main(): C\n"
+"Read address 0x7fd30106ec0f in main(): C\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid "/* userfaultfd_demo.c\n"
+msgstr "/* userfaultfd_demo.c\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" Licensed under the GNU General Public License version 2 or later.\n"
+"*/\n"
+"#define _GNU_SOURCE\n"
+"#include E<lt>err.hE<gt>\n"
+"#include E<lt>errno.hE<gt>\n"
+"#include E<lt>fcntl.hE<gt>\n"
+"#include E<lt>inttypes.hE<gt>\n"
+"#include E<lt>linux/userfaultfd.hE<gt>\n"
+"#include E<lt>poll.hE<gt>\n"
+"#include E<lt>pthread.hE<gt>\n"
+"#include E<lt>stdio.hE<gt>\n"
+"#include E<lt>stdlib.hE<gt>\n"
+"#include E<lt>string.hE<gt>\n"
+"#include E<lt>sys/ioctl.hE<gt>\n"
+"#include E<lt>sys/mman.hE<gt>\n"
+"#include E<lt>sys/syscall.hE<gt>\n"
+"#include E<lt>unistd.hE<gt>\n"
+msgstr ""
+" Licensed under the GNU General Public License version 2 or later.\n"
+"*/\n"
+"#define _GNU_SOURCE\n"
+"#include E<lt>err.hE<gt>\n"
+"#include E<lt>errno.hE<gt>\n"
+"#include E<lt>fcntl.hE<gt>\n"
+"#include E<lt>inttypes.hE<gt>\n"
+"#include E<lt>linux/userfaultfd.hE<gt>\n"
+"#include E<lt>poll.hE<gt>\n"
+"#include E<lt>pthread.hE<gt>\n"
+"#include E<lt>stdio.hE<gt>\n"
+"#include E<lt>stdlib.hE<gt>\n"
+"#include E<lt>string.hE<gt>\n"
+"#include E<lt>sys/ioctl.hE<gt>\n"
+"#include E<lt>sys/mman.hE<gt>\n"
+"#include E<lt>sys/syscall.hE<gt>\n"
+"#include E<lt>unistd.hE<gt>\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid "static int page_size;\n"
+msgstr "static int page_size;\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+"static void *\n"
+"fault_handler_thread(void *arg)\n"
+"{\n"
+" int nready;\n"
+" long uffd; /* userfaultfd file descriptor */\n"
+" ssize_t nread;\n"
+" struct pollfd pollfd;\n"
+" struct uffdio_copy uffdio_copy;\n"
+msgstr ""
+"static void *\n"
+"fault_handler_thread(void *arg)\n"
+"{\n"
+" int nready;\n"
+" long uffd; /* descripteur du fichier userfaultfd */\n"
+" ssize_t nread;\n"
+" struct pollfd pollfd;\n"
+" struct uffdio_copy uffdio_copy;\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" static int fault_cnt = 0; /* Number of faults so far handled */\n"
+" static char *page = NULL;\n"
+" static struct uffd_msg msg; /* Data read from userfaultfd */\n"
+msgstr ""
+" static int fault_cnt = 0; /* Nombres d'erreurs déjà gérées */\n"
+" static char *page = NULL;\n"
+" static struct uffd_msg msg; /* Données lues à partir de userfaultfd */\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid " uffd = (long) arg;\n"
+msgstr " uffd = (long) arg;\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid " /* Create a page that will be copied into the faulting region. */\n"
+msgstr " /* Créer une page qui sera copiée dans la région en erreur. */\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" if (page == NULL) {\n"
+" page = mmap(NULL, page_size, PROT_READ | PROT_WRITE,\n"
+" MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n"
+" if (page == MAP_FAILED)\n"
+" err(EXIT_FAILURE, \"mmap\");\n"
+" }\n"
+msgstr ""
+" if (page == NULL) {\n"
+" page = mmap(NULL, page_size, PROT_READ | PROT_WRITE,\n"
+" MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n"
+" if (page == MAP_FAILED)\n"
+" err(EXIT_FAILURE, \"mmap\");\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" /* Loop, handling incoming events on the userfaultfd\n"
+" file descriptor. */\n"
+msgstr ""
+" /* Boucle gérant les événements entrants sur le descripteur\n"
+" de fichier userfaultfd. */\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid " for (;;) {\n"
+msgstr " for (;;) {\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid " /* See what poll() tells us about the userfaultfd. */\n"
+msgstr " /* Voir ce que poll() nous dit sur l'userfaultfd. */\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" pollfd.fd = uffd;\n"
+" pollfd.events = POLLIN;\n"
+" nready = poll(&pollfd, 1, -1);\n"
+" if (nready == -1)\n"
+" err(EXIT_FAILURE, \"poll\");\n"
+msgstr ""
+" pollfd.fd = uffd;\n"
+" pollfd.events = POLLIN;\n"
+" nready = poll(&pollfd, 1, -1);\n"
+" if (nready == -1)\n"
+" err(EXIT_FAILURE, \"poll\");\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" printf(\"\\enfault_handler_thread():\\en\");\n"
+" printf(\" poll() returns: nready = %d; \"\n"
+" \"POLLIN = %d; POLLERR = %d\\en\", nready,\n"
+" (pollfd.revents & POLLIN) != 0,\n"
+" (pollfd.revents & POLLERR) != 0);\n"
+msgstr ""
+" printf(\"\\enfault_handler_thread():\\en\");\n"
+" printf(\" poll() returns: nready = %d; \"\n"
+" \"POLLIN = %d; POLLERR = %d\\en\", nready,\n"
+" (pollfd.revents & POLLIN) != 0,\n"
+" (pollfd.revents & POLLERR) != 0);\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid " /* Read an event from the userfaultfd. */\n"
+msgstr " /* Lire un événement à partir de l'userfaultfd. */\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" nread = read(uffd, &msg, sizeof(msg));\n"
+" if (nread == 0) {\n"
+" printf(\"EOF on userfaultfd!\\en\");\n"
+" exit(EXIT_FAILURE);\n"
+" }\n"
+msgstr ""
+" nread = read(uffd, &msg, sizeof(msg));\n"
+" if (nread == 0) {\n"
+" printf(\"EOF on userfaultfd!\\en\");\n"
+" exit(EXIT_FAILURE);\n"
+" }\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" if (nread == -1)\n"
+" err(EXIT_FAILURE, \"read\");\n"
+msgstr ""
+" if (nread == -1)\n"
+" err(EXIT_FAILURE, \"read\");\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid " /* We expect only one kind of event; verify that assumption. */\n"
+msgstr ""
+" /* Un seul type d'événement est attendu ; il faut vérifier\n"
+" cette supposition. */\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" if (msg.event != UFFD_EVENT_PAGEFAULT) {\n"
+" fprintf(stderr, \"Unexpected event on userfaultfd\\en\");\n"
+" exit(EXIT_FAILURE);\n"
+" }\n"
+msgstr ""
+" if (msg.event != UFFD_EVENT_PAGEFAULT) {\n"
+" fprintf(stderr, \"Unexpected event on userfaultfd\\en\");\n"
+" exit(EXIT_FAILURE);\n"
+" }\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid " /* Display info about the page-fault event. */\n"
+msgstr " /* Afficher une information sur l'événement erreur de page. */\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" printf(\" UFFD_EVENT_PAGEFAULT event: \");\n"
+" printf(\"flags = %\"PRIx64\"; \", msg.arg.pagefault.flags);\n"
+" printf(\"address = %\"PRIx64\"\\en\", msg.arg.pagefault.address);\n"
+msgstr ""
+" printf(\" UFFD_EVENT_PAGEFAULT event: \");\n"
+" printf(\"flags = %\"PRIx64\"; \", msg.arg.pagefault.flags);\n"
+" printf(\"address = %\"PRIx64\"\\en\", msg.arg.pagefault.address);\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" /* Copy the page pointed to by \\[aq]page\\[aq] into the faulting\n"
+" region. Vary the contents that are copied in, so that it\n"
+" is more obvious that each fault is handled separately. */\n"
+msgstr ""
+" /* Copier la page sur laquelle pointe la « page » dans la région\n"
+" fautive. Varier le contenu copié, afin qu'il soit plus\n"
+" évident que chaque erreur soit gérée séparément. */\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" memset(page, \\[aq]A\\[aq] + fault_cnt % 20, page_size);\n"
+" fault_cnt++;\n"
+msgstr ""
+" memset(page, \\[aq]A\\[aq] + fault_cnt % 20, page_size);\n"
+" fault_cnt++;\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid " uffdio_copy.src = (unsigned long) page;\n"
+msgstr " uffdio_copy.src = (unsigned long) page;\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" /* We need to handle page faults in units of pages(!).\n"
+" So, round faulting address down to page boundary. */\n"
+msgstr ""
+" /* Il est nécessaire de gérer les erreurs de page en\n"
+" unités de pages(!). Aussi, il faut arrondir les\n"
+" adresses fautives à la limite de page. */\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" uffdio_copy.dst = (unsigned long) msg.arg.pagefault.address &\n"
+" \\[ti](page_size - 1);\n"
+" uffdio_copy.len = page_size;\n"
+" uffdio_copy.mode = 0;\n"
+" uffdio_copy.copy = 0;\n"
+" if (ioctl(uffd, UFFDIO_COPY, &uffdio_copy) == -1)\n"
+" err(EXIT_FAILURE, \"ioctl-UFFDIO_COPY\");\n"
+msgstr ""
+" uffdio_copy.dst = (unsigned long) msg.arg.pagefault.address &\n"
+" \\[ti](page_size - 1);\n"
+" uffdio_copy.len = page_size;\n"
+" uffdio_copy.mode = 0;\n"
+" uffdio_copy.copy = 0;\n"
+" if (ioctl(uffd, UFFDIO_COPY, &uffdio_copy) == -1)\n"
+" err(EXIT_FAILURE, \"ioctl-UFFDIO_COPY\");\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" printf(\" (uffdio_copy.copy returned %\"PRId64\")\\en\",\n"
+" uffdio_copy.copy);\n"
+" }\n"
+"}\n"
+msgstr ""
+" printf(\" (uffdio_copy.copy returned %\"PRId64\")\\en\",\n"
+" uffdio_copy.copy);\n"
+" }\n"
+"}\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+"int\n"
+"main(int argc, char *argv[])\n"
+"{\n"
+" int s;\n"
+" char c;\n"
+" char *addr; /* Start of region handled by userfaultfd */\n"
+" long uffd; /* userfaultfd file descriptor */\n"
+" size_t len, l; /* Length of region handled by userfaultfd */\n"
+" pthread_t thr; /* ID of thread that handles page faults */\n"
+" struct uffdio_api uffdio_api;\n"
+" struct uffdio_register uffdio_register;\n"
+msgstr ""
+"int\n"
+"main(int argc, char *argv[])\n"
+"{\n"
+" int s;\n"
+" char c;\n"
+" char *addr; /* Début de la région gérée par userfaultfd */\n"
+" long uffd; /* Descripteur de fichier userfaultfd */\n"
+" size_t len, l; /* Taille de la région gérée par userfaultfd */\n"
+" pthread_t thr; /* ID du thread qui gère les erreurs de page */\n"
+" struct uffdio_api uffdio_api;\n"
+" struct uffdio_register uffdio_register;\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" if (argc != 2) {\n"
+" fprintf(stderr, \"Usage: %s num-pages\\en\", argv[0]);\n"
+" exit(EXIT_FAILURE);\n"
+" }\n"
+msgstr ""
+" if (argc != 2) {\n"
+" fprintf(stderr, \"Utilisation : %s num-pages\\en\", argv[0]);\n"
+" exit(EXIT_FAILURE);\n"
+" }\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" page_size = sysconf(_SC_PAGE_SIZE);\n"
+" len = strtoull(argv[1], NULL, 0) * page_size;\n"
+msgstr ""
+" page_size = sysconf(_SC_PAGE_SIZE);\n"
+" len = strtoull(argv[1], NULL, 0) * page_size;\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid " /* Create and enable userfaultfd object. */\n"
+msgstr " /* Créer et activer un objet userfaultfd. */\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" uffd = syscall(SYS_userfaultfd, O_CLOEXEC | O_NONBLOCK);\n"
+" if (uffd == -1)\n"
+" err(EXIT_FAILURE, \"userfaultfd\");\n"
+msgstr ""
+" uffd = syscall(SYS_userfaultfd, O_CLOEXEC | O_NONBLOCK);\n"
+" if (uffd == -1)\n"
+" err(EXIT_FAILURE, \"userfaultfd\");\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" uffdio_api.api = UFFD_API;\n"
+" uffdio_api.features = 0;\n"
+" if (ioctl(uffd, UFFDIO_API, &uffdio_api) == -1)\n"
+" err(EXIT_FAILURE, \"ioctl-UFFDIO_API\");\n"
+msgstr ""
+" uffdio_api.api = UFFD_API;\n"
+" uffdio_api.features = 0;\n"
+" if (ioctl(uffd, UFFDIO_API, &uffdio_api) == -1)\n"
+" err(EXIT_FAILURE, \"ioctl-UFFDIO_API\");\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" /* Create a private anonymous mapping. The memory will be\n"
+" demand-zero paged--that is, not yet allocated. When we\n"
+" actually touch the memory, it will be allocated via\n"
+" the userfaultfd. */\n"
+msgstr ""
+" /* Créer un mappage anonyme privé. La mémoire sera paginée\n"
+" avec aucune demande — c'est-à-dire, sans être encore\n"
+" allouée. Quand la mémoire sera réellement utilisée,\n"
+" elle sera allouée au moyen de l'userfaultfd. */\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" addr = mmap(NULL, len, PROT_READ | PROT_WRITE,\n"
+" MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n"
+" if (addr == MAP_FAILED)\n"
+" err(EXIT_FAILURE, \"mmap\");\n"
+msgstr ""
+" addr = mmap(NULL, len, PROT_READ | PROT_WRITE,\n"
+" MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n"
+" if (addr == MAP_FAILED)\n"
+" err(EXIT_FAILURE, \"mmap\");\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid " printf(\"Address returned by mmap() = %p\\en\", addr);\n"
+msgstr " printf(\"Address returned by mmap() = %p\\en\", addr);\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" /* Register the memory range of the mapping we just created for\n"
+" handling by the userfaultfd object. In mode, we request to track\n"
+" missing pages (i.e., pages that have not yet been faulted in). */\n"
+msgstr ""
+" /* Enregistrer l'intervalle de mémoire du mappage qui vient d'être\n"
+" créé pour le traitement par l'objet userfaultfd. Dans mode,\n"
+" suivre les pages manquantes (c'est-à-dire, les pages qui ne sont\n"
+" pas encore fautives). */\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" uffdio_register.range.start = (unsigned long) addr;\n"
+" uffdio_register.range.len = len;\n"
+" uffdio_register.mode = UFFDIO_REGISTER_MODE_MISSING;\n"
+" if (ioctl(uffd, UFFDIO_REGISTER, &uffdio_register) == -1)\n"
+" err(EXIT_FAILURE, \"ioctl-UFFDIO_REGISTER\");\n"
+msgstr ""
+" uffdio_register.range.start = (unsigned long) addr;\n"
+" uffdio_register.range.len = len;\n"
+" uffdio_register.mode = UFFDIO_REGISTER_MODE_MISSING;\n"
+" if (ioctl(uffd, UFFDIO_REGISTER, &uffdio_register) == -1)\n"
+" err(EXIT_FAILURE, \"ioctl-UFFDIO_REGISTER\");\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid " /* Create a thread that will process the userfaultfd events. */\n"
+msgstr " /* Créer un thread qui traitera les événements userfaultfd. */\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" s = pthread_create(&thr, NULL, fault_handler_thread, (void *) uffd);\n"
+" if (s != 0) {\n"
+" errc(EXIT_FAILURE, s, \"pthread_create\");\n"
+" }\n"
+msgstr ""
+" s = pthread_create(&thr, NULL, fault_handler_thread, (void *) uffd);\n"
+" if (s != 0) {\n"
+" errc(EXIT_FAILURE, s, \"pthread_create\");\n"
+" }\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" /* Main thread now touches memory in the mapping, touching\n"
+" locations 1024 bytes apart. This will trigger userfaultfd\n"
+" events for all pages in the region. */\n"
+msgstr ""
+" /* Le thread principal utilise la mémoire dans le mappage,\n"
+" utilisant des emplacements séparés de 1024 octets. Cela va\n"
+" déclencher des événements userfaultfd pour toutes les pages\n"
+" dans la région. */\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" l = 0xf; /* Ensure that faulting address is not on a page\n"
+" boundary, in order to test that we correctly\n"
+" handle that case in fault_handling_thread(). */\n"
+" while (l E<lt> len) {\n"
+" c = addr[l];\n"
+" printf(\"Read address %p in %s(): \", addr + l, __func__);\n"
+" printf(\"%c\\en\", c);\n"
+" l += 1024;\n"
+" usleep(100000); /* Slow things down a little */\n"
+" }\n"
+msgstr ""
+" l = 0xf; /* Assurer que l'adresse fautive n'est pas sur une\n"
+" limite de page afin de vérifier que ce cas est\n"
+" correctement géré dans le fault_handling_thread(). */\n"
+" while (l E<lt> len) {\n"
+" c = addr[l];\n"
+" printf(\"Read address %p in %s(): \", addr + l, __func__);\n"
+" printf(\"%c\\en\", c);\n"
+" l += 1024;\n"
+" usleep(100000); /* Ralentir un peu le traitement */\n"
+" }\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" exit(EXIT_SUCCESS);\n"
+"}\n"
+msgstr ""
+" exit(EXIT_SUCCESS);\n"
+"}\n"
+
+#. type: TH
+#: debian-unstable opensuse-tumbleweed
+#, no-wrap
+msgid "2023-05-03"
+msgstr "3 mai 2023"
+
+#. type: TH
+#: debian-unstable opensuse-tumbleweed
+#, no-wrap
+msgid "Linux man-pages 6.05.01"
+msgstr "Pages du manuel de Linux 6.05.01"
+
+#. type: Plain text
+#: debian-unstable opensuse-tumbleweed
+#, no-wrap
+msgid ""
+"/* userfaultfd_demo.c\n"
+"\\&\n"
+" Licensed under the GNU General Public License version 2 or later.\n"
+"*/\n"
+"#define _GNU_SOURCE\n"
+"#include E<lt>err.hE<gt>\n"
+"#include E<lt>errno.hE<gt>\n"
+"#include E<lt>fcntl.hE<gt>\n"
+"#include E<lt>inttypes.hE<gt>\n"
+"#include E<lt>linux/userfaultfd.hE<gt>\n"
+"#include E<lt>poll.hE<gt>\n"
+"#include E<lt>pthread.hE<gt>\n"
+"#include E<lt>stdio.hE<gt>\n"
+"#include E<lt>stdlib.hE<gt>\n"
+"#include E<lt>string.hE<gt>\n"
+"#include E<lt>sys/ioctl.hE<gt>\n"
+"#include E<lt>sys/mman.hE<gt>\n"
+"#include E<lt>sys/syscall.hE<gt>\n"
+"#include E<lt>unistd.hE<gt>\n"
+"\\&\n"
+"static int page_size;\n"
+"\\&\n"
+"static void *\n"
+"fault_handler_thread(void *arg)\n"
+"{\n"
+" int nready;\n"
+" long uffd; /* userfaultfd file descriptor */\n"
+" ssize_t nread;\n"
+" struct pollfd pollfd;\n"
+" struct uffdio_copy uffdio_copy;\n"
+"\\&\n"
+" static int fault_cnt = 0; /* Number of faults so far handled */\n"
+" static char *page = NULL;\n"
+" static struct uffd_msg msg; /* Data read from userfaultfd */\n"
+"\\&\n"
+" uffd = (long) arg;\n"
+"\\&\n"
+" /* Create a page that will be copied into the faulting region. */\n"
+"\\&\n"
+" if (page == NULL) {\n"
+" page = mmap(NULL, page_size, PROT_READ | PROT_WRITE,\n"
+" MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n"
+" if (page == MAP_FAILED)\n"
+" err(EXIT_FAILURE, \"mmap\");\n"
+" }\n"
+"\\&\n"
+" /* Loop, handling incoming events on the userfaultfd\n"
+" file descriptor. */\n"
+"\\&\n"
+" for (;;) {\n"
+"\\&\n"
+" /* See what poll() tells us about the userfaultfd. */\n"
+"\\&\n"
+" pollfd.fd = uffd;\n"
+" pollfd.events = POLLIN;\n"
+" nready = poll(&pollfd, 1, -1);\n"
+" if (nready == -1)\n"
+" err(EXIT_FAILURE, \"poll\");\n"
+"\\&\n"
+" printf(\"\\enfault_handler_thread():\\en\");\n"
+" printf(\" poll() returns: nready = %d; \"\n"
+" \"POLLIN = %d; POLLERR = %d\\en\", nready,\n"
+" (pollfd.revents & POLLIN) != 0,\n"
+" (pollfd.revents & POLLERR) != 0);\n"
+"\\&\n"
+" /* Read an event from the userfaultfd. */\n"
+"\\&\n"
+" nread = read(uffd, &msg, sizeof(msg));\n"
+" if (nread == 0) {\n"
+" printf(\"EOF on userfaultfd!\\en\");\n"
+" exit(EXIT_FAILURE);\n"
+" }\n"
+"\\&\n"
+" if (nread == -1)\n"
+" err(EXIT_FAILURE, \"read\");\n"
+"\\&\n"
+" /* We expect only one kind of event; verify that assumption. */\n"
+"\\&\n"
+" if (msg.event != UFFD_EVENT_PAGEFAULT) {\n"
+" fprintf(stderr, \"Unexpected event on userfaultfd\\en\");\n"
+" exit(EXIT_FAILURE);\n"
+" }\n"
+"\\&\n"
+" /* Display info about the page-fault event. */\n"
+"\\&\n"
+" printf(\" UFFD_EVENT_PAGEFAULT event: \");\n"
+" printf(\"flags = %\"PRIx64\"; \", msg.arg.pagefault.flags);\n"
+" printf(\"address = %\"PRIx64\"\\en\", msg.arg.pagefault.address);\n"
+"\\&\n"
+" /* Copy the page pointed to by \\[aq]page\\[aq] into the faulting\n"
+" region. Vary the contents that are copied in, so that it\n"
+" is more obvious that each fault is handled separately. */\n"
+"\\&\n"
+" memset(page, \\[aq]A\\[aq] + fault_cnt % 20, page_size);\n"
+" fault_cnt++;\n"
+"\\&\n"
+" uffdio_copy.src = (unsigned long) page;\n"
+"\\&\n"
+" /* We need to handle page faults in units of pages(!).\n"
+" So, round faulting address down to page boundary. */\n"
+"\\&\n"
+" uffdio_copy.dst = (unsigned long) msg.arg.pagefault.address &\n"
+" \\[ti](page_size - 1);\n"
+" uffdio_copy.len = page_size;\n"
+" uffdio_copy.mode = 0;\n"
+" uffdio_copy.copy = 0;\n"
+" if (ioctl(uffd, UFFDIO_COPY, &uffdio_copy) == -1)\n"
+" err(EXIT_FAILURE, \"ioctl-UFFDIO_COPY\");\n"
+"\\&\n"
+" printf(\" (uffdio_copy.copy returned %\"PRId64\")\\en\",\n"
+" uffdio_copy.copy);\n"
+" }\n"
+"}\n"
+"\\&\n"
+"int\n"
+"main(int argc, char *argv[])\n"
+"{\n"
+" int s;\n"
+" char c;\n"
+" char *addr; /* Start of region handled by userfaultfd */\n"
+" long uffd; /* userfaultfd file descriptor */\n"
+" size_t len, l; /* Length of region handled by userfaultfd */\n"
+" pthread_t thr; /* ID of thread that handles page faults */\n"
+" struct uffdio_api uffdio_api;\n"
+" struct uffdio_register uffdio_register;\n"
+"\\&\n"
+" if (argc != 2) {\n"
+" fprintf(stderr, \"Usage: %s num-pages\\en\", argv[0]);\n"
+" exit(EXIT_FAILURE);\n"
+" }\n"
+"\\&\n"
+" page_size = sysconf(_SC_PAGE_SIZE);\n"
+" len = strtoull(argv[1], NULL, 0) * page_size;\n"
+"\\&\n"
+" /* Create and enable userfaultfd object. */\n"
+"\\&\n"
+" uffd = syscall(SYS_userfaultfd, O_CLOEXEC | O_NONBLOCK);\n"
+" if (uffd == -1)\n"
+" err(EXIT_FAILURE, \"userfaultfd\");\n"
+"\\&\n"
+" uffdio_api.api = UFFD_API;\n"
+" uffdio_api.features = 0;\n"
+" if (ioctl(uffd, UFFDIO_API, &uffdio_api) == -1)\n"
+" err(EXIT_FAILURE, \"ioctl-UFFDIO_API\");\n"
+"\\&\n"
+" /* Create a private anonymous mapping. The memory will be\n"
+" demand-zero paged--that is, not yet allocated. When we\n"
+" actually touch the memory, it will be allocated via\n"
+" the userfaultfd. */\n"
+"\\&\n"
+" addr = mmap(NULL, len, PROT_READ | PROT_WRITE,\n"
+" MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n"
+" if (addr == MAP_FAILED)\n"
+" err(EXIT_FAILURE, \"mmap\");\n"
+"\\&\n"
+" printf(\"Address returned by mmap() = %p\\en\", addr);\n"
+"\\&\n"
+" /* Register the memory range of the mapping we just created for\n"
+" handling by the userfaultfd object. In mode, we request to track\n"
+" missing pages (i.e., pages that have not yet been faulted in). */\n"
+"\\&\n"
+" uffdio_register.range.start = (unsigned long) addr;\n"
+" uffdio_register.range.len = len;\n"
+" uffdio_register.mode = UFFDIO_REGISTER_MODE_MISSING;\n"
+" if (ioctl(uffd, UFFDIO_REGISTER, &uffdio_register) == -1)\n"
+" err(EXIT_FAILURE, \"ioctl-UFFDIO_REGISTER\");\n"
+"\\&\n"
+" /* Create a thread that will process the userfaultfd events. */\n"
+"\\&\n"
+" s = pthread_create(&thr, NULL, fault_handler_thread, (void *) uffd);\n"
+" if (s != 0) {\n"
+" errc(EXIT_FAILURE, s, \"pthread_create\");\n"
+" }\n"
+"\\&\n"
+" /* Main thread now touches memory in the mapping, touching\n"
+" locations 1024 bytes apart. This will trigger userfaultfd\n"
+" events for all pages in the region. */\n"
+"\\&\n"
+" l = 0xf; /* Ensure that faulting address is not on a page\n"
+" boundary, in order to test that we correctly\n"
+" handle that case in fault_handling_thread(). */\n"
+" while (l E<lt> len) {\n"
+" c = addr[l];\n"
+" printf(\"Read address %p in %s(): \", addr + l, __func__);\n"
+" printf(\"%c\\en\", c);\n"
+" l += 1024;\n"
+" usleep(100000); /* Slow things down a little */\n"
+" }\n"
+"\\&\n"
+" exit(EXIT_SUCCESS);\n"
+"}\n"
+msgstr ""
+"/* userfaultfd_demo.c\n"
+"\\&\n"
+" Licensed under the GNU General Public License version 2 or later.\n"
+"*/\n"
+"#define _GNU_SOURCE\n"
+"#include E<lt>err.hE<gt>\n"
+"#include E<lt>errno.hE<gt>\n"
+"#include E<lt>fcntl.hE<gt>\n"
+"#include E<lt>inttypes.hE<gt>\n"
+"#include E<lt>linux/userfaultfd.hE<gt>\n"
+"#include E<lt>poll.hE<gt>\n"
+"#include E<lt>pthread.hE<gt>\n"
+"#include E<lt>stdio.hE<gt>\n"
+"#include E<lt>stdlib.hE<gt>\n"
+"#include E<lt>string.hE<gt>\n"
+"#include E<lt>sys/ioctl.hE<gt>\n"
+"#include E<lt>sys/mman.hE<gt>\n"
+"#include E<lt>sys/syscall.hE<gt>\n"
+"#include E<lt>unistd.hE<gt>\n"
+"\\&\n"
+"static int page_size;\n"
+"\\&\n"
+"static void *\n"
+"fault_handler_thread(void *arg)\n"
+"{\n"
+" int nready;\n"
+" long uffd; /* descripteur du fichier userfaultfd */\n"
+" ssize_t nread;\n"
+" struct pollfd pollfd;\n"
+" struct uffdio_copy uffdio_copy;\n"
+"\\&\n"
+" static int fault_cnt = 0; /* Nombres d'erreurs déjà gérées */\n"
+" static char *page = NULL;\n"
+" static struct uffd_msg msg; /* Données lues à partir de userfaultfd */\n"
+"\\&\n"
+" uffd = (long) arg;\n"
+"\\&\n"
+" /* Créer une page qui sera copiée dans la région en erreur. */\n"
+"\\&\n"
+" if (page == NULL) {\n"
+" page = mmap(NULL, page_size, PROT_READ | PROT_WRITE,\n"
+" MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n"
+" if (page == MAP_FAILED)\n"
+" err(EXIT_FAILURE, \"mmap\");\n"
+" }\n"
+"\\&\n"
+" /* Boucle gérant les événements entrants sur le descripteur\n"
+" de fichier userfaultfd. */\n"
+"\\&\n"
+" for (;;) {\n"
+"\\&\n"
+" /* Voir ce que poll() nous dit sur l'userfaultfd. */\n"
+"\\&\n"
+" pollfd.fd = uffd;\n"
+" pollfd.events = POLLIN;\n"
+" nready = poll(&pollfd, 1, -1);\n"
+" if (nready == -1)\n"
+" err(EXIT_FAILURE, \"poll\");\n"
+"\\&\n"
+" printf(\"\\enfault_handler_thread():\\en\");\n"
+" printf(\" poll() returns: nready = %d; \"\n"
+" \"POLLIN = %d; POLLERR = %d\\en\", nready,\n"
+" (pollfd.revents & POLLIN) != 0,\n"
+" (pollfd.revents & POLLERR) != 0);\n"
+"\\&\n"
+" /* Lire un événement à partir de l'userfaultfd. */\n"
+"\\&\n"
+" nread = read(uffd, &msg, sizeof(msg));\n"
+" if (nread == 0) {\n"
+" printf(\"EOF on userfaultfd!\\en\");\n"
+" exit(EXIT_FAILURE);\n"
+" }\n"
+"\\&\n"
+" if (nread == -1)\n"
+" err(EXIT_FAILURE, \"read\");\n"
+"\\&\n"
+" /* Un seul type d'événement est attendu ; il faut vérifier\n"
+" cette supposition. */\n"
+"\\&\n"
+" if (msg.event != UFFD_EVENT_PAGEFAULT) {\n"
+" fprintf(stderr, \"Unexpected event on userfaultfd\\en\");\n"
+" exit(EXIT_FAILURE);\n"
+" }\n"
+"\\&\n"
+" /* Afficher une information sur l'événement erreur de page. */\n"
+"\\&\n"
+" printf(\" UFFD_EVENT_PAGEFAULT event: \");\n"
+" printf(\"flags = %\"PRIx64\"; \", msg.arg.pagefault.flags);\n"
+" printf(\"address = %\"PRIx64\"\\en\", msg.arg.pagefault.address);\n"
+"\\&\n"
+" /* Copier la page sur laquelle pointe la « page » dans la région\n"
+" fautive. Varier le contenu copié, afin qu'il soit plus\n"
+" évident que chaque erreur soit gérée séparément. */\n"
+"\\&\n"
+" memset(page, \\[aq]A\\[aq] + fault_cnt % 20, page_size);\n"
+" fault_cnt++;\n"
+"\\&\n"
+" uffdio_copy.src = (unsigned long) page;\n"
+"\\&\n"
+" /* Il est nécessaire de gérer les erreurs de page en\n"
+" unités de pages(!). Aussi, il faut arrondir les\n"
+" adresses fautives à la limite de page. */\n"
+"\\&\n"
+" uffdio_copy.dst = (unsigned long) msg.arg.pagefault.address &\n"
+" \\[ti](page_size - 1);\n"
+" uffdio_copy.len = page_size;\n"
+" uffdio_copy.mode = 0;\n"
+" uffdio_copy.copy = 0;\n"
+" if (ioctl(uffd, UFFDIO_COPY, &uffdio_copy) == -1)\n"
+" err(EXIT_FAILURE, \"ioctl-UFFDIO_COPY\");\n"
+"\\&\n"
+" printf(\" (uffdio_copy.copy returned %\"PRId64\")\\en\",\n"
+" uffdio_copy.copy);\n"
+" }\n"
+"}\n"
+"\\&\n"
+"int\n"
+"main(int argc, char *argv[])\n"
+"{\n"
+" int s;\n"
+" char c;\n"
+" char *addr; /* Début de la région gérée par userfaultfd */\n"
+" long uffd; /* Descripteur de fichier userfaultfd */\n"
+" size_t len, l; /* Taille de la région gérée par userfaultfd */\n"
+" pthread_t thr; /* ID du thread qui gère les erreurs de page */\n"
+" struct uffdio_api uffdio_api;\n"
+" struct uffdio_register uffdio_register;\n"
+"\\&\n"
+" if (argc != 2) {\n"
+" fprintf(stderr, \"Utilisation : %s num-pages\\en\", argv[0]);\n"
+" exit(EXIT_FAILURE);\n"
+" }\n"
+"\\&\n"
+" page_size = sysconf(_SC_PAGE_SIZE);\n"
+" len = strtoull(argv[1], NULL, 0) * page_size;\n"
+"\\&\n"
+" /* Créer et activer un objet userfaultfd. */\n"
+"\\&\n"
+" uffd = syscall(SYS_userfaultfd, O_CLOEXEC | O_NONBLOCK);\n"
+" if (uffd == -1)\n"
+" err(EXIT_FAILURE, \"userfaultfd\");\n"
+"\\&\n"
+" uffdio_api.api = UFFD_API;\n"
+" uffdio_api.features = 0;\n"
+" if (ioctl(uffd, UFFDIO_API, &uffdio_api) == -1)\n"
+" err(EXIT_FAILURE, \"ioctl-UFFDIO_API\");\n"
+"\\&\n"
+" /* Créer un mappage anonyme privé. La mémoire sera paginée\n"
+" avec aucune demande — c'est-à-dire, sans être encore\n"
+" allouée. Quand la mémoire sera réellement utilisée,\n"
+" elle sera allouée au moyen de l'userfaultfd. */\n"
+"\\&\n"
+" addr = mmap(NULL, len, PROT_READ | PROT_WRITE,\n"
+" MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n"
+" if (addr == MAP_FAILED)\n"
+" err(EXIT_FAILURE, \"mmap\");\n"
+"\\&\n"
+" printf(\"Address returned by mmap() = %p\\en\", addr);\n"
+"\\&\n"
+" /* Enregistrer l'intervalle de mémoire du mappage qui vient d'être\n"
+" créé pour le traitement par l'objet userfaultfd. Dans mode,\n"
+" suivre les pages manquantes (c'est-à-dire, les pages qui ne sont\n"
+" pas encore fautives). */\n"
+"\\&\n"
+" uffdio_register.range.start = (unsigned long) addr;\n"
+" uffdio_register.range.len = len;\n"
+" uffdio_register.mode = UFFDIO_REGISTER_MODE_MISSING;\n"
+" if (ioctl(uffd, UFFDIO_REGISTER, &uffdio_register) == -1)\n"
+" err(EXIT_FAILURE, \"ioctl-UFFDIO_REGISTER\");\n"
+"\\&\n"
+" /* Créer un thread qui traitera les événements userfaultfd. */\n"
+"\\&\n"
+" s = pthread_create(&thr, NULL, fault_handler_thread, (void *) uffd);\n"
+" if (s != 0) {\n"
+" errc(EXIT_FAILURE, s, \"pthread_create\");\n"
+" }\n"
+"\\&\n"
+" /* Le thread principal utilise la mémoire dans le mappage,\n"
+" utilisant des emplacements séparés de 1024 octets. Cela va\n"
+" déclencher des événements userfaultfd pour toutes les pages\n"
+" dans la région. */\n"
+"\\&\n"
+" l = 0xf; /* Assurer que l'adresse fautive n'est pas sur une\n"
+" limite de page afin de vérifier que ce cas est\n"
+" correctement géré dans le fault_handling_thread(). */\n"
+" while (l E<lt> len) {\n"
+" c = addr[l];\n"
+" printf(\"Read address %p in %s(): \", addr + l, __func__);\n"
+" printf(\"%c\\en\", c);\n"
+" l += 1024;\n"
+" usleep(100000); /* Ralentir un peu le traitement */\n"
+" }\n"
+"\\&\n"
+" exit(EXIT_SUCCESS);\n"
+"}\n"
+
+#. type: TH
+#: opensuse-leap-15-6
+#, no-wrap
+msgid "2023-03-30"
+msgstr "30 mars 2023"
+
+#. type: TH
+#: opensuse-leap-15-6
+#, no-wrap
+msgid "Linux man-pages 6.04"
+msgstr "Pages du manuel de Linux 6.04"