[dpdk-dev] [PATCH v4 03/24] ethdev: add function to release port in local process
Matan Azrad
matan at mellanox.com
Tue Jun 26 13:50:16 CEST 2018
Hi Qi
Please see comments\questions..
From: Qi Zhang
> Add driver API rte_eth_release_port_private to support the requirement that
> an ethdev only be released on secondary process, so only local state be set to
> unused , share data will not be reset so primary process can still use it.
>
> Signed-off-by: Qi Zhang <qi.z.zhang at intel.com>
> ---
>
> lib/librte_ethdev/rte_ethdev.c | 24 +++++++++++++++++++++---
> lib/librte_ethdev/rte_ethdev_driver.h | 13 +++++++++++++
> 2 files changed, 34 insertions(+), 3 deletions(-)
>
> diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
> index a9977df97..205b2ee33 100644
> --- a/lib/librte_ethdev/rte_ethdev.c
> +++ b/lib/librte_ethdev/rte_ethdev.c
> @@ -359,6 +359,23 @@ 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);
> +
> + rte_spinlock_lock(&rte_eth_dev_shared_data->ownership_lock);
I don't think you need the lock here because there is not shared data to reset.
> + eth_dev->state = RTE_ETH_DEV_UNUSED;
> +
> + rte_spinlock_unlock(&rte_eth_dev_shared_data->ownership_lock);
> +
> + return 0;
> +}
> +
> +int
> rte_eth_dev_release_port(struct rte_eth_dev *eth_dev) {
> if (eth_dev == NULL)
> @@ -370,9 +387,10 @@ rte_eth_dev_release_port(struct rte_eth_dev
> *eth_dev)
>
> rte_spinlock_lock(&rte_eth_dev_shared_data->ownership_lock);
>
> - eth_dev->state = RTE_ETH_DEV_UNUSED;
> -
> - memset(eth_dev->data, 0, sizeof(struct rte_eth_dev_data));
> + if (eth_dev->state != RTE_ETH_DEV_UNUSED) {
Can you explain why not to release the shared data in case of locally unused port?
> + eth_dev->state = RTE_ETH_DEV_UNUSED;
> + memset(eth_dev->data, 0, sizeof(struct rte_eth_dev_data));
> + }
>
> rte_spinlock_unlock(&rte_eth_dev_shared_data->ownership_lock);
>
> diff --git a/lib/librte_ethdev/rte_ethdev_driver.h
> b/lib/librte_ethdev/rte_ethdev_driver.h
> index c9c825e3f..49c27223d 100644
> --- a/lib/librte_ethdev/rte_ethdev_driver.h
> +++ b/lib/librte_ethdev/rte_ethdev_driver.h
> @@ -70,6 +70,19 @@ int rte_eth_dev_release_port(struct rte_eth_dev
> *eth_dev);
>
> /**
> * @internal
> + * Release the specified ethdev port in local process, only set to
> +ethdev
> + * state to unused, but not reset share data since it assume other
> +process
> + * is still using it, typically it is called by secondary process.
> + *
> + * @param eth_dev
> + * The *eth_dev* pointer is the address of the *rte_eth_dev* structure.
> + * @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.
> *
> --
> 2.13.6
More information about the dev
mailing list