From patchwork Wed Jun 19 15:14:33 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nikos Dragazis X-Patchwork-Id: 54963 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 C6D401C3CC; Wed, 19 Jun 2019 17:16:01 +0200 (CEST) Received: from mx0.arrikto.com (mx0.arrikto.com [212.71.252.59]) by dpdk.org (Postfix) with ESMTP id A08101C389 for ; Wed, 19 Jun 2019 17:15:39 +0200 (CEST) Received: from troi.prod.arr (mail.arr [10.99.0.5]) by mx0.arrikto.com (Postfix) with ESMTP id 3160B18200D; Wed, 19 Jun 2019 18:15:39 +0300 (EEST) Received: from localhost.localdomain (unknown [10.89.50.133]) by troi.prod.arr (Postfix) with ESMTPSA id 97C9C32C; Wed, 19 Jun 2019 18:15:38 +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:33 +0300 Message-Id: <1560957293-17294-9-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 08/28] vhost: move vhost-user fdset 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" The fdset is used by the AF_UNIX transport code but other transports may not need it. Move it to trans_af_unix.c and then make struct vhost_user private again since nothing outside socket.c needs it. Signed-off-by: Nikos Dragazis Signed-off-by: Stefan Hajnoczi --- lib/librte_vhost/socket.c | 37 +++++++--------------------------- lib/librte_vhost/trans_af_unix.c | 43 +++++++++++++++++++++++++++++++++++----- lib/librte_vhost/vhost.h | 15 -------------- 3 files changed, 45 insertions(+), 50 deletions(-) diff --git a/lib/librte_vhost/socket.c b/lib/librte_vhost/socket.c index 373c01d..fc78b63 100644 --- a/lib/librte_vhost/socket.c +++ b/lib/librte_vhost/socket.c @@ -16,13 +16,14 @@ #include "vhost.h" #include "vhost_user.h" +#define MAX_VHOST_SOCKET 1024 +struct vhost_user { + struct vhost_user_socket *vsockets[MAX_VHOST_SOCKET]; + int vsocket_cnt; + pthread_mutex_t mutex; +}; + struct vhost_user vhost_user = { - .fdset = { - .fd = { [0 ... MAX_FDS - 1] = {-1, NULL, NULL, NULL, 0} }, - .fd_mutex = PTHREAD_MUTEX_INITIALIZER, - .fd_pooling_mutex = PTHREAD_MUTEX_INITIALIZER, - .num = 0 - }, .vsocket_cnt = 0, .mutex = PTHREAD_MUTEX_INITIALIZER, }; @@ -484,7 +485,6 @@ int rte_vhost_driver_start(const char *path) { struct vhost_user_socket *vsocket; - static pthread_t fdset_tid; pthread_mutex_lock(&vhost_user.mutex); vsocket = find_vhost_user_socket(path); @@ -493,28 +493,5 @@ rte_vhost_driver_start(const char *path) if (!vsocket) return -1; - if (fdset_tid == 0) { - /** - * create a pipe which will be waited by poll and notified to - * rebuild the wait list of poll. - */ - if (fdset_pipe_init(&vhost_user.fdset) < 0) { - RTE_LOG(ERR, VHOST_CONFIG, - "failed to create pipe for vhost fdset\n"); - return -1; - } - - int ret = rte_ctrl_thread_create(&fdset_tid, - "vhost-events", NULL, fdset_event_dispatch, - &vhost_user.fdset); - if (ret != 0) { - RTE_LOG(ERR, VHOST_CONFIG, - "failed to create fdset handling thread"); - - fdset_pipe_uninit(&vhost_user.fdset); - return -1; - } - } - return vsocket->trans_ops->socket_start(vsocket); } diff --git a/lib/librte_vhost/trans_af_unix.c b/lib/librte_vhost/trans_af_unix.c index 00d5366..e8a4ef2 100644 --- a/lib/librte_vhost/trans_af_unix.c +++ b/lib/librte_vhost/trans_af_unix.c @@ -10,11 +10,19 @@ #include +#include "fd_man.h" #include "vhost.h" #include "vhost_user.h" #define MAX_VIRTIO_BACKLOG 128 +static struct fdset af_unix_fdset = { + .fd = { [0 ... MAX_FDS - 1] = {-1, NULL, NULL, NULL, 0} }, + .fd_mutex = PTHREAD_MUTEX_INITIALIZER, + .fd_pooling_mutex = PTHREAD_MUTEX_INITIALIZER, + .num = 0 +}; + TAILQ_HEAD(vhost_user_connection_list, vhost_user_connection); struct vhost_user_connection { @@ -189,7 +197,7 @@ vhost_user_add_connection(int fd, struct vhost_user_socket *vsocket) conn->connfd = fd; conn->vsocket = vsocket; conn->vid = vid; - ret = fdset_add(&vhost_user.fdset, fd, vhost_user_read_cb, + ret = fdset_add(&af_unix_fdset, fd, vhost_user_read_cb, NULL, conn); if (ret < 0) { RTE_LOG(ERR, VHOST_CONFIG, @@ -206,7 +214,7 @@ vhost_user_add_connection(int fd, struct vhost_user_socket *vsocket) TAILQ_INSERT_TAIL(&af_vsocket->conn_list, conn, next); pthread_mutex_unlock(&af_vsocket->conn_mutex); - fdset_pipe_notify(&vhost_user.fdset); + fdset_pipe_notify(&af_unix_fdset); return; err_cleanup: @@ -330,7 +338,7 @@ vhost_user_start_server(struct vhost_user_socket *vsocket) if (ret < 0) goto err; - ret = fdset_add(&vhost_user.fdset, fd, vhost_user_server_new_connection, + ret = fdset_add(&af_unix_fdset, fd, vhost_user_server_new_connection, NULL, vsocket); if (ret < 0) { RTE_LOG(ERR, VHOST_CONFIG, @@ -556,7 +564,7 @@ af_unix_socket_cleanup(struct vhost_user_socket *vsocket) struct vhost_user_connection *conn, *next; if (vsocket->is_server) { - fdset_del(&vhost_user.fdset, af_vsocket->socket_fd); + fdset_del(&af_unix_fdset, af_vsocket->socket_fd); close(af_vsocket->socket_fd); unlink(vsocket->path); } else if (vsocket->reconnect) { @@ -575,7 +583,7 @@ af_unix_socket_cleanup(struct vhost_user_socket *vsocket) * conn_mutex lock, and try again since * the r/wcb may use the conn_mutex lock. */ - if (fdset_try_del(&vhost_user.fdset, + if (fdset_try_del(&af_unix_fdset, conn->connfd) == -1) { pthread_mutex_unlock( &af_vsocket->conn_mutex); @@ -598,6 +606,31 @@ af_unix_socket_cleanup(struct vhost_user_socket *vsocket) static int af_unix_socket_start(struct vhost_user_socket *vsocket) { + static pthread_t fdset_tid; + + if (fdset_tid == 0) { + /** + * create a pipe which will be waited by poll and notified to + * rebuild the wait list of poll. + */ + if (fdset_pipe_init(&af_unix_fdset) < 0) { + RTE_LOG(ERR, VHOST_CONFIG, + "failed to create pipe for vhost fdset\n"); + return -1; + } + + int ret = rte_ctrl_thread_create(&fdset_tid, + "vhost-events", NULL, fdset_event_dispatch, + &af_unix_fdset); + if (ret != 0) { + RTE_LOG(ERR, VHOST_CONFIG, + "failed to create fdset handling thread"); + + fdset_pipe_uninit(&af_unix_fdset); + return -1; + } + } + if (vsocket->is_server) return vhost_user_start_server(vsocket); else diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h index d8b5ec2..64b7f77 100644 --- a/lib/librte_vhost/vhost.h +++ b/lib/librte_vhost/vhost.h @@ -22,7 +22,6 @@ #include #include -#include "fd_man.h" #include "rte_vhost.h" #include "rte_vdpa.h" @@ -404,10 +403,6 @@ struct virtio_net { struct rte_vhost_user_extern_ops extern_ops; } __rte_cache_aligned; -/* The vhost_user and vhost_user_socket declarations are temporary measures for - * moving AF_UNIX code into trans_af_unix.c. They will be cleaned up as - * socket.c is untangled from trans_af_unix.c. - */ /* * Every time rte_vhost_driver_register() is invoked, an associated * vhost_user_socket struct will be created. @@ -448,16 +443,6 @@ struct vhost_user_socket { struct vhost_transport_ops const *trans_ops; }; -#define MAX_VHOST_SOCKET 1024 -struct vhost_user { - struct vhost_user_socket *vsockets[MAX_VHOST_SOCKET]; - struct fdset fdset; - int vsocket_cnt; - pthread_mutex_t mutex; -}; - -extern struct vhost_user vhost_user; - static __rte_always_inline bool vq_is_packed(struct virtio_net *dev) {