mirror of
https://github.com/checkpoint-restore/criu
synced 2025-08-29 21:38:16 +00:00
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: Adrian Reber <areber@redhat.com> Acked-by: Mike Rapoport <rppt@linux.vnet.ibm.com> Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
This commit is contained in:
parent
f68e5a6b3d
commit
c443faca3f
26
criu/uffd.c
26
criu/uffd.c
@ -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()
|
|||||||
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");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user