From patchwork Wed Jun 19 15:14:39 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nikos Dragazis X-Patchwork-Id: 54968 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 0940F1C3FD; Wed, 19 Jun 2019 17:16:22 +0200 (CEST) Received: from mx0.arrikto.com (mx0.arrikto.com [212.71.252.59]) by dpdk.org (Postfix) with ESMTP id 2E5ED1C393 for ; Wed, 19 Jun 2019 17:15:42 +0200 (CEST) Received: from troi.prod.arr (mail.arr [10.99.0.5]) by mx0.arrikto.com (Postfix) with ESMTP id F3E8C182012; Wed, 19 Jun 2019 18:15:41 +0300 (EEST) Received: from localhost.localdomain (unknown [10.89.50.133]) by troi.prod.arr (Postfix) with ESMTPSA id 75D6B2B2; Wed, 19 Jun 2019 18:15:41 +0300 (EEST) From: Nikos Dragazis To: dev@dpdk.org Cc: Maxime Coquelin , Tiwei Bie , Zhihong Wang , Stefan Hajnoczi , Wei Wang , Stojaczyk Dariusz , Vangelis Koukis Date: Wed, 19 Jun 2019 18:14:39 +0300 Message-Id: <1560957293-17294-15-git-send-email-ndragazis@arrikto.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1560957293-17294-1-git-send-email-ndragazis@arrikto.com> References: <1560957293-17294-1-git-send-email-ndragazis@arrikto.com> Subject: [dpdk-dev] [PATCH 14/28] vhost: move setup of the log memory region X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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 --- 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