vhost: register new regions with userfaultfd
authorMaxime Coquelin <maxime.coquelin@redhat.com>
Fri, 12 Oct 2018 12:40:41 +0000 (14:40 +0200)
committerFerruh Yigit <ferruh.yigit@intel.com>
Thu, 18 Oct 2018 08:24:39 +0000 (10:24 +0200)
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
lib/librte_vhost/vhost_user.c

index 0515892..91c301a 100644 (file)
@@ -965,6 +965,32 @@ vhost_user_set_mem_table(struct virtio_net **pdev, struct VhostUserMsg *msg,
                        mmap_size,
                        alignment,
                        mmap_offset);
+
+               if (dev->postcopy_listening) {
+#ifdef RTE_LIBRTE_VHOST_POSTCOPY
+                       struct uffdio_register reg_struct;
+
+                       reg_struct.range.start = (uint64_t)(uintptr_t)mmap_addr;
+                       reg_struct.range.len = mmap_size;
+                       reg_struct.mode = UFFDIO_REGISTER_MODE_MISSING;
+
+                       if (ioctl(dev->postcopy_ufd, UFFDIO_REGISTER,
+                                               &reg_struct)) {
+                               RTE_LOG(ERR, VHOST_CONFIG,
+                                       "Failed to register ufd for region %d: (ufd = %d) %s\n",
+                                       i, dev->postcopy_ufd,
+                                       strerror(errno));
+                               goto err_mmap;
+                       }
+                       RTE_LOG(INFO, VHOST_CONFIG,
+                               "\t userfaultfd registered for range : %llx - %llx\n",
+                               reg_struct.range.start,
+                               reg_struct.range.start +
+                               reg_struct.range.len - 1);
+#else
+                       goto err_mmap;
+#endif
+               }
        }
 
        for (i = 0; i < dev->nr_vring; i++) {