From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [67.231.154.164]) by dpdk.org (Postfix) with ESMTP id 698A52BC8 for ; Sun, 12 Aug 2018 13:05:18 +0200 (CEST) X-Virus-Scanned: Proofpoint Essentials engine Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1-us4.ppe-hosted.com (Proofpoint Essentials ESMTP Server) with ESMTPS id 362E9B40075; Sun, 12 Aug 2018 11:05:17 +0000 (UTC) Received: from [192.168.1.16] (85.187.13.33) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1044.25; Sun, 12 Aug 2018 12:05:08 +0100 To: Qi Zhang , , , CC: , , , , , References: <20180607123849.14439-1-qi.z.zhang@intel.com> <20180810004213.44497-1-qi.z.zhang@intel.com> <20180810004213.44497-2-qi.z.zhang@intel.com> From: Andrew Rybchenko Message-ID: Date: Sun, 12 Aug 2018 14:05:03 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: <20180810004213.44497-2-qi.z.zhang@intel.com> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-US X-Originating-IP: [85.187.13.33] X-ClientProxiedBy: ocex03.SolarFlarecom.com (10.20.40.36) To ukex01.SolarFlarecom.com (10.17.10.4) X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.5.1010-24026.003 X-TM-AS-Result: No-16.061200-8.000000-10 X-TMASE-MatchedRID: u7Yf2n7Ca/0OwH4pD14DsPHkpkyUphL9MZm0+sEE9mv7efdnqtsaE+bG U8GB3wTOyDiB4i7QjTmvXn8ZlTtgDErCZPVEfRO5syNb+yeIRArNXgP7liZ5Iiz+5QCTrE/sdyG 0kjowQuPCF5d4j+9EOFjS6cWqa6eCQ/M62m5VMQFpR7+L0B6mE7/I3arxTrviZ3q824boKrIfPl xxE3mQs3fhOXCEv5Hm1tHuSgi/X256kCBFqPiuW6OuVibdZNTvh+w9Wz/xXDoKogmGusPLb46/n KT6dFqwZ4CilovzSeUAQnv84ocXV0dHfGGOpxMFngIgpj8eDcC063Wh9WVqgtQdB5NUNSsi1GcR AJRT6POOhzOa6g8KrS/7zQ3PCSPqBGts/p4NTRih4MLUzW5l9KmW4kU++MYyXm9FMz4DKRw= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--16.061200-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.5.1010-24026.003 X-MDID: 1534071918-JiC2K-lX_PQP Subject: Re: [dpdk-dev] [PATCH v14 1/6] ethdev: add function to release port in secondary process 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: Sun, 12 Aug 2018 11:05:18 -0000 On 10.08.2018 03:42, Qi Zhang wrote: > Add driver API rte_eth_release_port_secondary 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 > --- > lib/librte_ethdev/rte_ethdev.c | 21 ++++++++++++++++++--- > lib/librte_ethdev/rte_ethdev_driver.h | 16 +++++++++++++++- > lib/librte_ethdev/rte_ethdev_pci.h | 9 +++++++-- > lib/librte_ethdev/rte_ethdev_version.map | 7 +++++++ > 4 files changed, 47 insertions(+), 6 deletions(-) > > diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c > index 4c3202505..c653bf5fa 100644 > --- a/lib/librte_ethdev/rte_ethdev.c > +++ b/lib/librte_ethdev/rte_ethdev.c <...> > @@ -3532,10 +3544,13 @@ rte_eth_dev_destroy(struct rte_eth_dev *ethdev, > return ret; > } > > - if (rte_eal_process_type() == RTE_PROC_PRIMARY) > - rte_free(ethdev->data->dev_private); > + if (rte_eal_process_type() != RTE_PROC_PRIMARY) > + return rte_eth_dev_release_port_secondary(ethdev); > > - ethdev->data->dev_private = NULL; > + if (ethdev->data->dev_private != NULL) { The check is not necessary, rte_free() perfectly works with NULL. > + rte_free(ethdev->data->dev_private); > + ethdev->data->dev_private = NULL; > + } > > return rte_eth_dev_release_port(ethdev); > } > diff --git a/lib/librte_ethdev/rte_ethdev_driver.h b/lib/librte_ethdev/rte_ethdev_driver.h > index c6d9bc1a3..8fe82d2ab 100644 > --- a/lib/librte_ethdev/rte_ethdev_driver.h > +++ b/lib/librte_ethdev/rte_ethdev_driver.h > @@ -61,7 +61,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 > */ > @@ -69,6 +69,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_secondary(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 f652596f4..c22022e4f 100644 > --- a/lib/librte_ethdev/rte_ethdev_pci.h > +++ b/lib/librte_ethdev/rte_ethdev_pci.h > @@ -135,9 +135,14 @@ rte_eth_dev_pci_allocate(struct rte_pci_device *dev, size_t private_data_size) > static inline void > rte_eth_dev_pci_release(struct rte_eth_dev *eth_dev) > {@@ -359,6 +359,18 @@ rte_eth_dev_attach_secondary(const char *name) > } > > int > +rte_eth_dev_release_port_secondary(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) > > > - if (rte_eal_process_type() == RTE_PROC_PRIMARY) > - rte_free(eth_dev->data->dev_private); > + if (rte_eal_process_type() != RTE_PROC_PRIMARY) { > + eth_dev->device = NULL; > + eth_dev->intr_handle = NULL; > + rte_eth_dev_release_port_secondary(eth_dev); Is return missing here. Below comment pretends that it is primary process code. > + } > > + /* primary process */ > + rte_free(eth_dev->data->dev_private); > eth_dev->data->dev_private = NULL; > > /* > diff --git a/lib/librte_ethdev/rte_ethdev_version.map b/lib/librte_ethdev/rte_ethdev_version.map > index 38f117f01..acc407f86 100644 > --- a/lib/librte_ethdev/rte_ethdev_version.map > +++ b/lib/librte_ethdev/rte_ethdev_version.map > @@ -220,6 +220,13 @@ DPDK_18.08 { > > } DPDK_18.05; > > +DPDK_18.11 { > + global: > + > + rte_eth_dev_release_port_secondary; > + > +} DPDK_18.08; > + > EXPERIMENTAL { > global: >