From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mailout4.w1.samsung.com (mailout4.w1.samsung.com [210.118.77.14]) by dpdk.org (Postfix) with ESMTP id 1A9F5C5AC for ; Thu, 16 Jun 2016 10:32:31 +0200 (CEST) Received: from eucpsbgm2.samsung.com (unknown [203.254.199.245]) by mailout4.w1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTP id <0O8U00CYPVQ50I30@mailout4.w1.samsung.com> for dev@dpdk.org; Thu, 16 Jun 2016 09:32:29 +0100 (BST) X-AuditID: cbfec7f5-f792a6d000001302-47-5762641d5fb1 Received: from eusync1.samsung.com ( [203.254.199.211]) by eucpsbgm2.samsung.com (EUCPMTA) with SMTP id CC.4B.04866.D1462675; Thu, 16 Jun 2016 09:32:29 +0100 (BST) Received: from imaximets.rnd.samsung.ru ([106.109.129.180]) by eusync1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0O8U00EBDVPLKW40@eusync1.samsung.com>; Thu, 16 Jun 2016 09:32:29 +0100 (BST) From: Ilya Maximets To: dev@dpdk.org, Huawei Xie , Yuanhan Liu Cc: Dyasly Sergey , Heetae Ahn , Vladimir Shilkin , Victor Kaplansky , Ilya Maximets Date: Thu, 16 Jun 2016 11:32:05 +0300 Message-id: <1466065925-2736-3-git-send-email-i.maximets@samsung.com> X-Mailer: git-send-email 2.7.4 In-reply-to: <1466065925-2736-1-git-send-email-i.maximets@samsung.com> References: <1466065925-2736-1-git-send-email-i.maximets@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprJLMWRmVeSWpSXmKPExsVy+t/xy7qyKUnhBu+uKFi8+7SdyWLa59vs Fu0zzzJZXGn/yW4xebaUxeRNKxgtFh84zGxxfcIFVgcOj18LlrJ6LN7zkslj3slAj/f7rrJ5 9G1ZxRjAGsVlk5Kak1mWWqRvl8CVcev3abaC4wIV9+b/ZG5gfMjbxcjJISFgIjFt9llmCFtM 4sK99WxdjFwcQgJLGSVmHDzNAuG0Mkm0rPzGAlLFJqAjcWr1EUYQW0QgQeLI/t+sIEXMAucY JZZcWcMEkhAWsJBYdnciG4jNIqAqcfv8R1YQm1fAVaJ16iRWiHVyEjfPdYKt5hRwk9iy/ztY XAio5t/yJSwTGHkXMDKsYhRNLU0uKE5KzzXSK07MLS7NS9dLzs/dxAgJsK87GJceszrEKMDB qMTDK7A+MVyINbGsuDL3EKMEB7OSCO/GhKRwId6UxMqq1KL8+KLSnNTiQ4zSHCxK4rwzd70P ERJITyxJzU5NLUgtgskycXBKNTDuverbWH/6mE3wCl3Jxoa6lZNWSbiWRprbLFn4Ie3ML+2H MuvtbNmny9b2ex5aXHJb5LI1h9SXEvavG94evCb/6tAfmammKUdXvar8LOYyUSlhV3edXe6t dV3bsvbWSuUtOem8bfXkL6zCa4O/58pXRkhwuZp5rZj4+byfoNTTPR8nhT67+3aiEktxRqKh FnNRcSIAAP5iwywCAAA= Subject: [dpdk-dev] [PATCH 2/2] vhost: unmap log memory on cleanup. X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 16 Jun 2016 08:32:31 -0000 Fixes memory leak on QEMU migration. Fixes: 54f9e32305d4 ("vhost: handle dirty pages logging request") Signed-off-by: Ilya Maximets --- lib/librte_vhost/rte_virtio_net.h | 3 ++- lib/librte_vhost/vhost_user/virtio-net-user.c | 15 +++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/lib/librte_vhost/rte_virtio_net.h b/lib/librte_vhost/rte_virtio_net.h index 600b20b..5ae5d58 100644 --- a/lib/librte_vhost/rte_virtio_net.h +++ b/lib/librte_vhost/rte_virtio_net.h @@ -143,7 +143,8 @@ struct virtio_net { uint64_t log_base; /**< Where dirty pages are logged */ struct ether_addr mac; /**< MAC address */ rte_atomic16_t broadcast_rarp; /**< A flag to tell if we need broadcast rarp packet */ - uint64_t reserved[61]; /**< Reserve some spaces for future extension. */ + uint64_t log_addr; /**< Where log mapped. */ + uint64_t reserved[60]; /**< Reserve some spaces for future extension. */ struct vhost_virtqueue *virtqueue[VHOST_MAX_QUEUE_PAIRS * 2]; /**< Contains all virtqueue information. */ } __rte_cache_aligned; diff --git a/lib/librte_vhost/vhost_user/virtio-net-user.c b/lib/librte_vhost/vhost_user/virtio-net-user.c index a4e20b5..e765ce7 100644 --- a/lib/librte_vhost/vhost_user/virtio-net-user.c +++ b/lib/librte_vhost/vhost_user/virtio-net-user.c @@ -96,6 +96,10 @@ vhost_backend_cleanup(struct virtio_net *dev) free(dev->mem); dev->mem = NULL; } + if (dev->log_addr) { + munmap((void *)(uintptr_t)dev->log_addr, dev->log_size); + dev->log_addr = 0; + } } int @@ -403,8 +407,15 @@ user_set_log_base(struct vhost_device_ctx ctx, return -1; } - /* TODO: unmap on stop */ - dev->log_base = (uint64_t)(uintptr_t)addr + off; + /* + * 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; -- 2.7.4