[Qemu-devel] [RFC v2 29/32] vhost-user: Claim support for postcopy

Dr. David Alan Gilbert (git) posted 32 patches 8 years, 5 months ago
There is a newer version of this series
[Qemu-devel] [RFC v2 29/32] vhost-user: Claim support for postcopy
Posted by Dr. David Alan Gilbert (git) 8 years, 5 months ago
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>

Tell QEMU we understand the protocol features needed for postcopy.

Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
---
 contrib/libvhost-user/libvhost-user.c | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/contrib/libvhost-user/libvhost-user.c b/contrib/libvhost-user/libvhost-user.c
index 23bff47649..290748733b 100644
--- a/contrib/libvhost-user/libvhost-user.c
+++ b/contrib/libvhost-user/libvhost-user.c
@@ -144,6 +144,35 @@ vmsg_close_fds(VhostUserMsg *vmsg)
     }
 }
 
+/* A test to see if we have userfault available */
+static bool
+have_userfault(void)
+{
+#if defined(__linux__) && defined(__NR_userfaultfd) &&\
+        defined(UFFD_FEATURE_MISSING_SHMEM) &&\
+        defined(UFFD_FEATURE_MISSING_HUGETLBFS)
+    /* Now test the kernel we're running on really has the features */
+    int ufd = syscall(__NR_userfaultfd, O_CLOEXEC | O_NONBLOCK);
+    struct uffdio_api api_struct;
+    if (ufd < 0) {
+        return false;
+    }
+
+    api_struct.api = UFFD_API;
+    api_struct.features = UFFD_FEATURE_MISSING_SHMEM |
+                          UFFD_FEATURE_MISSING_HUGETLBFS;
+    if (ioctl(ufd, UFFDIO_API, &api_struct)) {
+        close(ufd);
+        return false;
+    }
+    close(ufd);
+    return true;
+
+#else
+    return false;
+#endif
+}
+
 static bool
 vu_message_read(VuDev *dev, int conn_fd, VhostUserMsg *vmsg)
 {
@@ -796,6 +825,10 @@ vu_get_protocol_features_exec(VuDev *dev, VhostUserMsg *vmsg)
 {
     uint64_t features = 1ULL << VHOST_USER_PROTOCOL_F_LOG_SHMFD;
 
+    if (have_userfault()) {
+        features |= 1ULL << VHOST_USER_PROTOCOL_F_PAGEFAULT;
+    }
+
     if (dev->iface->get_protocol_features) {
         features |= dev->iface->get_protocol_features(dev);
     }
-- 
2.13.5


Re: [Qemu-devel] [RFC v2 29/32] vhost-user: Claim support for postcopy
Posted by Marc-André Lureau 8 years, 5 months ago
Hi

Use "libvhost-user: ", so we don't confuse with qemu own vhost-user code.

On Thu, Aug 24, 2017 at 12:27 PM, Dr. David Alan Gilbert (git)
<dgilbert@redhat.com> wrote:
> From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
>
> Tell QEMU we understand the protocol features needed for postcopy.
>
> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> ---
>  contrib/libvhost-user/libvhost-user.c | 33 +++++++++++++++++++++++++++++++++
>  1 file changed, 33 insertions(+)
>
> diff --git a/contrib/libvhost-user/libvhost-user.c b/contrib/libvhost-user/libvhost-user.c
> index 23bff47649..290748733b 100644
> --- a/contrib/libvhost-user/libvhost-user.c
> +++ b/contrib/libvhost-user/libvhost-user.c
> @@ -144,6 +144,35 @@ vmsg_close_fds(VhostUserMsg *vmsg)
>      }
>  }
>
> +/* A test to see if we have userfault available */
> +static bool
> +have_userfault(void)
> +{
> +#if defined(__linux__) && defined(__NR_userfaultfd) &&\
> +        defined(UFFD_FEATURE_MISSING_SHMEM) &&\
> +        defined(UFFD_FEATURE_MISSING_HUGETLBFS)
> +    /* Now test the kernel we're running on really has the features */
> +    int ufd = syscall(__NR_userfaultfd, O_CLOEXEC | O_NONBLOCK);
> +    struct uffdio_api api_struct;
> +    if (ufd < 0) {
> +        return false;
> +    }
> +
> +    api_struct.api = UFFD_API;
> +    api_struct.features = UFFD_FEATURE_MISSING_SHMEM |
> +                          UFFD_FEATURE_MISSING_HUGETLBFS;
> +    if (ioctl(ufd, UFFDIO_API, &api_struct)) {
> +        close(ufd);
> +        return false;
> +    }
> +    close(ufd);
> +    return true;
> +
> +#else
> +    return false;
> +#endif
> +}
> +
>  static bool
>  vu_message_read(VuDev *dev, int conn_fd, VhostUserMsg *vmsg)
>  {
> @@ -796,6 +825,10 @@ vu_get_protocol_features_exec(VuDev *dev, VhostUserMsg *vmsg)
>  {
>      uint64_t features = 1ULL << VHOST_USER_PROTOCOL_F_LOG_SHMFD;
>
> +    if (have_userfault()) {
> +        features |= 1ULL << VHOST_USER_PROTOCOL_F_PAGEFAULT;
> +    }
> +
>      if (dev->iface->get_protocol_features) {
>          features |= dev->iface->get_protocol_features(dev);
>      }
> --
> 2.13.5
>
>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>




-- 
Marc-André Lureau