From patchwork Fri Jun 5 02:48:47 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Huawei Xie X-Patchwork-Id: 5152 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 C2BE3C328; Fri, 5 Jun 2015 04:48:58 +0200 (CEST) Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by dpdk.org (Postfix) with ESMTP id AC5575A0F for ; Fri, 5 Jun 2015 04:48:56 +0200 (CEST) Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga101.jf.intel.com with ESMTP; 04 Jun 2015 19:48:56 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.13,555,1427785200"; d="scan'208";a="503041030" Received: from shvmail01.sh.intel.com ([10.239.29.42]) by FMSMGA003.fm.intel.com with ESMTP; 04 Jun 2015 19:48:54 -0700 Received: from shecgisg003.sh.intel.com (shecgisg003.sh.intel.com [10.239.29.90]) by shvmail01.sh.intel.com with ESMTP id t552mqof015111; Fri, 5 Jun 2015 10:48:52 +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 t552moeW032295; Fri, 5 Jun 2015 10:48:52 +0800 Received: (from hxie5@localhost) by shecgisg003.sh.intel.com (8.13.6/8.13.6/Submit) id t552mok5032291; Fri, 5 Jun 2015 10:48:50 +0800 From: Huawei Xie To: dev@dpdk.org Date: Fri, 5 Jun 2015 10:48:47 +0800 Message-Id: <1433472527-32261-1-git-send-email-huawei.xie@intel.com> X-Mailer: git-send-email 1.7.4.1 Subject: [dpdk-dev] [PATCH v2] vhost: provide vhost API to unregister vhost unix domain socket 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" rte_vhost_driver_unregister will remove the listenfd from event list, and then close it. Signed-off-by: Huawei Xie Signed-off-by: Peng Sun --- lib/librte_vhost/rte_virtio_net.h | 3 ++ lib/librte_vhost/vhost_cuse/vhost-net-cdev.c | 9 ++++ lib/librte_vhost/vhost_user/vhost-net-user.c | 68 +++++++++++++++++++++++----- lib/librte_vhost/vhost_user/vhost-net-user.h | 2 +- 4 files changed, 69 insertions(+), 13 deletions(-) diff --git a/lib/librte_vhost/rte_virtio_net.h b/lib/librte_vhost/rte_virtio_net.h index 5d38185..5630fbc 100644 --- a/lib/librte_vhost/rte_virtio_net.h +++ b/lib/librte_vhost/rte_virtio_net.h @@ -188,6 +188,9 @@ int rte_vhost_enable_guest_notification(struct virtio_net *dev, uint16_t queue_i /* Register vhost driver. dev_name could be different for multiple instance support. */ int rte_vhost_driver_register(const char *dev_name); +/* Unregister vhost driver. This is only meaningful to vhost user. */ +int rte_vhost_driver_unregister(const char *dev_name); + /* Register callbacks. */ int rte_vhost_driver_callback_register(struct virtio_net_device_ops const * const); /* Start vhost driver session blocking loop. */ diff --git a/lib/librte_vhost/vhost_cuse/vhost-net-cdev.c b/lib/librte_vhost/vhost_cuse/vhost-net-cdev.c index 6b68abf..1ae7c49 100644 --- a/lib/librte_vhost/vhost_cuse/vhost-net-cdev.c +++ b/lib/librte_vhost/vhost_cuse/vhost-net-cdev.c @@ -405,6 +405,15 @@ rte_vhost_driver_register(const char *dev_name) } /** + * An empty function for unregister + */ +int +rte_vhost_driver_unregister(const char *dev_name __rte_unused) +{ + return 0; +} + +/** * The CUSE session is launched allowing the application to receive open, * release and ioctl calls. */ diff --git a/lib/librte_vhost/vhost_user/vhost-net-user.c b/lib/librte_vhost/vhost_user/vhost-net-user.c index 31f1215..87a4711 100644 --- a/lib/librte_vhost/vhost_user/vhost-net-user.c +++ b/lib/librte_vhost/vhost_user/vhost-net-user.c @@ -66,6 +66,8 @@ struct connfd_ctx { struct _vhost_server { struct vhost_server *server[MAX_VHOST_SERVER]; struct fdset fdset; + int vserver_cnt; + pthread_mutex_t server_mutex; }; static struct _vhost_server g_vhost_server = { @@ -74,10 +76,10 @@ static struct _vhost_server g_vhost_server = { .fd_mutex = PTHREAD_MUTEX_INITIALIZER, .num = 0 }, + .vserver_cnt = 0, + .server_mutex = PTHREAD_MUTEX_INITIALIZER, }; -static int vserver_idx; - static const char *vhost_message_str[VHOST_USER_MAX] = { [VHOST_USER_NONE] = "VHOST_USER_NONE", [VHOST_USER_GET_FEATURES] = "VHOST_USER_GET_FEATURES", @@ -427,7 +429,6 @@ vserver_message_handler(int connfd, void *dat, int *remove) } } - /** * Creates and initialise the vhost server. */ @@ -436,34 +437,77 @@ rte_vhost_driver_register(const char *path) { struct vhost_server *vserver; - if (vserver_idx == 0) + pthread_mutex_lock(&g_vhost_server.server_mutex); + if (ops == NULL) ops = get_virtio_net_callbacks(); - if (vserver_idx == MAX_VHOST_SERVER) + + if (g_vhost_server.vserver_cnt == MAX_VHOST_SERVER) { + RTE_LOG(ERR, VHOST_CONFIG, + "error: the number of servers reaches maximum\n"); + pthread_mutex_unlock(&g_vhost_server.server_mutex); return -1; + } vserver = calloc(sizeof(struct vhost_server), 1); - if (vserver == NULL) + if (vserver == NULL) { + pthread_mutex_unlock(&g_vhost_server.server_mutex); return -1; - - unlink(path); + } vserver->listenfd = uds_socket(path); if (vserver->listenfd < 0) { free(vserver); + pthread_mutex_unlock(&g_vhost_server.server_mutex); return -1; } - vserver->path = path; + + vserver->path = strdup(path); fdset_add(&g_vhost_server.fdset, vserver->listenfd, - vserver_new_vq_conn, NULL, - vserver); + vserver_new_vq_conn, NULL, vserver); - g_vhost_server.server[vserver_idx++] = vserver; + g_vhost_server.server[g_vhost_server.vserver_cnt++] = vserver; + pthread_mutex_unlock(&g_vhost_server.server_mutex); return 0; } +/** + * Unregister the specified vhost server + */ +int +rte_vhost_driver_unregister(const char *path) +{ + int i; + int count; + + pthread_mutex_lock(&g_vhost_server.server_mutex); + + for (i = 0; i < g_vhost_server.vserver_cnt; i++) { + if (!strcmp(g_vhost_server.server[i]->path, path)) { + fdset_del(&g_vhost_server.fdset, + g_vhost_server.server[i]->listenfd); + + close(g_vhost_server.server[i]->listenfd); + free(g_vhost_server.server[i]->path); + free(g_vhost_server.server[i]); + + unlink(path); + + count = --g_vhost_server.vserver_cnt; + g_vhost_server.server[i] = g_vhost_server.server[count]; + g_vhost_server.server[count] = NULL; + pthread_mutex_unlock(&g_vhost_server.server_mutex); + + return 0; + } + } + pthread_mutex_unlock(&g_vhost_server.server_mutex); + + return -1; +} + int rte_vhost_driver_session_start(void) { diff --git a/lib/librte_vhost/vhost_user/vhost-net-user.h b/lib/librte_vhost/vhost_user/vhost-net-user.h index 1b6be6c..2e72f3c 100644 --- a/lib/librte_vhost/vhost_user/vhost-net-user.h +++ b/lib/librte_vhost/vhost_user/vhost-net-user.h @@ -41,7 +41,7 @@ #include "fd_man.h" struct vhost_server { - const char *path; /**< The path the uds is bind to. */ + char *path; /**< The path the uds is bind to. */ int listenfd; /**< The listener sockfd. */ };