From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id 460258053 for ; Wed, 10 Dec 2014 22:40:10 +0100 (CET) Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga102.fm.intel.com with ESMTP; 10 Dec 2014 13:40:05 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.07,553,1413270000"; d="scan'208";a="645688831" Received: from shvmail01.sh.intel.com ([10.239.29.42]) by fmsmga002.fm.intel.com with ESMTP; 10 Dec 2014 13:40:04 -0800 Received: from shecgisg003.sh.intel.com (shecgisg003.sh.intel.com [10.239.29.90]) by shvmail01.sh.intel.com with ESMTP id sBALe246004841; Thu, 11 Dec 2014 05:40:02 +0800 Received: from shecgisg003.sh.intel.com (localhost [127.0.0.1]) by shecgisg003.sh.intel.com (8.13.6/8.13.6/SuSE Linux 0.8) with ESMTP id sBALdxNQ014038; Thu, 11 Dec 2014 05:40:01 +0800 Received: (from hxie5@localhost) by shecgisg003.sh.intel.com (8.13.6/8.13.6/Submit) id sBALdxhH014034; Thu, 11 Dec 2014 05:39:59 +0800 From: Huawei Xie To: dev@dpdk.org Date: Thu, 11 Dec 2014 05:37:57 +0800 Message-Id: <1418247477-13920-13-git-send-email-huawei.xie@intel.com> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1418247477-13920-1-git-send-email-huawei.xie@intel.com> References: <1418247477-13920-1-git-send-email-huawei.xie@intel.com> Cc: haifeng.lin@intel.com Subject: [dpdk-dev] [PATCH RFC v2 12/12] lib/librte_vhost: cleanup when vhost user socket connection is closed 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: Wed, 10 Dec 2014 21:40:11 -0000 close the memory region file descriptor close the kick/callfd vSwitch needs to run endlessly. resource leak is deadly issue. Signed-off-by: Huawei Xie --- lib/librte_vhost/vhost_user/vhost-net-user.c | 7 ++-- lib/librte_vhost/vhost_user/virtio-net-user.c | 59 +++++++++++++++++++-------- lib/librte_vhost/vhost_user/virtio-net-user.h | 1 + 3 files changed, 47 insertions(+), 20 deletions(-) diff --git a/lib/librte_vhost/vhost_user/vhost-net-user.c b/lib/librte_vhost/vhost_user/vhost-net-user.c index 6b9ebd7..35215b4 100644 --- a/lib/librte_vhost/vhost_user/vhost-net-user.c +++ b/lib/librte_vhost/vhost_user/vhost-net-user.c @@ -283,9 +283,9 @@ vserver_message_handler(int connfd, uint64_t dat) RTE_LOG(ERR, VHOST_CONFIG, "vhost read message failed\n"); - /*TODO: cleanup */ close(connfd); fdset_del(&g_vhost_server->fdset, connfd); + user_destroy_device(ctx); ops->destroy_device(ctx); return; @@ -293,9 +293,9 @@ vserver_message_handler(int connfd, uint64_t dat) RTE_LOG(INFO, VHOST_CONFIG, "vhost peer closed\n"); - /*TODO: cleanup */ close(connfd); fdset_del(&g_vhost_server->fdset, connfd); + user_destroy_device(ctx); ops->destroy_device(ctx); return; @@ -304,9 +304,10 @@ vserver_message_handler(int connfd, uint64_t dat) RTE_LOG(ERR, VHOST_CONFIG, "vhost read incorrect message\n"); - /*TODO: cleanup */ close(connfd); fdset_del(&g_vhost_server->fdset, connfd); + user_destroy_device(ctx); + ops->destroy_device(ctx); return; } diff --git a/lib/librte_vhost/vhost_user/virtio-net-user.c b/lib/librte_vhost/vhost_user/virtio-net-user.c index 4e49e9b..75f9f54 100644 --- a/lib/librte_vhost/vhost_user/virtio-net-user.c +++ b/lib/librte_vhost/vhost_user/virtio-net-user.c @@ -65,6 +65,31 @@ get_blk_size(int fd) return (uint64_t)stat.st_blksize; } +static void +free_mem_region(struct virtio_net *dev) +{ + struct orig_region_map *region; + unsigned int idx; + int ret; + uint64_t alignment; + + if (!dev || !dev->mem) + return; + + region = orig_region(dev->mem, dev->mem->nregions); + for (idx = 0; idx < dev->mem->nregions; idx++) { + if (region[idx].mapped_address) { + alignment = region[idx].blksz; + printf("Freeing %p\n", + (void *)(uintptr_t)region[idx].mapped_address); + ret = munmap((void *)RTE_ALIGN_FLOOR(region[idx].mapped_address, alignment), RTE_ALIGN_CEIL(region[idx].mapped_size, alignment)); + printf("munmap ret= %d\n", ret); + printf("close file %d\n", region[idx].fd); + close(region[idx].fd); + } + } +} + int user_set_mem_table(struct vhost_device_ctx ctx, struct VhostUserMsg *pmsg) { @@ -73,28 +98,15 @@ user_set_mem_table(struct vhost_device_ctx ctx, struct VhostUserMsg *pmsg) uint64_t mapped_address, mapped_size, base_address = 0; struct virtio_net *dev; unsigned int idx = 0; + struct orig_region_map *region; struct orig_region_map tmp[VHOST_MEMORY_MAX_NREGIONS] = { [0 ... VHOST_MEMORY_MAX_NREGIONS - 1] = { 0 } }; - struct orig_region_map *region; uint64_t alignment; - int ret; /* unmap old memory regions one by one*/ dev = get_device(ctx); - if (dev->mem) { - region = orig_region(dev->mem, dev->mem->nregions); - for (idx = 0; idx < dev->mem->nregions; idx++) { - if (region[idx].mapped_address) { - alignment = region[idx].blksz; - printf("Freeing %p\n", - (void *)(uintptr_t)region[idx].mapped_address); - ret = munmap((void *)RTE_ALIGN_FLOOR(region[idx].mapped_address, alignment), - RTE_ALIGN_CEIL(region[idx].mapped_size, alignment)); - printf("munmap ret= %d\n", ret); - printf("close file %d\n", region[idx].fd); - close(region[idx].fd); - } - } + if (dev && dev->mem) { + free_mem_region(dev); free(dev->mem); dev->mem = NULL; } @@ -248,7 +260,6 @@ user_set_vring_kick(struct vhost_device_ctx ctx, struct VhostUserMsg *pmsg) if (virtio_is_ready(dev) && !(dev->flags & VIRTIO_DEV_RUNNING)) notify_ops->new_device(dev); - } /* @@ -284,5 +295,19 @@ user_get_vring_base(struct vhost_device_ctx ctx, } return 0; +} + +void +user_destroy_device(struct vhost_device_ctx ctx) +{ + struct virtio_net *dev = get_device(ctx); + + if (dev && (dev->flags & VIRTIO_DEV_RUNNING)) + notify_ops->destroy_device(dev); + if (dev && dev->mem) { + free_mem_region(dev); + free(dev->mem); + dev->mem = NULL; + } } diff --git a/lib/librte_vhost/vhost_user/virtio-net-user.h b/lib/librte_vhost/vhost_user/virtio-net-user.h index 0f6a75a..df24860 100644 --- a/lib/librte_vhost/vhost_user/virtio-net-user.h +++ b/lib/librte_vhost/vhost_user/virtio-net-user.h @@ -45,4 +45,5 @@ void user_set_vring_kick(struct vhost_device_ctx, struct VhostUserMsg *); int user_get_vring_base(struct vhost_device_ctx, struct vhost_vring_state *); +void user_destroy_device(struct vhost_device_ctx); #endif -- 1.8.1.4