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 E6CEB3979 for ; Thu, 21 Jul 2016 10:20:14 +0200 (CEST) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga102.fm.intel.com with ESMTP; 21 Jul 2016 01:20:14 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.28,398,1464678000"; d="scan'208";a="1021141571" Received: from yliu-dev.sh.intel.com (HELO yliu-dev) ([10.239.67.162]) by orsmga002.jf.intel.com with ESMTP; 21 Jul 2016 01:20:12 -0700 Date: Thu, 21 Jul 2016 16:24:19 +0800 From: Yuanhan Liu To: Ilya Maximets Cc: dev@dpdk.org, Huawei Xie , Dyasly Sergey , Heetae Ahn , Thomas Monjalon Message-ID: <20160721082419.GB28708@yliu-dev.sh.intel.com> References: <1469003563-27340-1-git-send-email-i.maximets@samsung.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1469003563-27340-1-git-send-email-i.maximets@samsung.com> User-Agent: Mutt/1.5.23 (2014-03-12) Subject: Re: [dpdk-dev] [PATCH] vhost: fix driver unregister for client mode 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: Thu, 21 Jul 2016 08:20:15 -0000 On Wed, Jul 20, 2016 at 11:32:43AM +0300, Ilya Maximets wrote: > Currently while calling of 'rte_vhost_driver_unregister()' connection > to QEMU will not be closed. This leads to inability to register driver > again and reconnect to same virtual machine. > > This scenario is reproducible with OVS. While executing of the following > command vhost port will be re-created (will be executed > 'rte_vhost_driver_register()' followed by 'rte_vhost_driver_unregister()') > network will be broken and QEMU possibly will crash: > > ovs-vsctl set Interface vhost1 ofport_request=15 > > Fix this by closing all established connections on driver unregister and > removing of pending connections from reconnection list. > > Fixes: 64ab701c3d1e ("vhost: add vhost-user client mode") > Signed-off-by: Ilya Maximets Again, thanks for the fix. > --- > > Patch prepared for master branch because dpdk-next-virtio doesn't contain > commit acbff5c67ea7 ("vhost: fix crash when exceeding file descriptors"). > Porting to dpdk-next-virtio/master is trivial and may be performed on > demand. Yeah, my bad, I haven't updated it after rc2, since Thomas no longer pull request from it. Anyway, you just remind me that I should have done that. > /** > * Unregister the specified vhost socket > */ > @@ -672,20 +700,34 @@ rte_vhost_driver_unregister(const char *path) > { > int i; > int count; > + struct vhost_user_connection *conn; > > pthread_mutex_lock(&vhost_user.mutex); > > for (i = 0; i < vhost_user.vsocket_cnt; i++) { > - if (!strcmp(vhost_user.vsockets[i]->path, path)) { > - if (vhost_user.vsockets[i]->is_server) { > - fdset_del(&vhost_user.fdset, > - vhost_user.vsockets[i]->listenfd); > - close(vhost_user.vsockets[i]->listenfd); > + struct vhost_user_socket *vsocket = vhost_user.vsockets[i]; > + > + if (!strcmp(vsocket->path, path)) { > + if (vsocket->is_server) { > + (void) fdset_del(&vhost_user.fdset, > + vsocket->listenfd); I would think the (void) cast is not neceessary here. > + close(vsocket->listenfd); > unlink(path); > + } else if (vsocket->reconnect) { > + vhost_user_remove_reconnect(vsocket); > + } > + > + conn = fdset_del(&vhost_user.fdset, vsocket->connfd); > + if (conn) { > + RTE_LOG(INFO, VHOST_CONFIG, "free connfd = %d" > + "for device '%s'\n", vsocket->connfd, path); We should try not to break a log message into several lines, which hurts "git grep". Here, it could be: RTE_LOG(INFO, VHOST_CONFIG, "free connfd = %d for device '%s'\n", vsocket->connfd, path); Besides the two minor nits, Acked-by: Yuanhan Liu --yliu