From: "Dr. David Alan Gilbert" <dgilb...@redhat.com> Open a userfaultfd (on a postcopy_advise) and send it back in the reply to the qemu for it to monitor.
Signed-off-by: Dr. David Alan Gilbert <dgilb...@redhat.com> --- contrib/libvhost-user/libvhost-user.c | 26 +++++++++++++++++++++++--- contrib/libvhost-user/libvhost-user.h | 3 +++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/contrib/libvhost-user/libvhost-user.c b/contrib/libvhost-user/libvhost-user.c index 47884c0a15..f9b5b12b28 100644 --- a/contrib/libvhost-user/libvhost-user.c +++ b/contrib/libvhost-user/libvhost-user.c @@ -15,6 +15,7 @@ #include <qemu/osdep.h> #include <sys/eventfd.h> +#include <sys/syscall.h> #include <linux/vhost.h> #include "qemu/atomic.h" @@ -773,11 +774,30 @@ vu_set_vring_enable_exec(VuDev *dev, VhostUserMsg *vmsg) static bool vu_set_postcopy_advise(VuDev *dev, VhostUserMsg *vmsg) { - /* TODO: Open ufd, pass it back in the request - * TODO: Add addresses - */ + struct uffdio_api api_struct; + + dev->postcopy_ufd = syscall(__NR_userfaultfd, O_CLOEXEC | O_NONBLOCK); + /* TODO: Add addresses */ vmsg->payload.u64 = 0xcafe; vmsg->size = sizeof(vmsg->payload.u64); + + if (dev->postcopy_ufd == -1) { + vu_panic(dev, "Userfaultfd not available: %s", strerror(errno)); + goto out; + } + api_struct.api = UFFD_API; + api_struct.features = 0; + if (ioctl(dev->postcopy_ufd, UFFDIO_API, &api_struct)) { + vu_panic(dev, "Failed UFFDIO_API: %s", strerror(errno)); + close(dev->postcopy_ufd); + dev->postcopy_ufd = -1; + goto out; + } + /* TODO: Stash feature flags somewhere */ +out: + /* Return a ufd to the QEMU */ + vmsg->fd_num = 1; + vmsg->fds[0] = dev->postcopy_ufd; return true; /* = send a reply */ } diff --git a/contrib/libvhost-user/libvhost-user.h b/contrib/libvhost-user/libvhost-user.h index 3987ce643d..3e8efdd919 100644 --- a/contrib/libvhost-user/libvhost-user.h +++ b/contrib/libvhost-user/libvhost-user.h @@ -234,6 +234,9 @@ struct VuDev { * re-initialize */ vu_panic_cb panic; const VuDevIface *iface; + + /* Postcopy data */ + int postcopy_ufd; }; typedef struct VuVirtqElement { -- 2.13.5