[dpdk-dev] [PATCH v1 05/13] ethdev: add private generic device iterator

Andrew Rybchenko arybchenko at solarflare.com
Fri Aug 31 12:09:34 CEST 2018


On 08/30/2018 04:41 PM, Gaetan Rivet wrote:
> This iterator can be customized with a comparison function that will
> trigger a stopping condition.
>
> It can be leveraged to write several different iterators that have
> similar but non-identical purposes.
>
> It is private to librte_ethdev.
>
> Signed-off-by: Gaetan Rivet <gaetan.rivet at 6wind.com>
> ---
>   lib/librte_ethdev/Makefile      |  1 +
>   lib/librte_ethdev/eth_private.c | 31 +++++++++++++++++++++++++++++++
>   lib/librte_ethdev/eth_private.h | 26 ++++++++++++++++++++++++++
>   lib/librte_ethdev/meson.build   |  3 ++-
>   4 files changed, 60 insertions(+), 1 deletion(-)
>   create mode 100644 lib/librte_ethdev/eth_private.c
>   create mode 100644 lib/librte_ethdev/eth_private.h
>
> diff --git a/lib/librte_ethdev/Makefile b/lib/librte_ethdev/Makefile
> index 0935a275e..3c1c92cb9 100644
> --- a/lib/librte_ethdev/Makefile
> +++ b/lib/librte_ethdev/Makefile
> @@ -18,6 +18,7 @@ EXPORT_MAP := rte_ethdev_version.map
>   
>   LIBABIVER := 10
>   
> +SRCS-y += eth_private.c
>   SRCS-y += rte_ethdev.c
>   SRCS-y += rte_flow.c
>   SRCS-y += rte_tm.c
> diff --git a/lib/librte_ethdev/eth_private.c b/lib/librte_ethdev/eth_private.c
> new file mode 100644
> index 000000000..d565568a0
> --- /dev/null
> +++ b/lib/librte_ethdev/eth_private.c

Just a nit
I think it is better to name it ethdev_private.c since we already
have ethdev_profile.[ch] and it is about ethdev, not Ethernet.

> @@ -0,0 +1,31 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2018 Gaëtan Rivet
> + */
> +
> +#include "rte_ethdev.h"
> +#include "eth_private.h"
> +
> +struct rte_eth_dev *
> +eth_find_device(const struct rte_eth_dev *start, rte_eth_cmp_t cmp,
> +		const void *data)
> +{
> +	struct rte_eth_dev *edev;
> +	ptrdiff_t idx;
> +
> +	/* Avoid Undefined Behaviour */
> +	if (start != NULL &&
> +	    (start < &rte_eth_devices[0] ||
> +	     start > &rte_eth_devices[RTE_MAX_ETHPORTS]))
> +		return NULL;
> +	if (start != NULL)
> +		idx = start - &rte_eth_devices[0] + 1;
> +	else
> +		idx = 0;
> +	for (; idx < RTE_MAX_ETHPORTS; idx++) {
> +		edev = &rte_eth_devices[idx];

Shouldn't we limit it to valid ports only?
If no, I think it would be useful to highlight it in the function
description that it iterates over all devices including unused.

> +		if (cmp(edev, data) == 0)
> +			return edev;
> +	}
> +	return NULL;
> +}
> +
> diff --git a/lib/librte_ethdev/eth_private.h b/lib/librte_ethdev/eth_private.h
> new file mode 100644
> index 000000000..0f5c6d5c4
> --- /dev/null
> +++ b/lib/librte_ethdev/eth_private.h

ethdev_private.h

<...>


More information about the dev mailing list