[PATCH v5 2/4] lib: fix comparison between devices

Hemant Agrawal hemant.agrawal at oss.nxp.com
Thu Feb 6 08:55:17 CET 2025


On 06-02-2025 05:38, Shani Peretz wrote:
> DPDK supports multiple formats for specifying buses,
> (such as "0000:08:00.0" and "08:00.0" for PCI).
> This flexibility can lead to inconsistencies when using one
> format while running testpmd, then attempts to use the other
> format in a later command, resulting in a failure.
>
> The issue arises from the find_device function, which compares
> the user-provided string directly with the device->name in
> the rte_device structure.
> If we want to accurately compare these names, we'll need to bring both
> sides to the same representation by invoking the parse function
> on the user input.
>
> The proposed solution is to utilize the parse function implemented
> by each bus. When comparing names, we will call parse on the supplied
> string as well as on the device name itself and compare the results.
> As part of the change the parse function will now return the size of the
> parsed address.
>
> This will allow consistent comparisons between different representations
> of same devices.
>
> In addition, fixed vdev test to use the rte_cmp_dev_name function
> instead of the custom one.
>
> Fixes: a3ee360f4440 ("eal: add hotplug add/remove device")
>
> Signed-off-by: Shani Peretz <shperetz at nvidia.com>
> ---
>   app/test/test_vdev.c                     | 10 ++----
>   drivers/bus/auxiliary/auxiliary_common.c | 17 +++++++---
>   drivers/bus/cdx/cdx.c                    | 13 +++++---
>   drivers/bus/dpaa/dpaa_bus.c              |  7 ++--
>   drivers/bus/fslmc/fslmc_bus.c            |  9 ++++--
>   drivers/bus/ifpga/ifpga_bus.c            | 14 +++++---
>   drivers/bus/pci/pci_common.c             |  7 ++--
>   drivers/bus/platform/platform.c          | 15 ++++++---
>   drivers/bus/uacce/uacce.c                | 14 +++++---
>   drivers/bus/vdev/vdev.c                  | 23 +++++++++++--
>   drivers/bus/vmbus/vmbus_common.c         |  9 ++++--
>   drivers/dma/idxd/idxd_bus.c              |  9 ++++--
>   drivers/raw/ifpga/ifpga_rawdev.c         |  8 +----
>   lib/eal/common/eal_common_bus.c          |  2 +-
>   lib/eal/common/eal_common_dev.c          | 41 +++++++++++++++++++++---
>   lib/eal/common/hotplug_mp.c              | 11 ++-----
>   lib/eal/include/bus_driver.h             | 24 +++++++++++++-
>   lib/eal/include/rte_dev.h                | 15 +++++++++
>   lib/eal/linux/eal_dev.c                  | 10 +-----
>   lib/eal/version.map                      |  1 +
>   20 files changed, 180 insertions(+), 79 deletions(-)
>
> diff --git a/app/test/test_vdev.c b/app/test/test_vdev.c
> index 3e262f30bc..860fa260af 100644
> --- a/app/test/test_vdev.c
> +++ b/app/test/test_vdev.c
> @@ -20,12 +20,6 @@ static const char * const valid_keys[] = {
>   	NULL,
>   };
>   
> -static int
> -cmp_dev_name(const struct rte_device *dev, const void *name)
> -{
> -	return strcmp(rte_dev_name(dev), name);
> -}
> -
>   static int
>   cmp_dev_match(const struct rte_device *dev, const void *_kvlist)
>   {
> @@ -82,7 +76,7 @@ test_vdev_bus(void)
>   		printf("Failed to create vdev net_null_test0\n");
>   		goto fail;
>   	}
> -	dev0 = vdev_bus->find_device(NULL, cmp_dev_name, "net_null_test0");
> +	dev0 = vdev_bus->find_device(NULL, rte_cmp_dev_name, "net_null_test0");
>   	if (dev0 == NULL) {
>   		printf("Cannot find net_null_test0 vdev\n");
>   		goto fail;
> @@ -93,7 +87,7 @@ test_vdev_bus(void)
>   		printf("Failed to create vdev net_null_test1\n");
>   		goto fail;
>   	}
> -	dev1 = vdev_bus->find_device(NULL, cmp_dev_name, "net_null_test1");
> +	dev1 = vdev_bus->find_device(NULL, rte_cmp_dev_name, "net_null_test1");
>   	if (dev1 == NULL) {
>   		printf("Cannot find net_null_test1 vdev\n");
>   		goto fail;
> diff --git a/drivers/bus/auxiliary/auxiliary_common.c b/drivers/bus/auxiliary/auxiliary_common.c
> index e6cbc4d356..ba2f69e851 100644
> --- a/drivers/bus/auxiliary/auxiliary_common.c
> +++ b/drivers/bus/auxiliary/auxiliary_common.c
> @@ -237,10 +237,9 @@ auxiliary_probe(void)
>   }
>   
>   static int
> -auxiliary_parse(const char *name, void *addr)
> +auxiliary_parse(const char *name, void *addr, int *size)
>   {
>   	struct rte_auxiliary_driver *drv = NULL;
> -	const char **out = addr;
>   
>   	/* Allow empty device name "auxiliary:" to bypass entire bus scan. */
>   	if (strlen(name) == 0)
> @@ -250,9 +249,17 @@ auxiliary_parse(const char *name, void *addr)
>   		if (drv->match(name))
>   			break;
>   	}
> -	if (drv != NULL && addr != NULL)
> -		*out = name;
> -	return drv != NULL ? 0 : -1;
> +
> +	if (drv == NULL)
> +		return -1;
> +
> +	if (size != NULL)
> +		*size = strlen(name) + 1;
> +
> +	if (addr != NULL)
> +		rte_strscpy(addr, name, strlen(name) + 1);
> +
> +	return 0;
>   }
>   
>   /* Register a driver */
> diff --git a/drivers/bus/cdx/cdx.c b/drivers/bus/cdx/cdx.c
> index 62b108e082..b97f1ce1af 100644
> --- a/drivers/bus/cdx/cdx.c
> +++ b/drivers/bus/cdx/cdx.c
> @@ -464,15 +464,20 @@ cdx_probe(void)
>   }
>   
>   static int
> -cdx_parse(const char *name, void *addr)
> +cdx_parse(const char *name, void *addr, int *size)
>   {
> -	const char **out = addr;
>   	int ret;
>   
>   	ret = strncmp(name, CDX_DEV_PREFIX, strlen(CDX_DEV_PREFIX));
>   
> -	if (ret == 0 && addr)
> -		*out = name;
> +	if (ret != 0)
> +		return ret;
> +
> +	if (size != NULL)
> +		*size = strlen(name) + 1;
> +
> +	if (addr != NULL)
> +		rte_strscpy(addr, name, strlen(name) + 1);
>   
>   	return ret;
>   }
> diff --git a/drivers/bus/dpaa/dpaa_bus.c b/drivers/bus/dpaa/dpaa_bus.c
> index 9ffbe07c93..f768fb9454 100644
> --- a/drivers/bus/dpaa/dpaa_bus.c
> +++ b/drivers/bus/dpaa/dpaa_bus.c
> @@ -153,7 +153,7 @@ dpaa_devargs_lookup(struct rte_dpaa_device *dev)
>   	char dev_name[32];
>   
>   	RTE_EAL_DEVARGS_FOREACH("dpaa_bus", devargs) {
> -		devargs->bus->parse(devargs->name, &dev_name);
> +		devargs->bus->parse(devargs->name, &dev_name, NULL);
>   		if (strcmp(dev_name, dev->device.name) == 0) {
>   			DPAA_BUS_INFO("**Devargs matched %s", dev_name);
>   			return devargs;
> @@ -447,7 +447,7 @@ dpaa_portal_finish(void *arg)
>   }
>   
>   static int
> -rte_dpaa_bus_parse(const char *name, void *out)
> +rte_dpaa_bus_parse(const char *name, void *out, int *size)
>   {
>   	unsigned int i, j;
>   	size_t delta, dev_delta;
> @@ -494,6 +494,9 @@ rte_dpaa_bus_parse(const char *name, void *out)
>   		max_name_len = sizeof("fm.-mac..") - 1;
>   	}
>   
> +	if (size != NULL)
> +		*size = max_name_len + 1;
> +
>   	if (out != NULL) {
>   		char *out_name = out;
>   
> diff --git a/drivers/bus/fslmc/fslmc_bus.c b/drivers/bus/fslmc/fslmc_bus.c
> index 68ad2b801e..a525b5e245 100644
> --- a/drivers/bus/fslmc/fslmc_bus.c
> +++ b/drivers/bus/fslmc/fslmc_bus.c
> @@ -103,7 +103,7 @@ fslmc_devargs_lookup(struct rte_dpaa2_device *dev)
>   	char dev_name[32];
>   
>   	RTE_EAL_DEVARGS_FOREACH("fslmc", devargs) {
> -		devargs->bus->parse(devargs->name, &dev_name);
> +		devargs->bus->parse(devargs->name, &dev_name, NULL);
>   		if (strcmp(dev_name, dev->device.name) == 0) {
>   			DPAA2_BUS_INFO("**Devargs matched %s", dev_name);
>   			return devargs;
> @@ -235,7 +235,7 @@ scan_one_fslmc_device(char *dev_name)
>   }
>   
>   static int
> -rte_fslmc_parse(const char *name, void *addr)
> +rte_fslmc_parse(const char *name, void *addr, int *size)
>   {
>   	uint16_t dev_id;
>   	char *t_ptr;
> @@ -298,7 +298,10 @@ rte_fslmc_parse(const char *name, void *addr)
>   		goto err_out;
>   	}
>   
> -	if (addr)
> +	if (size != NULL)
> +		*size = strlen(sep) + 1;
> +
> +	if (addr != NULL)
>   		strcpy(addr, sep);
>   };

for DPAA/FSLMC:

Acked-by: Hemant Agrawal <hemant.agrawal at nxp.com>




More information about the dev mailing list