From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by dpdk.org (Postfix) with ESMTP id 2417AC36E for ; Wed, 1 Jul 2015 04:14:31 +0200 (CEST) Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga102.jf.intel.com with ESMTP; 30 Jun 2015 19:14:30 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.15,382,1432623600"; d="scan'208";a="720697095" Received: from kmsmsx151.gar.corp.intel.com ([172.21.73.86]) by orsmga001.jf.intel.com with ESMTP; 30 Jun 2015 19:14:29 -0700 Received: from shsmsx103.ccr.corp.intel.com (10.239.4.69) by KMSMSX151.gar.corp.intel.com (172.21.73.86) with Microsoft SMTP Server (TLS) id 14.3.224.2; Wed, 1 Jul 2015 10:14:29 +0800 Received: from shsmsx102.ccr.corp.intel.com ([169.254.2.165]) by SHSMSX103.ccr.corp.intel.com ([169.254.4.46]) with mapi id 14.03.0224.002; Wed, 1 Jul 2015 10:14:28 +0800 From: "Ouyang, Changchun" To: "Xie, Huawei" , "dev@dpdk.org" Thread-Topic: [dpdk-dev] [PATCH v4 2/4] vhost: vhost unix domain socket cleanup Thread-Index: AQHQsxYtvz2K2NVhxEulLcgYsXZro53F4Q+w Date: Wed, 1 Jul 2015 02:14:27 +0000 Message-ID: References: <1434649260-26317-2-git-send-email-huawei.xie@intel.com> <1435656050-3539-1-git-send-email-huawei.xie@intel.com> <1435656050-3539-3-git-send-email-huawei.xie@intel.com> In-Reply-To: <1435656050-3539-3-git-send-email-huawei.xie@intel.com> Accept-Language: zh-CN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Subject: Re: [dpdk-dev] [PATCH v4 2/4] vhost: vhost unix domain socket cleanup 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: Wed, 01 Jul 2015 02:14:33 -0000 > -----Original Message----- > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Huawei Xie > Sent: Tuesday, June 30, 2015 5:21 PM > To: dev@dpdk.org > Subject: [dpdk-dev] [PATCH v4 2/4] vhost: vhost unix domain socket cleanu= p >=20 > rte_vhost_driver_unregister API will remove the listenfd from event list,= and > then close it. >=20 > v2 changes: > -minor code style fix, remove unnecessary new line >=20 > Signed-off-by: Huawei Xie > Signed-off-by: Peng Sun Acked-by: Changchun Ouyang > --- > 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(-) >=20 > 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 insta= nce > support. */ int rte_vhost_driver_register(const char *dev_name); >=20 > +/* 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 cons= t * > 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) } >=20 > /** > + * 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; > }; >=20 > static struct _vhost_server g_vhost_server =3D { @@ -74,10 +76,10 @@ sta= tic > struct _vhost_server g_vhost_server =3D { > .fd_mutex =3D PTHREAD_MUTEX_INITIALIZER, > .num =3D 0 > }, > + .vserver_cnt =3D 0, > + .server_mutex =3D PTHREAD_MUTEX_INITIALIZER, > }; >=20 > -static int vserver_idx; > - > static const char *vhost_message_str[VHOST_USER_MAX] =3D { > [VHOST_USER_NONE] =3D "VHOST_USER_NONE", > [VHOST_USER_GET_FEATURES] =3D "VHOST_USER_GET_FEATURES", > @@ -427,7 +429,6 @@ vserver_message_handler(int connfd, void *dat, int > *remove) > } > } >=20 > - > /** > * Creates and initialise the vhost server. > */ > @@ -436,34 +437,77 @@ rte_vhost_driver_register(const char *path) { > struct vhost_server *vserver; >=20 > - if (vserver_idx =3D=3D 0) > + pthread_mutex_lock(&g_vhost_server.server_mutex); > + if (ops =3D=3D NULL) > ops =3D get_virtio_net_callbacks(); > - if (vserver_idx =3D=3D MAX_VHOST_SERVER) > + > + if (g_vhost_server.vserver_cnt =3D=3D 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; > + } >=20 > vserver =3D calloc(sizeof(struct vhost_server), 1); > - if (vserver =3D=3D NULL) > + if (vserver =3D=3D NULL) { > + pthread_mutex_unlock(&g_vhost_server.server_mutex); > return -1; > - > - unlink(path); > + } >=20 > vserver->listenfd =3D uds_socket(path); > if (vserver->listenfd < 0) { > free(vserver); > + pthread_mutex_unlock(&g_vhost_server.server_mutex); > return -1; > } > - vserver->path =3D path; > + > + vserver->path =3D strdup(path); >=20 > fdset_add(&g_vhost_server.fdset, vserver->listenfd, > - vserver_new_vq_conn, NULL, > - vserver); > + vserver_new_vq_conn, NULL, vserver); >=20 > - g_vhost_server.server[vserver_idx++] =3D vserver; > + g_vhost_server.server[g_vhost_server.vserver_cnt++] =3D vserver; > + pthread_mutex_unlock(&g_vhost_server.server_mutex); >=20 > return 0; > } >=20 >=20 > +/** > + * 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 =3D 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 =3D --g_vhost_server.vserver_cnt; > + g_vhost_server.server[i] =3D > g_vhost_server.server[count]; > + g_vhost_server.server[count] =3D 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" >=20 > 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. */ > }; >=20 > -- > 1.8.1.4