Message ID | 20180308195811.24894-9-dgilbert@redhat.com |
---|---|
State | New |
Headers | show |
Series | postcopy+vhost-user/shared ram | expand |
On Thu, Mar 08, 2018 at 07:57:50PM +0000, Dr. David Alan Gilbert (git) wrote: > From: "Dr. David Alan Gilbert" <dgilbert@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 <dgilbert@redhat.com> Reviewed-by: Peter Xu <peterx@redhat.com>
On Thu, Mar 8, 2018 at 8:57 PM, Dr. David Alan Gilbert (git) <dgilbert@redhat.com> wrote: > From: "Dr. David Alan Gilbert" <dgilbert@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 <dgilbert@redhat.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> > --- > contrib/libvhost-user/libvhost-user.c | 45 +++++++++++++++++++++++++++++++---- > contrib/libvhost-user/libvhost-user.h | 3 +++ > 2 files changed, 44 insertions(+), 4 deletions(-) > > diff --git a/contrib/libvhost-user/libvhost-user.c b/contrib/libvhost-user/libvhost-user.c > index eb0ab9338c..0b563fc5ae 100644 > --- a/contrib/libvhost-user/libvhost-user.c > +++ b/contrib/libvhost-user/libvhost-user.c > @@ -26,9 +26,20 @@ > #include <sys/socket.h> > #include <sys/eventfd.h> > #include <sys/mman.h> > +#include "qemu/compiler.h" > + > +#if defined(__linux__) > +#include <sys/syscall.h> > +#include <fcntl.h> > +#include <sys/ioctl.h> > #include <linux/vhost.h> > > -#include "qemu/compiler.h" > +#ifdef __NR_userfaultfd > +#include <linux/userfaultfd.h> > +#endif > + > +#endif > + > #include "qemu/atomic.h" > > #include "libvhost-user.h" > @@ -888,11 +899,37 @@ vu_set_config(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 > - */ > + dev->postcopy_ufd = -1; > +#ifdef UFFDIO_API > + 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); > +#endif > + > + if (dev->postcopy_ufd == -1) { > + vu_panic(dev, "Userfaultfd not available: %s", strerror(errno)); > + goto out; > + } > + > +#ifdef UFFDIO_API > + 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 */ > +#endif > + > +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 00d78a8810..074b7860f6 100644 > --- a/contrib/libvhost-user/libvhost-user.h > +++ b/contrib/libvhost-user/libvhost-user.h > @@ -282,6 +282,9 @@ struct VuDev { > * re-initialize */ > vu_panic_cb panic; > const VuDevIface *iface; > + > + /* Postcopy data */ > + int postcopy_ufd; > }; > > typedef struct VuVirtqElement { > -- > 2.14.3 > >
diff --git a/contrib/libvhost-user/libvhost-user.c b/contrib/libvhost-user/libvhost-user.c index eb0ab9338c..0b563fc5ae 100644 --- a/contrib/libvhost-user/libvhost-user.c +++ b/contrib/libvhost-user/libvhost-user.c @@ -26,9 +26,20 @@ #include <sys/socket.h> #include <sys/eventfd.h> #include <sys/mman.h> +#include "qemu/compiler.h" + +#if defined(__linux__) +#include <sys/syscall.h> +#include <fcntl.h> +#include <sys/ioctl.h> #include <linux/vhost.h> -#include "qemu/compiler.h" +#ifdef __NR_userfaultfd +#include <linux/userfaultfd.h> +#endif + +#endif + #include "qemu/atomic.h" #include "libvhost-user.h" @@ -888,11 +899,37 @@ vu_set_config(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 - */ + dev->postcopy_ufd = -1; +#ifdef UFFDIO_API + 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); +#endif + + if (dev->postcopy_ufd == -1) { + vu_panic(dev, "Userfaultfd not available: %s", strerror(errno)); + goto out; + } + +#ifdef UFFDIO_API + 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 */ +#endif + +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 00d78a8810..074b7860f6 100644 --- a/contrib/libvhost-user/libvhost-user.h +++ b/contrib/libvhost-user/libvhost-user.h @@ -282,6 +282,9 @@ struct VuDev { * re-initialize */ vu_panic_cb panic; const VuDevIface *iface; + + /* Postcopy data */ + int postcopy_ufd; }; typedef struct VuVirtqElement {