Commit c443faca authored by Adrian Reber's avatar Adrian Reber Committed by Andrei Vagin

criu: uffd runtime detection

Now that userfaultfd/lazy-pages support is enable all the time, this
adds runtime detection of userfaultfd. On a system without the
userfaultfd syscall following is printed:

uffd daemon:

(00.000004) Error (uffd.c:176): lazy-pages: Runtime detection of userfaultfd failed on this system.
(00.000024) Error (uffd.c:177): lazy-pages: Processes cannot be lazy-restored on this system.

or criu restore

(00.457047)   6858: Error (uffd.c:176): lazy-pages: Runtime detection of userfaultfd failed on this system.
(00.457049)   6858: Error (uffd.c:177): lazy-pages: Processes cannot be lazy-restored on this system.
Signed-off-by: 's avatarAdrian Reber <areber@redhat.com>
Acked-by: 's avatarMike Rapoport <rppt@linux.vnet.ibm.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent f68e5a6b
...@@ -160,10 +160,33 @@ out: ...@@ -160,10 +160,33 @@ out:
return ret; return ret;
} }
/* Runtime detection if userfaultfd can be used */
static int check_for_uffd()
{
int uffd;
uffd = syscall(SYS_userfaultfd, 0);
/*
* uffd == -1 is probably enough to not use lazy-restore
* on this system. Additionally checking for ENOSYS
* makes sure it is actually not implemented.
*/
if ((uffd == -1) && (errno == ENOSYS)) {
pr_err("Runtime detection of userfaultfd failed on this system.\n");
pr_err("Processes cannot be lazy-restored on this system.\n");
return -1;
}
close(uffd);
return 0;
}
/* This function is used by 'criu restore --lazy-pages' */ /* This function is used by 'criu restore --lazy-pages' */
int setup_uffd(struct task_restore_args *task_args, int pid) int setup_uffd(struct task_restore_args *task_args, int pid)
{ {
struct uffdio_api uffdio_api; struct uffdio_api uffdio_api;
if (check_for_uffd())
return -1;
/* /*
* Open userfaulfd FD which is passed to the restorer blob and * Open userfaulfd FD which is passed to the restorer blob and
* to a second process handling the userfaultfd page faults. * to a second process handling the userfaultfd page faults.
...@@ -810,6 +833,9 @@ int cr_lazy_pages() ...@@ -810,6 +833,9 @@ int cr_lazy_pages()
int epollfd; int epollfd;
int ret; int ret;
if (check_for_uffd())
return -1;
if (!opts.addr) { if (!opts.addr) {
pr_info("Please specify a file name for the unix domain socket\n"); pr_info("Please specify a file name for the unix domain socket\n");
pr_info("used to communicate between the lazy-pages server\n"); pr_info("used to communicate between the lazy-pages server\n");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment