From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 7BBA9A054F; Tue, 18 Feb 2020 09:50:15 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id CC0E91C128; Tue, 18 Feb 2020 09:50:14 +0100 (CET) Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by dpdk.org (Postfix) with ESMTP id 195A51C0D1 for ; Tue, 18 Feb 2020 09:50:12 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga107.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 18 Feb 2020 00:50:12 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.70,456,1574150400"; d="scan'208";a="282734000" Received: from fmsmsx108.amr.corp.intel.com ([10.18.124.206]) by FMSMGA003.fm.intel.com with ESMTP; 18 Feb 2020 00:50:12 -0800 Received: from shsmsx602.ccr.corp.intel.com (10.109.6.142) by FMSMSX108.amr.corp.intel.com (10.18.124.206) with Microsoft SMTP Server (TLS) id 14.3.439.0; Tue, 18 Feb 2020 00:50:11 -0800 Received: from shsmsx603.ccr.corp.intel.com (10.109.6.143) by SHSMSX602.ccr.corp.intel.com (10.109.6.142) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5; Tue, 18 Feb 2020 16:50:09 +0800 Received: from shsmsx603.ccr.corp.intel.com ([10.109.6.143]) by SHSMSX603.ccr.corp.intel.com ([10.109.6.143]) with mapi id 15.01.1713.004; Tue, 18 Feb 2020 16:50:09 +0800 From: "Wang, Yinan" To: Itsuro Oda , "dev@dpdk.org" , "maxime.coquelin@redhat.com" , "Bie, Tiwei" , "Wang, Zhihong" , "Burakov, Anatoly" CC: Thomas Monjalon , "Xu, Qian Q" , "Yao, Lei A" Thread-Topic: [dpdk-dev] [PATCH v3 2/4] net/vhost: delay vhost driver setup Thread-Index: AQHV3I50jvkpCTwFCkKFbcei5YsfLaggpVng Importance: high X-Priority: 1 Date: Tue, 18 Feb 2020 08:50:09 +0000 Message-ID: References: <20200108062510.3478-1-oda@valinux.co.jp> <20200206013936.11119-1-oda@valinux.co.jp> <20200206013936.11119-3-oda@valinux.co.jp> In-Reply-To: <20200206013936.11119-3-oda@valinux.co.jp> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-reaction: no-action dlp-version: 11.2.0.6 dlp-product: dlpe-windows x-originating-ip: [10.239.127.36] Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Subject: Re: [dpdk-dev] [PATCH v3 2/4] net/vhost: delay vhost driver setup 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" Hi Itsuro/Maxime, Below patch (commit id:3d01b759d2679c216725689eabe44147d1737326)blocked vho= st/virtio basic test: If re-config vhost port=1B$B!$=1B(Btestpmd will launc= h failed. Reproduce steps: ./x86_64-native-linuxapp-gcc/app/testpmd -l 2-4 -n 4 --socket-mem 1024,1024= --legacy-mem --file-prefix=3Dvhost --vdev 'net_vhost0,iface=3Dvhost-net,q= ueues=3D1,client=3D0' --no-pci -- -i --txd=3D1024 --rxd=3D1024 testpmd>set fwd csum testpmd>stop testpmd>port stop 0 testpmd>csum set tcp sw 0 testpmd>port start 0 VHOST_CONFIG: vhost-user server: socket created, fd: 26 VHOST_CONFIG: failed to bind to vhost-net: Address already in use; remove i= t and try again Failed to start driver for vhost-net Port0 dev_configure =3D -1 Fail to configure port 0 BR, Yinan > -----Original Message----- > From: dev On Behalf Of Itsuro Oda > Sent: 2020=1B$BG/=1B(B2=1B$B7n=1B(B6=1B$BF|=1B(B 9:40 > To: dev@dpdk.org; maxime.coquelin@redhat.com; Bie, Tiwei > ; Wang, Zhihong ; Burakov, > Anatoly > Cc: stable@dpdk.org > Subject: [dpdk-dev] [PATCH v3 2/4] net/vhost: delay vhost driver setup >=20 > Vhost driver setup is delayed at eth_dev configuration in order to be abl= e to set > it from a secondary process. >=20 > Fixes: 4852aa8f6e21 (drivers/net: enable hotplug on secondary process) > Cc: stable@dpdk.org >=20 > Signed-off-by: Itsuro Oda > Reviewed-by: Maxime Coquelin > --- > drivers/net/vhost/rte_eth_vhost.c | 130 ++++++++++++++++++------------ > 1 file changed, 78 insertions(+), 52 deletions(-) >=20 > diff --git a/drivers/net/vhost/rte_eth_vhost.c > b/drivers/net/vhost/rte_eth_vhost.c > index cea2ead2d..d7bba5c6e 100644 > --- a/drivers/net/vhost/rte_eth_vhost.c > +++ b/drivers/net/vhost/rte_eth_vhost.c > @@ -97,6 +97,8 @@ struct pmd_internal { > rte_atomic32_t dev_attached; > char *dev_name; > char *iface_name; > + uint64_t flags; > + uint64_t disable_flags; > uint16_t max_queues; > int vid; > rte_atomic32_t started; > @@ -491,17 +493,6 @@ eth_vhost_tx(void *q, struct rte_mbuf **bufs, > uint16_t nb_bufs) > return nb_tx; > } >=20 > -static int > -eth_dev_configure(struct rte_eth_dev *dev __rte_unused) -{ > - struct pmd_internal *internal =3D dev->data->dev_private; > - const struct rte_eth_rxmode *rxmode =3D &dev->data->dev_conf.rxmode; > - > - internal->vlan_strip =3D !!(rxmode->offloads & > DEV_RX_OFFLOAD_VLAN_STRIP); > - > - return 0; > -} > - > static inline struct internal_list * > find_internal_resource(char *ifname) > { > @@ -877,6 +868,62 @@ static struct vhost_device_ops vhost_ops =3D { > .vring_state_changed =3D vring_state_changed, }; >=20 > +static int > +vhost_driver_setup(struct rte_eth_dev *eth_dev) { > + struct pmd_internal *internal =3D eth_dev->data->dev_private; > + struct internal_list *list =3D NULL; > + struct rte_vhost_vring_state *vring_state =3D NULL; > + unsigned int numa_node =3D eth_dev->device->numa_node; > + const char *name =3D eth_dev->device->name; > + > + list =3D rte_zmalloc_socket(name, sizeof(*list), 0, numa_node); > + if (list =3D=3D NULL) > + goto error; > + > + vring_state =3D rte_zmalloc_socket(name, sizeof(*vring_state), > + 0, numa_node); > + if (vring_state =3D=3D NULL) > + goto error; > + > + list->eth_dev =3D eth_dev; > + pthread_mutex_lock(&internal_list_lock); > + TAILQ_INSERT_TAIL(&internal_list, list, next); > + pthread_mutex_unlock(&internal_list_lock); > + > + rte_spinlock_init(&vring_state->lock); > + vring_states[eth_dev->data->port_id] =3D vring_state; > + > + if (rte_vhost_driver_register(internal->iface_name, internal->flags)) > + goto error; > + > + if (internal->disable_flags) { > + if (rte_vhost_driver_disable_features(internal->iface_name, > + internal->disable_flags)) > + goto error; > + } > + > + if (rte_vhost_driver_callback_register(internal->iface_name, > + &vhost_ops) < 0) { > + VHOST_LOG(ERR, "Can't register callbacks\n"); > + goto error; > + } > + > + if (rte_vhost_driver_start(internal->iface_name) < 0) { > + VHOST_LOG(ERR, "Failed to start driver for %s\n", > + internal->iface_name); > + goto error; > + } > + > + return 0; > + > +error: > + rte_free(vring_state); > + rte_free(list); > + > + return -1; > +} > + > int > rte_eth_vhost_get_queue_event(uint16_t port_id, > struct rte_eth_vhost_queue_event *event) @@ -943,6 +990,24 @@ > rte_eth_vhost_get_vid_from_port_id(uint16_t port_id) > return vid; > } >=20 > +static int > +eth_dev_configure(struct rte_eth_dev *dev) { > + struct pmd_internal *internal =3D dev->data->dev_private; > + const struct rte_eth_rxmode *rxmode =3D &dev->data->dev_conf.rxmode; > + > + /* NOTE: the same process has to operate a vhost interface > + * from beginning to end (from eth_dev configure to eth_dev close). > + * It is user's responsibility at the moment. > + */ > + if (vhost_driver_setup(dev) < 0) > + return -1; > + > + internal->vlan_strip =3D !!(rxmode->offloads & > +DEV_RX_OFFLOAD_VLAN_STRIP); > + > + return 0; > +} > + > static int > eth_dev_start(struct rte_eth_dev *eth_dev) { @@ -1219,16 +1284,10 @@ > eth_dev_vhost_create(struct rte_vdev_device *dev, char *iface_name, > struct pmd_internal *internal =3D NULL; > struct rte_eth_dev *eth_dev =3D NULL; > struct rte_ether_addr *eth_addr =3D NULL; > - struct rte_vhost_vring_state *vring_state =3D NULL; > - struct internal_list *list =3D NULL; >=20 > VHOST_LOG(INFO, "Creating VHOST-USER backend on numa > socket %u\n", > numa_node); >=20 > - list =3D rte_zmalloc_socket(name, sizeof(*list), 0, numa_node); > - if (list =3D=3D NULL) > - goto error; > - > /* reserve an ethdev entry */ > eth_dev =3D rte_eth_vdev_allocate(dev, sizeof(*internal)); > if (eth_dev =3D=3D NULL) > @@ -1242,11 +1301,6 @@ eth_dev_vhost_create(struct rte_vdev_device *dev, > char *iface_name, > *eth_addr =3D base_eth_addr; > eth_addr->addr_bytes[5] =3D eth_dev->data->port_id; >=20 > - vring_state =3D rte_zmalloc_socket(name, > - sizeof(*vring_state), 0, numa_node); > - if (vring_state =3D=3D NULL) > - goto error; > - > /* now put it all together > * - store queue data in internal, > * - point eth_dev_data to internals > @@ -1262,18 +1316,12 @@ eth_dev_vhost_create(struct rte_vdev_device > *dev, char *iface_name, > goto error; > strcpy(internal->iface_name, iface_name); >=20 > - list->eth_dev =3D eth_dev; > - pthread_mutex_lock(&internal_list_lock); > - TAILQ_INSERT_TAIL(&internal_list, list, next); > - pthread_mutex_unlock(&internal_list_lock); > - > - rte_spinlock_init(&vring_state->lock); > - vring_states[eth_dev->data->port_id] =3D vring_state; > - > data->nb_rx_queues =3D queues; > data->nb_tx_queues =3D queues; > internal->max_queues =3D queues; > internal->vid =3D -1; > + internal->flags =3D flags; > + internal->disable_flags =3D disable_flags; > data->dev_link =3D pmd_link; > data->dev_flags =3D RTE_ETH_DEV_INTR_LSC | > RTE_ETH_DEV_CLOSE_REMOVE; >=20 > @@ -1283,26 +1331,6 @@ eth_dev_vhost_create(struct rte_vdev_device *dev, > char *iface_name, > eth_dev->rx_pkt_burst =3D eth_vhost_rx; > eth_dev->tx_pkt_burst =3D eth_vhost_tx; >=20 > - if (rte_vhost_driver_register(iface_name, flags)) > - goto error; > - > - if (disable_flags) { > - if (rte_vhost_driver_disable_features(iface_name, > - disable_flags)) > - goto error; > - } > - > - if (rte_vhost_driver_callback_register(iface_name, &vhost_ops) < 0) { > - VHOST_LOG(ERR, "Can't register callbacks\n"); > - goto error; > - } > - > - if (rte_vhost_driver_start(iface_name) < 0) { > - VHOST_LOG(ERR, "Failed to start driver for %s\n", > - iface_name); > - goto error; > - } > - > rte_eth_dev_probing_finish(eth_dev); > return 0; >=20 > @@ -1311,9 +1339,7 @@ eth_dev_vhost_create(struct rte_vdev_device *dev, > char *iface_name, > rte_free(internal->iface_name); > free(internal->dev_name); > } > - rte_free(vring_state); > rte_eth_dev_release_port(eth_dev); > - rte_free(list); >=20 > return -1; > } > -- > 2.17.0