[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