Setting up the log memory region involves mapping/unmapping guest
memory. This is a transport-specific operation. Other transports may use
other means of accessing the guest memory log. Therefore, the mmap/unmap
operations, that are related to the memory log, are moved to
trans_af_unix.c. A new set_log_base() transport operation is introduced.

Signed-off-by: Nikos Dragazis <ndraga...@arrikto.com>
---
 lib/librte_vhost/trans_af_unix.c | 41 ++++++++++++++++++++++++++++++++++++++++
 lib/librte_vhost/vhost.h         | 13 +++++++++++++
 lib/librte_vhost/vhost_user.c    | 27 +-------------------------
 3 files changed, 55 insertions(+), 26 deletions(-)

diff --git a/lib/librte_vhost/trans_af_unix.c b/lib/librte_vhost/trans_af_unix.c
index 522823f..35b1c45 100644
--- a/lib/librte_vhost/trans_af_unix.c
+++ b/lib/librte_vhost/trans_af_unix.c
@@ -763,6 +763,11 @@ af_unix_cleanup_device(struct virtio_net *dev, int destroy 
__rte_unused)
        struct vhost_user_connection *conn =
                container_of(dev, struct vhost_user_connection, device);
 
+       if (dev->log_addr) {
+               munmap((void *)(uintptr_t)dev->log_addr, dev->log_size);
+               dev->log_addr = 0;
+       }
+
        if (conn->slave_req_fd >= 0) {
                close(conn->slave_req_fd);
                conn->slave_req_fd = -1;
@@ -950,6 +955,41 @@ af_unix_unmap_mem_regions(struct virtio_net *dev)
        }
 }
 
+static int
+af_unix_set_log_base(struct virtio_net *dev, const struct VhostUserMsg *msg)
+{
+       int fd = msg->fds[0];
+       uint64_t size, off;
+       void *addr;
+
+       size = msg->payload.log.mmap_size;
+       off  = msg->payload.log.mmap_offset;
+
+       /*
+        * mmap from 0 to workaround a hugepage mmap bug: mmap will
+        * fail when offset is not page size aligned.
+        */
+       addr = mmap(0, size + off, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+       close(fd);
+       if (addr == MAP_FAILED) {
+               RTE_LOG(ERR, VHOST_CONFIG, "mmap log base failed!\n");
+               return -1;
+       }
+
+       /*
+        * Free previously mapped log memory on occasionally
+        * multiple VHOST_USER_SET_LOG_BASE.
+        */
+       if (dev->log_addr) {
+               munmap((void *)(uintptr_t)dev->log_addr, dev->log_size);
+       }
+       dev->log_addr = (uint64_t)(uintptr_t)addr;
+       dev->log_base = dev->log_addr + off;
+       dev->log_size = size;
+
+       return 0;
+}
+
 const struct vhost_transport_ops af_unix_trans_ops = {
        .socket_size = sizeof(struct af_unix_socket),
        .device_size = sizeof(struct vhost_user_connection),
@@ -964,4 +1004,5 @@ const struct vhost_transport_ops af_unix_trans_ops = {
        .set_slave_req_fd = af_unix_set_slave_req_fd,
        .map_mem_regions = af_unix_map_mem_regions,
        .unmap_mem_regions = af_unix_unmap_mem_regions,
+       .set_log_base = af_unix_set_log_base,
 };
diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h
index 28038c6..b15d223 100644
--- a/lib/librte_vhost/vhost.h
+++ b/lib/librte_vhost/vhost.h
@@ -437,6 +437,19 @@ struct vhost_transport_ops {
         *  vhost device
         */
        void (*unmap_mem_regions)(struct virtio_net *dev);
+
+       /**
+        * Setup the log memory region.
+        *
+        * @param dev
+        *  vhost device
+        * @param msg
+        *  message
+        * @return
+        *  0 on success, -1 on failure
+        */
+       int (*set_log_base)(struct virtio_net *dev,
+                           const struct VhostUserMsg *msg);
 };
 
 /** The traditional AF_UNIX vhost-user protocol transport. */
diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c
index ed8dbd8..acb1135 100644
--- a/lib/librte_vhost/vhost_user.c
+++ b/lib/librte_vhost/vhost_user.c
@@ -137,11 +137,6 @@ vhost_backend_cleanup(struct virtio_net *dev)
        free(dev->guest_pages);
        dev->guest_pages = NULL;
 
-       if (dev->log_addr) {
-               munmap((void *)(uintptr_t)dev->log_addr, dev->log_size);
-               dev->log_addr = 0;
-       }
-
        if (dev->postcopy_ufd >= 0) {
                close(dev->postcopy_ufd);
                dev->postcopy_ufd = -1;
@@ -1275,7 +1270,6 @@ vhost_user_set_log_base(struct virtio_net **pdev, struct 
VhostUserMsg *msg,
        struct virtio_net *dev = *pdev;
        int fd = msg->fds[0];
        uint64_t size, off;
-       void *addr;
 
        if (fd < 0) {
                RTE_LOG(ERR, VHOST_CONFIG, "invalid log fd: %d\n", fd);
@@ -1304,27 +1298,8 @@ vhost_user_set_log_base(struct virtio_net **pdev, struct 
VhostUserMsg *msg,
                "log mmap size: %"PRId64", offset: %"PRId64"\n",
                size, off);
 
-       /*
-        * mmap from 0 to workaround a hugepage mmap bug: mmap will
-        * fail when offset is not page size aligned.
-        */
-       addr = mmap(0, size + off, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
-       close(fd);
-       if (addr == MAP_FAILED) {
-               RTE_LOG(ERR, VHOST_CONFIG, "mmap log base failed!\n");
+       if (dev->trans_ops->set_log_base(dev, msg) < 0)
                return RTE_VHOST_MSG_RESULT_ERR;
-       }
-
-       /*
-        * Free previously mapped log memory on occasionally
-        * multiple VHOST_USER_SET_LOG_BASE.
-        */
-       if (dev->log_addr) {
-               munmap((void *)(uintptr_t)dev->log_addr, dev->log_size);
-       }
-       dev->log_addr = (uint64_t)(uintptr_t)addr;
-       dev->log_base = dev->log_addr + off;
-       dev->log_size = size;
 
        /*
         * The spec is not clear about it (yet), but QEMU doesn't expect
-- 
2.7.4

Reply via email to