From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by dpdk.org (Postfix) with ESMTP id AFF701B10E for ; Tue, 15 Jan 2019 03:48:38 +0100 (CET) X-Amp-Result: UNSCANNABLE X-Amp-File-Uploaded: False Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 14 Jan 2019 18:48:37 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,480,1539673200"; d="scan'208";a="114717026" Received: from yexl-server.sh.intel.com (HELO localhost) ([10.67.110.206]) by fmsmga007.fm.intel.com with ESMTP; 14 Jan 2019 18:48:37 -0800 Date: Tue, 15 Jan 2019 10:48:42 +0800 From: Ye Xiaolong To: sunwenjie Cc: dev@dpdk.org Message-ID: <20190115024842.GA20985@intel.com> References: <20190111134931.28402-1-findtheonlyway@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20190111134931.28402-1-findtheonlyway@gmail.com> User-Agent: Mutt/1.9.4 (2018-02-28) Subject: Re: [dpdk-dev] [PATCH] vhost: fix deadlock when vhost unregister. 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: , X-List-Received-Date: Tue, 15 Jan 2019 02:48:39 -0000 Hi, On 01/11, sunwenjie wrote: > When rte_vhost_driver_unregister delete the connection fd, > fdset_try_del will always try and donot release the > vhostuser.mutex if the fd is busy, but the fdset_event_dispatch > will set the fd to busy and call vhost_user_msg_handler to get > vhostuser.mutex, which will cause deadlock. Unlock the > vhost_user.mutexif fdset_try_del fail and relock it when retry. > > Signed-off-by: findtheonlway > Signed-off-by: sunwenjie The commit log and Signed-off-by tage should not be indented, and you should get you commit log checked by `./devtools/check-git-log.sh -1`, and fix all the errors it shows. Btw, I think this is your v2 patch, and you should add the v2 tag in the subject. Thanks, Xiaolong >--- > lib/librte_vhost/socket.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > >diff --git a/lib/librte_vhost/socket.c b/lib/librte_vhost/socket.c >index 9cf34ad17..7959c5ece 100644 >--- a/lib/librte_vhost/socket.c >+++ b/lib/librte_vhost/socket.c >@@ -961,13 +961,13 @@ rte_vhost_driver_unregister(const char *path) > int count; > struct vhost_user_connection *conn, *next; > >+again: > pthread_mutex_lock(&vhost_user.mutex); > > for (i = 0; i < vhost_user.vsocket_cnt; i++) { > struct vhost_user_socket *vsocket = vhost_user.vsockets[i]; > > if (!strcmp(vsocket->path, path)) { >-again: > pthread_mutex_lock(&vsocket->conn_mutex); > for (conn = TAILQ_FIRST(&vsocket->conn_list); > conn != NULL; >@@ -981,6 +981,7 @@ rte_vhost_driver_unregister(const char *path) > */ > if (fdset_try_del(&vhost_user.fdset, > conn->connfd) == -1) { >+ pthread_mutex_unlock(&vhost_user.mutex); > pthread_mutex_unlock( > &vsocket->conn_mutex); > goto again; >-- >2.20.1 >