From patchwork Mon Jan 26 03:20:38 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Huawei Xie X-Patchwork-Id: 2512 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id C933A5A6D; Mon, 26 Jan 2015 04:21:49 +0100 (CET) Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by dpdk.org (Postfix) with ESMTP id A44D15AB9 for ; Mon, 26 Jan 2015 04:21:44 +0100 (CET) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga101.jf.intel.com with ESMTP; 25 Jan 2015 19:21:42 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.09,466,1418112000"; d="scan'208";a="656346936" Received: from shvmail01.sh.intel.com ([10.239.29.42]) by fmsmga001.fm.intel.com with ESMTP; 25 Jan 2015 19:21:40 -0800 Received: from shecgisg003.sh.intel.com (shecgisg003.sh.intel.com [10.239.29.90]) by shvmail01.sh.intel.com with ESMTP id t0Q3LdoL015504; Mon, 26 Jan 2015 11:21:39 +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 t0Q3La98029067; Mon, 26 Jan 2015 11:21:38 +0800 Received: (from hxie5@localhost) by shecgisg003.sh.intel.com (8.13.6/8.13.6/Submit) id t0Q3LaM2029063; Mon, 26 Jan 2015 11:21:36 +0800 From: Huawei Xie To: dev@dpdk.org Date: Mon, 26 Jan 2015 11:20:38 +0800 Message-Id: <1422242440-28948-13-git-send-email-huawei.xie@intel.com> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1422242440-28948-1-git-send-email-huawei.xie@intel.com> References: <1422242440-28948-1-git-send-email-huawei.xie@intel.com> Subject: [dpdk-dev] [RFC PATCH v2 12/14] cleanup when vhost user 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Signed-off-by: Huawei Xie --- lib/librte_vhost/vhost_user/vhost-net-user.c | 4 ++ lib/librte_vhost/vhost_user/virtio-net-user.c | 56 +++++++++++++++++++-------- lib/librte_vhost/vhost_user/virtio-net-user.h | 1 + 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/lib/librte_vhost/vhost_user/vhost-net-user.c b/lib/librte_vhost/vhost_user/vhost-net-user.c index c84fd3b..71e5bbd 100644 --- a/lib/librte_vhost/vhost_user/vhost-net-user.c +++ b/lib/librte_vhost/vhost_user/vhost-net-user.c @@ -289,6 +289,7 @@ vserver_message_handler(int connfd, void *dat) close(connfd); fdset_del(&g_vhost_server->fdset, connfd); + user_destroy_device(ctx); ops->destroy_device(ctx); return; @@ -298,6 +299,7 @@ vserver_message_handler(int connfd, void *dat) close(connfd); fdset_del(&g_vhost_server->fdset, connfd); + user_destroy_device(ctx); ops->destroy_device(ctx); return; @@ -308,6 +310,8 @@ vserver_message_handler(int connfd, void *dat) 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 3481eb8..8e6d580 100644 --- a/lib/librte_vhost/vhost_user/virtio-net-user.c +++ b/lib/librte_vhost/vhost_user/virtio-net-user.c @@ -68,6 +68,30 @@ 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; + 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; + munmap((void *) + RTE_ALIGN_FLOOR( + region[idx].mapped_address, alignment), + RTE_ALIGN_CEIL( + region[idx].mapped_size, alignment)); + close(region[idx].fd); + } + } +} + int user_set_mem_table(struct vhost_device_ctx ctx, struct VhostUserMsg *pmsg) { @@ -80,24 +104,11 @@ user_set_mem_table(struct vhost_device_ctx ctx, struct VhostUserMsg *pmsg) [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; } @@ -258,7 +269,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); - } /* @@ -294,5 +304,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