diff options
Diffstat (limited to 'po/fr/man2/userfaultfd.2.po')
-rw-r--r-- | po/fr/man2/userfaultfd.2.po | 688 |
1 files changed, 55 insertions, 633 deletions
diff --git a/po/fr/man2/userfaultfd.2.po b/po/fr/man2/userfaultfd.2.po index fb13e3bf..79aa4d87 100644 --- a/po/fr/man2/userfaultfd.2.po +++ b/po/fr/man2/userfaultfd.2.po @@ -18,9 +18,9 @@ # 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" +"Project-Id-Version: manpages-l10n 4.22.0\n" +"POT-Creation-Date: 2024-06-01 06:33+0200\n" +"PO-Revision-Date: 2024-05-09 08:56+0200\n" "Last-Translator: Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>\n" "Language-Team: French <debian-l10n-french@lists.debian.org>\n" "Language: fr\n" @@ -28,7 +28,7 @@ msgstr "" "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" +"X-Generator: Lokalize 22.12.3\n" #. type: TH #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide @@ -38,16 +38,16 @@ msgid "userfaultfd" msgstr "userfaultfd" #. type: TH -#: archlinux fedora-40 fedora-rawhide mageia-cauldron +#: archlinux debian-unstable opensuse-tumbleweed #, no-wrap -msgid "2024-02-12" -msgstr "12 février 2024" +msgid "2024-05-02" +msgstr "2 mai 2024" #. type: TH -#: archlinux fedora-40 fedora-rawhide mageia-cauldron +#: archlinux debian-unstable #, no-wrap -msgid "Linux man-pages 6.06" -msgstr "Pages du manuel de Linux 6.06" +msgid "Linux man-pages 6.8" +msgstr "Pages du manuel de Linux 6.8" #. type: SH #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide @@ -456,7 +456,7 @@ msgstr "" #. 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 +#. .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 @@ -516,7 +516,7 @@ msgstr "" #. 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 +#. .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 @@ -562,16 +562,8 @@ 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)." +#: archlinux debian-unstable fedora-40 fedora-rawhide mageia-cauldron +#: 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. " @@ -583,24 +575,16 @@ msgid "" 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>.)" +"B<ioctl>(2). Cette opération permet une connexion en deux étapes entre le " +"noyau et l'espace utilisateur pour déterminer quelle version de l'API et " +"quelles fonctions sont prises en charge par le noyau. et ensuite pour " +"activer les fonctions voulues par l'espace utilisateur. 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." +#: archlinux debian-unstable fedora-40 fedora-rawhide mageia-cauldron +#: 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. " @@ -617,9 +601,9 @@ msgstr "" "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." +"L'application peut alors utiliser diverses opérations d'B<ioctl>(2) " +"(parexemple, 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 @@ -1701,200 +1685,9 @@ 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" +#: archlinux debian-unstable fedora-40 fedora-rawhide mageia-cauldron +#: opensuse-tumbleweed +#, no-wrap msgid "" "/* userfaultfd_demo.c\n" "\\&\n" @@ -2237,6 +2030,15 @@ msgstr "" " if (uffd == -1)\n" " err(EXIT_FAILURE, \"userfaultfd\");\n" "\\&\n" +" /* NOTE : Une connexion de fonction en deux étapes est inutile ici,\n" +" dans la mesure où l'exemple n'a besoin d'aucune fonction\n" +" particulière.\n" +"\\&\n" +" Les programmes qui *agissent* doivent appeler UFFDIO_API deux fois :\n" +" une fois avec « features = 0 » pour détecter les fonctions prises en\n" +" charge par ce noyau, puis avec le sous-ensemble de fonctions que le\n" +" programme veut vraiment activer. */\n" +"\\&\n" " uffdio_api.api = UFFD_API;\n" " uffdio_api.features = 0;\n" " if (ioctl(uffd, UFFDIO_API, &uffdio_api) == -1)\n" @@ -2330,7 +2132,7 @@ 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 +#: debian-bookworm opensuse-leap-15-6 msgid "" "After the userfaultfd object is created with B<userfaultfd>(), the " "application must enable it using the B<UFFDIO_API> B<ioctl>(2) operation. " @@ -2348,7 +2150,7 @@ msgstr "" "l'erreur B<EINVAL>.)" #. type: Plain text -#: debian-bookworm debian-unstable opensuse-leap-15-6 opensuse-tumbleweed +#: debian-bookworm opensuse-leap-15-6 msgid "" "After a successful B<UFFDIO_API> operation, the application then registers " "memory address ranges using the B<UFFDIO_REGISTER> B<ioctl>(2) operation. " @@ -3093,408 +2895,22 @@ msgstr "" "}\n" #. type: TH -#: debian-unstable opensuse-tumbleweed +#: fedora-40 fedora-rawhide mageia-cauldron #, no-wrap -msgid "2023-05-03" -msgstr "3 mai 2023" +msgid "2024-02-12" +msgstr "12 février 2024" #. type: TH -#: debian-unstable opensuse-tumbleweed +#: fedora-40 mageia-cauldron #, no-wrap -msgid "Linux man-pages 6.05.01" -msgstr "Pages du manuel de Linux 6.05.01" +msgid "Linux man-pages 6.06" +msgstr "Pages du manuel de Linux 6.06" -#. type: Plain text -#: debian-unstable opensuse-tumbleweed +#. type: TH +#: fedora-rawhide #, 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" +msgid "Linux man-pages 6.7" +msgstr "Pages du manuel de Linux 6.7" #. type: TH #: opensuse-leap-15-6 @@ -3507,3 +2923,9 @@ msgstr "30 mars 2023" #, no-wrap msgid "Linux man-pages 6.04" msgstr "Pages du manuel de Linux 6.04" + +#. type: TH +#: opensuse-tumbleweed +#, no-wrap +msgid "Linux man-pages (unreleased)" +msgstr "Pages du manuel de Linux (non publiées)" |