From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Rybchenko Subject: Re: [PATCH v11 01/19] ethdev: add function to release port in local process Date: Wed, 11 Jul 2018 12:26:51 +0300 Message-ID: <0a0c7b4a-3f7d-8b5e-3e76-8b631edd1997@solarflare.com> References: <20180607123849.14439-1-qi.z.zhang@intel.com> <20180711030917.181098-1-qi.z.zhang@intel.com> <20180711030917.181098-2-qi.z.zhang@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit Cc: , , , , , To: Qi Zhang , , Return-path: Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 706431B42D for ; Wed, 11 Jul 2018 11:27:06 +0200 (CEST) In-Reply-To: <20180711030917.181098-2-qi.z.zhang@intel.com> Content-Language: en-US List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" On 11.07.2018 06:08, Qi Zhang wrote: > Add driver API rte_eth_release_port_private to support the > case when an ethdev need to be detached on a secondary process. > Local state is set to unused and shared data will not be reset > so the primary process can still use it. > > Signed-off-by: Qi Zhang > Reviewed-by: Andrew Rybchenko > Acked-by: Remy Horton > --- > lib/librte_ethdev/rte_ethdev.c | 12 ++++++++++++ > lib/librte_ethdev/rte_ethdev_driver.h | 16 +++++++++++++++- > lib/librte_ethdev/rte_ethdev_pci.h | 8 ++++++++ > 3 files changed, 35 insertions(+), 1 deletion(-) > > diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c > index a9977df97..52a97694c 100644 > --- a/lib/librte_ethdev/rte_ethdev.c > +++ b/lib/librte_ethdev/rte_ethdev.c > @@ -359,6 +359,18 @@ rte_eth_dev_attach_secondary(const char *name) > } > > int > +rte_eth_dev_release_port_private(struct rte_eth_dev *eth_dev) > +{ > + if (eth_dev == NULL) > + return -EINVAL; > + > + _rte_eth_dev_callback_process(eth_dev, RTE_ETH_EVENT_DESTROY, NULL); > + eth_dev->state = RTE_ETH_DEV_UNUSED; > + > + return 0; > +} > + > +int > rte_eth_dev_release_port(struct rte_eth_dev *eth_dev) > { > if (eth_dev == NULL) > diff --git a/lib/librte_ethdev/rte_ethdev_driver.h b/lib/librte_ethdev/rte_ethdev_driver.h > index c9c825e3f..269586d88 100644 > --- a/lib/librte_ethdev/rte_ethdev_driver.h > +++ b/lib/librte_ethdev/rte_ethdev_driver.h > @@ -62,7 +62,7 @@ struct rte_eth_dev *rte_eth_dev_attach_secondary(const char *name); > * Release the specified ethdev port. > * > * @param eth_dev > - * The *eth_dev* pointer is the address of the *rte_eth_dev* structure. > + * Device to be detached. > * @return > * - 0 on success, negative on error > */ > @@ -70,6 +70,20 @@ int rte_eth_dev_release_port(struct rte_eth_dev *eth_dev); > > /** > * @internal > + * Release the specified ethdev port in the local process. > + * Only set ethdev state to unused, but not reset shared data since > + * it assume other processes is still using it. typically it is > + * called by a secondary process. > + * > + * @param eth_dev > + * Device to be detached. > + * @return > + * - 0 on success, negative on error > + */ > +int rte_eth_dev_release_port_private(struct rte_eth_dev *eth_dev); > + > +/** > + * @internal > * Release device queues and clear its configuration to force the user > * application to reconfigure it. It is for internal use only. > * > diff --git a/lib/librte_ethdev/rte_ethdev_pci.h b/lib/librte_ethdev/rte_ethdev_pci.h > index 2cfd37274..a46d9e182 100644 > --- a/lib/librte_ethdev/rte_ethdev_pci.h > +++ b/lib/librte_ethdev/rte_ethdev_pci.h > @@ -197,6 +197,14 @@ rte_eth_dev_pci_generic_remove(struct rte_pci_device *pci_dev, > if (!eth_dev) > return -ENODEV; > > + /** > + * PCI device can only be globally detached directly by a > + * primary process. In secondary process, we only need to > + * release port. > + */ > + if (rte_eal_process_type() != RTE_PROC_PRIMARY) > + return rte_eth_dev_release_port_private(eth_dev); I've realized that some uninit functions which will not be called anymore in secondary processes have check for process type and handling of secondary process case. It makes code inconsistent and should be fixed. > + > if (dev_uninit) { > ret = dev_uninit(eth_dev); > if (ret)