[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [RFC 10/29] vhub: Open userfaultfd
From: |
Dr. David Alan Gilbert |
Subject: |
Re: [Qemu-devel] [RFC 10/29] vhub: Open userfaultfd |
Date: |
Wed, 26 Jul 2017 18:12:22 +0100 |
User-agent: |
Mutt/1.8.3 (2017-05-23) |
* Maxime Coquelin (address@hidden) wrote:
>
>
> On 06/28/2017 09:00 PM, Dr. David Alan Gilbert (git) wrote:
> > From: "Dr. David Alan Gilbert" <address@hidden>
> >
> > 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 <address@hidden>
> > ---
> > contrib/libvhost-user/libvhost-user.c | 24 +++++++++++++++++++++---
> > contrib/libvhost-user/libvhost-user.h | 3 +++
> > 2 files changed, 24 insertions(+), 3 deletions(-)
> >
> > diff --git a/contrib/libvhost-user/libvhost-user.c
> > b/contrib/libvhost-user/libvhost-user.c
> > index e3a32755cf..62e97f6b84 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"
> > @@ -774,11 +775,28 @@ 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));
> > + return false;
>
> I think we may want to reply something even in case of error.
>
> Indeed, if something goes wrong on backend side, Qemu will remain
> blocked waiting for the reply.
Fixed.
> > + }
> > + 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);
> > + return false;
> Ditto
Fixed.
Thanks,
Dave
> > + }
> > + /* TODO: Stash feature flags somewhere */
> > + /* 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 8bb35582ea..3e65a962da 100644
> > --- a/contrib/libvhost-user/libvhost-user.h
> > +++ b/contrib/libvhost-user/libvhost-user.h
> > @@ -231,6 +231,9 @@ struct VuDev {
> > * re-initialize */
> > vu_panic_cb panic;
> > const VuDevIface *iface;
> > +
> > + /* Postcopy data */
> > + int postcopy_ufd;
> > };
> > typedef struct VuVirtqElement {
> >
--
Dr. David Alan Gilbert / address@hidden / Manchester, UK