[dpdk-dev] [PATCH v2 05/22] ethdev: introduce device lock

Burakov, Anatoly anatoly.burakov at intel.com
Thu Jun 21 10:51:22 CEST 2018


On 21-Jun-18 3:00 AM, Qi Zhang wrote:
> Introduce API rte_eth_dev_lock and rte_eth_dev_unlock to let
> application lock or unlock on specific ethdev, a locked device
> can't be detached, this help application to prevent unexpected
> device detaching, especially in multi-process environment.
> 
> Also introduce the new API rte_eth_dev_lock_with_callback and
> rte_eth_dev_unlock_with callback to let application to register
> a callback function which will be invoked before a device is going
> to be detached, the return value of the function will decide if
> device will continue be detached or not, this support application
> to do condition check at runtime.
> 
> Signed-off-by: Qi Zhang <qi.z.zhang at intel.com>
> ---

<snip>

> +
> +static int clean_lock_callback_one(uint16_t port_id)
> +{
> +	struct lock_entry *le;
> +	int ret = 0;
> +
> +	rte_spinlock_lock(&lock_entry_lock);
> +
> +	TAILQ_FOREACH(le, &lock_entry_list, next) {
> +		if (le->port_id == port_id)
> +			break;
> +	}
> +
> +	if (le != NULL) {
> +		le->ref_count--;
> +		if (le->ref_count == 0) {
> +			TAILQ_REMOVE(&lock_entry_list, le, next);
> +			free(le);
> +		}
> +	} else {
> +		ret = -ENOENT;
> +	}
> +
> +	rte_spinlock_unlock(&lock_entry_lock);
> +	return ret;
> +
> +}
> +
> +void clean_lock_callback(uint16_t port_id)
> +{
> +	int ret;
> +
> +	for (;;) {
> +		ret = clean_lock_callback_one(port_id);
> +		if (ret == -ENOENT)
> +			break;
> +	}
> +}

Why not lock/unlock the list in clean_lock_callback() and proceed to 
cleaning callbacks one by one, instead of locking-and-unlocking the list 
over and over again?

-- 
Thanks,
Anatoly


More information about the dev mailing list