Many buses (auxiliary, cdx, dpaa, fslmc, platform, uacce, vdev...) had nearly identical dev_iterate implementations using name-based matching: - Parse kvargs with "name" parameter - Match device name via strcmp - Call rte_bus_find_device()
Extend bus device iterator callback and introduce rte_bus_generic_dev_iterate() generic helper in EAL. Only the PCI bus is left with its matching on PCI address criteria. Signed-off-by: David Marchand <[email protected]> --- drivers/bus/auxiliary/auxiliary_common.c | 2 +- drivers/bus/auxiliary/auxiliary_params.c | 63 ----------------------- drivers/bus/auxiliary/meson.build | 5 +- drivers/bus/auxiliary/private.h | 6 --- drivers/bus/cdx/cdx.c | 52 +------------------ drivers/bus/dpaa/dpaa_bus.c | 46 +---------------- drivers/bus/fslmc/fslmc_bus.c | 46 +---------------- drivers/bus/pci/pci_params.c | 3 +- drivers/bus/pci/private.h | 6 ++- drivers/bus/platform/meson.build | 5 +- drivers/bus/platform/platform.c | 2 +- drivers/bus/platform/platform_params.c | 65 ------------------------ drivers/bus/platform/private.h | 7 --- drivers/bus/uacce/uacce.c | 48 +---------------- drivers/bus/vdev/meson.build | 5 +- drivers/bus/vdev/vdev.c | 20 +++++--- drivers/bus/vdev/vdev_logs.h | 16 ------ drivers/bus/vdev/vdev_params.c | 64 ----------------------- drivers/bus/vdev/vdev_private.h | 29 ----------- lib/eal/common/eal_common_bus.c | 41 +++++++++++++++ lib/eal/common/eal_common_dev.c | 4 +- lib/eal/include/bus_driver.h | 51 ++++++++++++++++++- lib/ethdev/rte_ethdev.c | 2 +- 23 files changed, 123 insertions(+), 465 deletions(-) delete mode 100644 drivers/bus/auxiliary/auxiliary_params.c delete mode 100644 drivers/bus/platform/platform_params.c delete mode 100644 drivers/bus/vdev/vdev_logs.h delete mode 100644 drivers/bus/vdev/vdev_params.c delete mode 100644 drivers/bus/vdev/vdev_private.h diff --git a/drivers/bus/auxiliary/auxiliary_common.c b/drivers/bus/auxiliary/auxiliary_common.c index eb0a27cc11..05299db8fe 100644 --- a/drivers/bus/auxiliary/auxiliary_common.c +++ b/drivers/bus/auxiliary/auxiliary_common.c @@ -346,7 +346,7 @@ struct rte_auxiliary_bus auxiliary_bus = { .dma_map = auxiliary_dma_map, .dma_unmap = auxiliary_dma_unmap, .get_iommu_class = auxiliary_get_iommu_class, - .dev_iterate = auxiliary_dev_iterate, + .dev_iterate = rte_bus_generic_dev_iterate, }, }; diff --git a/drivers/bus/auxiliary/auxiliary_params.c b/drivers/bus/auxiliary/auxiliary_params.c deleted file mode 100644 index 1a76155c67..0000000000 --- a/drivers/bus/auxiliary/auxiliary_params.c +++ /dev/null @@ -1,63 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause - * Copyright (c) 2021 NVIDIA Corporation & Affiliates - */ - -#include <string.h> - -#include <bus_driver.h> -#include <dev_driver.h> -#include <rte_errno.h> -#include <rte_kvargs.h> - -#include "private.h" - -enum auxiliary_params { - RTE_AUXILIARY_PARAM_NAME, -}; - -static const char * const auxiliary_params_keys[] = { - [RTE_AUXILIARY_PARAM_NAME] = "name", - NULL, -}; - -static int -auxiliary_dev_match(const struct rte_device *dev, - const void *_kvlist) -{ - const struct rte_kvargs *kvlist = _kvlist; - const char *key = auxiliary_params_keys[RTE_AUXILIARY_PARAM_NAME]; - const char *name; - - /* no kvlist arg, all devices match */ - if (kvlist == NULL) - return 0; - - /* if key is present in kvlist and does not match, filter device */ - name = rte_kvargs_get(kvlist, key); - if (name != NULL && strcmp(name, dev->name)) - return -1; - - return 0; -} - -void * -auxiliary_dev_iterate(const void *start, - const char *str, - const struct rte_dev_iterator *it __rte_unused) -{ - struct rte_kvargs *kvargs = NULL; - struct rte_device *dev; - - if (str != NULL) { - kvargs = rte_kvargs_parse(str, auxiliary_params_keys); - if (kvargs == NULL) { - AUXILIARY_LOG(ERR, "cannot parse argument list %s", - str); - rte_errno = EINVAL; - return NULL; - } - } - dev = rte_bus_generic_find_device(&auxiliary_bus.bus, start, auxiliary_dev_match, kvargs); - rte_kvargs_free(kvargs); - return dev; -} diff --git a/drivers/bus/auxiliary/meson.build b/drivers/bus/auxiliary/meson.build index 38d2f05d4b..846b714e2a 100644 --- a/drivers/bus/auxiliary/meson.build +++ b/drivers/bus/auxiliary/meson.build @@ -2,10 +2,7 @@ # Copyright (c) 2021 NVIDIA Corporation & Affiliates driver_sdk_headers += files('bus_auxiliary_driver.h') -sources = files( - 'auxiliary_common.c', - 'auxiliary_params.c', -) +sources = files('auxiliary_common.c') if is_linux cflags += '-DAUXILIARY_OS_SUPPORTED' sources += files( diff --git a/drivers/bus/auxiliary/private.h b/drivers/bus/auxiliary/private.h index 0b3d73a08d..659d798cd6 100644 --- a/drivers/bus/auxiliary/private.h +++ b/drivers/bus/auxiliary/private.h @@ -50,10 +50,4 @@ void auxiliary_on_scan(struct rte_auxiliary_device *aux_dev); bool auxiliary_match(const struct rte_auxiliary_driver *aux_drv, const struct rte_auxiliary_device *aux_dev); -/* - * Iterate over devices, matching any device against the provided string. - */ -void *auxiliary_dev_iterate(const void *start, const char *str, - const struct rte_dev_iterator *it); - #endif /* BUS_AUXILIARY_PRIVATE_H */ diff --git a/drivers/bus/cdx/cdx.c b/drivers/bus/cdx/cdx.c index 45c6e8335d..d6f83e2e80 100644 --- a/drivers/bus/cdx/cdx.c +++ b/drivers/bus/cdx/cdx.c @@ -86,15 +86,6 @@ struct rte_cdx_bus rte_cdx_bus; -enum cdx_params { - RTE_CDX_PARAM_NAME, -}; - -static const char * const cdx_params_keys[] = { - [RTE_CDX_PARAM_NAME] = "name", - NULL, -}; - static int cdx_get_kernel_driver_by_path(const char *filename, char *driver_name, size_t len) @@ -528,47 +519,6 @@ cdx_get_iommu_class(void) return RTE_IOVA_VA; } -static int -cdx_dev_match(const struct rte_device *dev, - const void *_kvlist) -{ - const struct rte_kvargs *kvlist = _kvlist; - const char *key = cdx_params_keys[RTE_CDX_PARAM_NAME]; - const char *name; - - /* no kvlist arg, all devices match */ - if (kvlist == NULL) - return 0; - - /* if key is present in kvlist and does not match, filter device */ - name = rte_kvargs_get(kvlist, key); - if (name != NULL && strcmp(name, dev->name)) - return -1; - - return 0; -} - -static void * -cdx_dev_iterate(const void *start, - const char *str, - const struct rte_dev_iterator *it __rte_unused) -{ - struct rte_kvargs *kvargs = NULL; - struct rte_device *dev; - - if (str != NULL) { - kvargs = rte_kvargs_parse(str, cdx_params_keys); - if (kvargs == NULL) { - CDX_BUS_ERR("cannot parse argument list %s", str); - rte_errno = EINVAL; - return NULL; - } - } - dev = rte_bus_generic_find_device(&rte_cdx_bus.bus, start, cdx_dev_match, kvargs); - rte_kvargs_free(kvargs); - return dev; -} - struct rte_cdx_bus rte_cdx_bus = { .bus = { .scan = cdx_scan, @@ -580,7 +530,7 @@ struct rte_cdx_bus rte_cdx_bus = { .dma_map = cdx_dma_map, .dma_unmap = cdx_dma_unmap, .get_iommu_class = cdx_get_iommu_class, - .dev_iterate = cdx_dev_iterate, + .dev_iterate = rte_bus_generic_dev_iterate, }, }; diff --git a/drivers/bus/dpaa/dpaa_bus.c b/drivers/bus/dpaa/dpaa_bus.c index 0bacc0e9d5..b3a754cbf4 100644 --- a/drivers/bus/dpaa/dpaa_bus.c +++ b/drivers/bus/dpaa/dpaa_bus.c @@ -845,50 +845,6 @@ dpaa_bus_unplug(struct rte_device *dev __rte_unused) return 0; } -static void * -dpaa_bus_dev_iterate(const void *start, const char *str, - const struct rte_dev_iterator *it __rte_unused) -{ - char *dup, *dev_name = NULL; - struct rte_device *dev; - - if (str == NULL) { - DPAA_BUS_DEBUG("No device string"); - return NULL; - } - - /* Expectation is that device would be name=device_name */ - if (strncmp(str, "name=", 5) != 0) { - DPAA_BUS_DEBUG("Invalid device string (%s)", str); - return NULL; - } - - /* Now that name=device_name format is available, split */ - dup = strdup(str); - if (dup == NULL) { - DPAA_BUS_DEBUG("Dup string (%s) failed!", str); - return NULL; - } - dev_name = dup + strlen("name="); - - if (start != NULL) { - dev = TAILQ_NEXT((const struct rte_device *)start, next); - } else { - dev = TAILQ_FIRST(&rte_dpaa_bus.bus.device_list); - } - - while (dev != NULL) { - if (strcmp(dev->name, dev_name) == 0) { - free(dup); - return dev; - } - dev = TAILQ_NEXT(dev, next); - } - - free(dup); - return NULL; -} - static int dpaa_bus_cleanup(void) { @@ -948,7 +904,7 @@ static struct rte_dpaa_bus rte_dpaa_bus = { .get_iommu_class = rte_dpaa_get_iommu_class, .plug = dpaa_bus_plug, .unplug = dpaa_bus_unplug, - .dev_iterate = dpaa_bus_dev_iterate, + .dev_iterate = rte_bus_generic_dev_iterate, .cleanup = dpaa_bus_cleanup, }, .max_push_rxq_num = DPAA_DEFAULT_PUSH_MODE_QUEUE, diff --git a/drivers/bus/fslmc/fslmc_bus.c b/drivers/bus/fslmc/fslmc_bus.c index 312145b712..716f0178b5 100644 --- a/drivers/bus/fslmc/fslmc_bus.c +++ b/drivers/bus/fslmc/fslmc_bus.c @@ -593,50 +593,6 @@ fslmc_bus_unplug(struct rte_device *rte_dev) return -ENODEV; } -static void * -fslmc_bus_dev_iterate(const void *start, const char *str, - const struct rte_dev_iterator *it __rte_unused) -{ - char *dup, *dev_name = NULL; - struct rte_device *dev; - - if (str == NULL) { - DPAA2_BUS_DEBUG("No device string"); - return NULL; - } - - /* Expectation is that device would be name=device_name */ - if (strncmp(str, "name=", 5) != 0) { - DPAA2_BUS_DEBUG("Invalid device string (%s)", str); - return NULL; - } - - /* Now that name=device_name format is available, split */ - dup = strdup(str); - if (dup == NULL) { - DPAA2_BUS_DEBUG("Dup string (%s) failed!", str); - return NULL; - } - dev_name = dup + strlen("name="); - - if (start != NULL) { - dev = TAILQ_NEXT(RTE_CAST_PTR(struct rte_device *, start), next); - } else { - dev = TAILQ_FIRST(&rte_fslmc_bus.bus.device_list); - } - - while (dev != NULL) { - if (strcmp(dev->name, dev_name) == 0) { - free(dup); - return dev; - } - dev = TAILQ_NEXT(dev, next); - } - - free(dup); - return NULL; -} - struct rte_fslmc_bus rte_fslmc_bus = { .bus = { .scan = rte_fslmc_scan, @@ -648,7 +604,7 @@ struct rte_fslmc_bus rte_fslmc_bus = { .get_iommu_class = rte_dpaa2_get_iommu_class, .plug = fslmc_bus_plug, .unplug = fslmc_bus_unplug, - .dev_iterate = fslmc_bus_dev_iterate, + .dev_iterate = rte_bus_generic_dev_iterate, }, .device_count = {0}, }; diff --git a/drivers/bus/pci/pci_params.c b/drivers/bus/pci/pci_params.c index d596c3bba8..e308c85ed2 100644 --- a/drivers/bus/pci/pci_params.c +++ b/drivers/bus/pci/pci_params.c @@ -59,7 +59,8 @@ pci_dev_match(const struct rte_device *dev, } void * -rte_pci_dev_iterate(const void *start, +rte_pci_dev_iterate(const struct rte_bus *bus __rte_unused, + const void *start, const char *str, const struct rte_dev_iterator *it __rte_unused) { diff --git a/drivers/bus/pci/private.h b/drivers/bus/pci/private.h index 52fa6b0f76..21637882f8 100644 --- a/drivers/bus/pci/private.h +++ b/drivers/bus/pci/private.h @@ -258,6 +258,9 @@ rte_pci_get_iommu_class(void); * matching any device against the provided * string. * + * @param bus + * A pointer to the bus structure. + * * @param start * Iteration starting point. * @@ -272,7 +275,8 @@ rte_pci_get_iommu_class(void); * NULL otherwise. */ void * -rte_pci_dev_iterate(const void *start, +rte_pci_dev_iterate(const struct rte_bus *bus, + const void *start, const char *str, const struct rte_dev_iterator *it); diff --git a/drivers/bus/platform/meson.build b/drivers/bus/platform/meson.build index 8633cc4e75..9b1f55c3bb 100644 --- a/drivers/bus/platform/meson.build +++ b/drivers/bus/platform/meson.build @@ -11,8 +11,5 @@ endif require_iova_in_mbuf = false deps += ['kvargs'] -sources = files( - 'platform_params.c', - 'platform.c', -) +sources = files('platform.c') driver_sdk_headers += files('bus_platform_driver.h') diff --git a/drivers/bus/platform/platform.c b/drivers/bus/platform/platform.c index c795bd4b9c..636f051049 100644 --- a/drivers/bus/platform/platform.c +++ b/drivers/bus/platform/platform.c @@ -562,7 +562,7 @@ struct rte_platform_bus platform_bus = { .dma_map = platform_bus_dma_map, .dma_unmap = platform_bus_dma_unmap, .get_iommu_class = platform_bus_get_iommu_class, - .dev_iterate = platform_bus_dev_iterate, + .dev_iterate = rte_bus_generic_dev_iterate, .cleanup = platform_bus_cleanup, }, }; diff --git a/drivers/bus/platform/platform_params.c b/drivers/bus/platform/platform_params.c deleted file mode 100644 index f8538a1d84..0000000000 --- a/drivers/bus/platform/platform_params.c +++ /dev/null @@ -1,65 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause - * Copyright(C) 2023 Marvell. - */ - -#include <string.h> -#include <errno.h> - -#include <rte_bus.h> -#include <rte_common.h> -#include <rte_dev.h> -#include <rte_errno.h> -#include <rte_kvargs.h> - -#include "bus_platform_driver.h" -#include "private.h" - -enum platform_params { - RTE_PLATFORM_PARAM_NAME, -}; - -static const char * const platform_params_keys[] = { - [RTE_PLATFORM_PARAM_NAME] = "name", - NULL -}; - -static int -platform_dev_match(const struct rte_device *dev, const void *_kvlist) -{ - const char *key = platform_params_keys[RTE_PLATFORM_PARAM_NAME]; - const struct rte_kvargs *kvlist = _kvlist; - const char *name; - - /* no kvlist arg, all devices match */ - if (kvlist == NULL) - return 0; - - /* if key is present in kvlist and does not match, filter device */ - name = rte_kvargs_get(kvlist, key); - if (name != NULL && strcmp(name, dev->name)) - return -1; - - return 0; -} - -void * -platform_bus_dev_iterate(const void *start, const char *str, - const struct rte_dev_iterator *it __rte_unused) -{ - struct rte_kvargs *kvargs = NULL; - struct rte_device *dev; - - if (str != NULL) { - kvargs = rte_kvargs_parse(str, platform_params_keys); - if (!kvargs) { - PLATFORM_LOG_LINE(ERR, "cannot parse argument list %s", str); - rte_errno = EINVAL; - return NULL; - } - } - - dev = rte_bus_generic_find_device(&platform_bus.bus, start, platform_dev_match, kvargs); - rte_kvargs_free(kvargs); - - return dev; -} diff --git a/drivers/bus/platform/private.h b/drivers/bus/platform/private.h index 81a8984052..bf5d75df03 100644 --- a/drivers/bus/platform/private.h +++ b/drivers/bus/platform/private.h @@ -28,11 +28,4 @@ extern int platform_bus_logtype; #define PLATFORM_LOG_LINE(level, ...) \ RTE_LOG_LINE(level, PLATFORM_BUS, __VA_ARGS__) -/* - * Iterate registered platform devices and find one that matches provided string. - */ -void * -platform_bus_dev_iterate(const void *start, const char *str, - const struct rte_dev_iterator *it __rte_unused); - #endif /* PLATFORM_PRIVATE_H */ diff --git a/drivers/bus/uacce/uacce.c b/drivers/bus/uacce/uacce.c index ef133a6ae7..153ebc5eea 100644 --- a/drivers/bus/uacce/uacce.c +++ b/drivers/bus/uacce/uacce.c @@ -44,14 +44,6 @@ struct rte_uacce_bus { /* Forward declaration of UACCE bus. */ static struct rte_uacce_bus uacce_bus; -enum uacce_params { - RTE_UACCE_PARAM_NAME, -}; - -static const char *const uacce_params_keys[] = { - [RTE_UACCE_PARAM_NAME] = "name", - NULL, -}; extern int uacce_bus_logtype; #define RTE_LOGTYPE_UACCE_BUS uacce_bus_logtype @@ -522,44 +514,6 @@ uacce_parse(const char *name, void *addr) return ret; } -static int -uacce_dev_match(const struct rte_device *dev, const void *_kvlist) -{ - const char *key = uacce_params_keys[RTE_UACCE_PARAM_NAME]; - const struct rte_kvargs *kvlist = _kvlist; - const char *name; - - /* no kvlist arg, all devices match. */ - if (kvlist == NULL) - return 0; - - /* if key is present in kvlist and does not match, filter device. */ - name = rte_kvargs_get(kvlist, key); - if (name != NULL && strcmp(name, dev->name)) - return -1; - - return 0; -} - -static void * -uacce_dev_iterate(const void *start, const char *str, - const struct rte_dev_iterator *it __rte_unused) -{ - struct rte_kvargs *kvargs = NULL; - struct rte_device *dev; - - if (str != NULL) { - kvargs = rte_kvargs_parse(str, uacce_params_keys); - if (kvargs == NULL) { - UACCE_BUS_ERR("cannot parse argument list %s", str); - return NULL; - } - } - dev = rte_bus_generic_find_device(&uacce_bus.bus, start, uacce_dev_match, kvargs); - rte_kvargs_free(kvargs); - return dev; -} - RTE_EXPORT_INTERNAL_SYMBOL(rte_uacce_avail_queues) int rte_uacce_avail_queues(struct rte_uacce_device *dev) @@ -676,7 +630,7 @@ static struct rte_uacce_bus uacce_bus = { .unplug = uacce_unplug, .find_device = rte_bus_generic_find_device, .parse = uacce_parse, - .dev_iterate = uacce_dev_iterate, + .dev_iterate = rte_bus_generic_dev_iterate, }, }; diff --git a/drivers/bus/vdev/meson.build b/drivers/bus/vdev/meson.build index 50f0c8918d..6487b0d672 100644 --- a/drivers/bus/vdev/meson.build +++ b/drivers/bus/vdev/meson.build @@ -1,10 +1,7 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright(c) 2017 Intel Corporation -sources = files( - 'vdev.c', - 'vdev_params.c', -) +sources = files('vdev.c') headers = files('rte_bus_vdev.h') driver_sdk_headers = files('bus_vdev_driver.h') diff --git a/drivers/bus/vdev/vdev.c b/drivers/bus/vdev/vdev.c index 9b88df8bdc..3e610bd780 100644 --- a/drivers/bus/vdev/vdev.c +++ b/drivers/bus/vdev/vdev.c @@ -10,12 +10,14 @@ #include <stdbool.h> #include <sys/queue.h> +#include <rte_os_shim.h> #include <eal_export.h> #include <rte_eal.h> #include <dev_driver.h> #include <bus_driver.h> #include <rte_common.h> #include <rte_devargs.h> +#include <rte_log.h> #include <rte_memory.h> #include <rte_tailq.h> #include <rte_spinlock.h> @@ -23,11 +25,15 @@ #include <rte_errno.h> #include "bus_vdev_driver.h" -#include "vdev_logs.h" -#include "vdev_private.h" #define VDEV_MP_KEY "bus_vdev_mp" +int vdev_logtype_bus; +#define RTE_LOGTYPE_VDEV_BUS vdev_logtype_bus + +#define VDEV_LOG(level, ...) \ + RTE_LOG_LINE_PREFIX(level, VDEV_BUS, "%s(): ", __func__, __VA_ARGS__) + /* Forward declare to access virtual bus name */ static struct rte_bus rte_vdev_bus; @@ -576,9 +582,9 @@ vdev_cleanup(void) return error; } -struct rte_device * -rte_vdev_find_device(const struct rte_bus *bus __rte_unused, const struct rte_device *start, - rte_dev_cmp_t cmp, const void *data) +static struct rte_device * +vdev_find_device(const struct rte_bus *bus __rte_unused, const struct rte_device *start, + rte_dev_cmp_t cmp, const void *data) { struct rte_device *dev; @@ -633,14 +639,14 @@ static struct rte_bus rte_vdev_bus = { .scan = vdev_scan, .probe = vdev_probe, .cleanup = vdev_cleanup, - .find_device = rte_vdev_find_device, + .find_device = vdev_find_device, .plug = vdev_plug, .unplug = vdev_unplug, .parse = vdev_parse, .dma_map = vdev_dma_map, .dma_unmap = vdev_dma_unmap, .get_iommu_class = vdev_get_iommu_class, - .dev_iterate = rte_vdev_dev_iterate, + .dev_iterate = rte_bus_generic_dev_iterate, }; RTE_REGISTER_BUS(vdev, rte_vdev_bus); diff --git a/drivers/bus/vdev/vdev_logs.h b/drivers/bus/vdev/vdev_logs.h deleted file mode 100644 index 38859ae4b7..0000000000 --- a/drivers/bus/vdev/vdev_logs.h +++ /dev/null @@ -1,16 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause - * Copyright(c) 2017 Intel Corporation - */ - -#ifndef _VDEV_LOGS_H_ -#define _VDEV_LOGS_H_ - -#include <rte_log.h> - -extern int vdev_logtype_bus; -#define RTE_LOGTYPE_VDEV_BUS vdev_logtype_bus - -#define VDEV_LOG(level, ...) \ - RTE_LOG_LINE_PREFIX(level, VDEV_BUS, "%s(): ", __func__, __VA_ARGS__) - -#endif /* _VDEV_LOGS_H_ */ diff --git a/drivers/bus/vdev/vdev_params.c b/drivers/bus/vdev/vdev_params.c deleted file mode 100644 index fedd82b25d..0000000000 --- a/drivers/bus/vdev/vdev_params.c +++ /dev/null @@ -1,64 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause - * Copyright 2018 Gaëtan Rivet - */ - -#include <errno.h> -#include <string.h> - -#include <dev_driver.h> -#include <rte_kvargs.h> -#include <rte_errno.h> - -#include "vdev_logs.h" -#include "vdev_private.h" - -enum vdev_params { - RTE_VDEV_PARAM_NAME, - RTE_VDEV_PARAM_MAX, -}; - -static const char * const vdev_params_keys[] = { - [RTE_VDEV_PARAM_NAME] = "name", - [RTE_VDEV_PARAM_MAX] = NULL, -}; - -static int -vdev_dev_match(const struct rte_device *dev, - const void *_kvlist) -{ - const struct rte_kvargs *kvlist = _kvlist; - const char *key = vdev_params_keys[RTE_VDEV_PARAM_NAME]; - const char *name; - - /* no kvlist arg, all devices match */ - if (kvlist == NULL) - return 0; - - /* if key is present in kvlist and does not match, filter device */ - name = rte_kvargs_get(kvlist, key); - if (name != NULL && strcmp(name, dev->name)) - return -1; - - return 0; -} - -void * -rte_vdev_dev_iterate(const void *start, - const char *str, - const struct rte_dev_iterator *it __rte_unused) -{ - struct rte_kvargs *kvargs = NULL; - struct rte_device *dev; - - if (str != NULL) { - kvargs = rte_kvargs_parse(str, vdev_params_keys); - if (kvargs == NULL) { - VDEV_LOG(ERR, "cannot parse argument list"); - rte_errno = EINVAL; - return NULL; - } - } - dev = rte_vdev_find_device(NULL, start, vdev_dev_match, kvargs); - rte_kvargs_free(kvargs); - return dev; -} diff --git a/drivers/bus/vdev/vdev_private.h b/drivers/bus/vdev/vdev_private.h deleted file mode 100644 index ac036693d8..0000000000 --- a/drivers/bus/vdev/vdev_private.h +++ /dev/null @@ -1,29 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause - * Copyright 2018 Gaëtan Rivet - */ - -#ifndef _VDEV_PRIVATE_H_ -#define _VDEV_PRIVATE_H_ - -#include <rte_os_shim.h> - -#ifdef __cplusplus -extern "C" { -#endif - -struct rte_device * -rte_vdev_find_device(const struct rte_bus *bus, - const struct rte_device *start, - rte_dev_cmp_t cmp, - const void *data); - -void * -rte_vdev_dev_iterate(const void *start, - const char *str, - const struct rte_dev_iterator *it); - -#ifdef __cplusplus -} -#endif - -#endif /* _VDEV_PRIVATE_H_ */ diff --git a/lib/eal/common/eal_common_bus.c b/lib/eal/common/eal_common_bus.c index f81d13e7d0..46a8e68532 100644 --- a/lib/eal/common/eal_common_bus.c +++ b/lib/eal/common/eal_common_bus.c @@ -9,6 +9,7 @@ #include <bus_driver.h> #include <rte_debug.h> #include <rte_devargs.h> +#include <rte_kvargs.h> #include <rte_string_fns.h> #include <rte_errno.h> @@ -432,3 +433,43 @@ rte_bus_remove_driver(struct rte_bus *bus, struct rte_driver *driver) TAILQ_REMOVE(&bus->driver_list, driver, next); driver->bus = NULL; } + +static int +bus_dev_match_by_name(const struct rte_device *dev, const void *_kvlist) +{ + const struct rte_kvargs *kvlist = _kvlist; + const char *name; + + if (kvlist == NULL) + return 0; + + name = rte_kvargs_get(kvlist, "name"); + if (name != NULL && strcmp(name, dev->name)) + return -1; + + return 0; +} + +RTE_EXPORT_INTERNAL_SYMBOL(rte_bus_generic_dev_iterate) +void * +rte_bus_generic_dev_iterate(const struct rte_bus *bus, + const void *start, + const char *str, + const struct rte_dev_iterator *it __rte_unused) +{ + static const char * const params_keys[] = { "name", NULL }; + struct rte_kvargs *kvargs = NULL; + struct rte_device *dev; + + if (str != NULL) { + kvargs = rte_kvargs_parse(str, params_keys); + if (kvargs == NULL) { + rte_errno = EINVAL; + return NULL; + } + } + + dev = rte_bus_generic_find_device(bus, start, bus_dev_match_by_name, kvargs); + rte_kvargs_free(kvargs); + return dev; +} diff --git a/lib/eal/common/eal_common_dev.c b/lib/eal/common/eal_common_dev.c index e08a0f9dbc..17e8901546 100644 --- a/lib/eal/common/eal_common_dev.c +++ b/lib/eal/common/eal_common_dev.c @@ -756,13 +756,13 @@ bus_next_dev_cmp(const struct rte_bus *bus, if (rte_errno != 0) return -1; if (it->cls_str == NULL) { - dev = bus->dev_iterate(dev, bus_str, it); + dev = bus->dev_iterate(bus, dev, bus_str, it); goto end; } /* cls_str != NULL */ if (dev == NULL) { next_dev_on_bus: - dev = bus->dev_iterate(dev, bus_str, it); + dev = bus->dev_iterate(bus, dev, bus_str, it); it->device = dev; } if (dev == NULL) diff --git a/lib/eal/include/bus_driver.h b/lib/eal/include/bus_driver.h index 31c9586a33..e3e52928f4 100644 --- a/lib/eal/include/bus_driver.h +++ b/lib/eal/include/bus_driver.h @@ -262,6 +262,32 @@ struct rte_bus_conf { */ typedef enum rte_iova_mode (*rte_bus_get_iommu_class_t)(void); +/** + * Per bus, device iteration function. + * + * Similar to rte_dev_iterate_t but also pass along the bus pointer. + * + * @param bus + * A pointer to the bus structure. + * + * @param start + * Starting iteration context. + * + * @param devstr + * Device description string. + * + * @param it + * Device iterator. + * + * @return + * The address of the current element matching the device description + * string. + */ +typedef void *(*rte_bus_dev_iterate_t)(const struct rte_bus *bus, + const void *start, + const char *devstr, + const struct rte_dev_iterator *it); + /** * A structure describing a generic bus. */ @@ -280,7 +306,7 @@ struct rte_bus { rte_dev_dma_unmap_t dma_unmap; /**< DMA unmap for device in the bus */ struct rte_bus_conf conf; /**< Bus configuration */ rte_bus_get_iommu_class_t get_iommu_class; /**< Get iommu class */ - rte_dev_iterate_t dev_iterate; /**< Device iterator. */ + rte_bus_dev_iterate_t dev_iterate; /**< Bus device iterator. */ rte_bus_hot_unplug_handler_t hot_unplug_handler; /**< handle hot-unplug failure on the bus */ rte_bus_sigbus_handler_t sigbus_handler; @@ -321,6 +347,29 @@ struct rte_devargs *rte_bus_find_devargs(const struct rte_bus *bus, const char * __rte_internal bool rte_bus_device_is_ignored(const struct rte_bus *bus, const char *dev_name); +/** + * Generic device iterator for buses using name-based matching. + * + * This helper implements the standard name-based device iteration pattern + * using kvargs parsing. Buses that only support "name" parameter matching + * can use this instead of implementing their own dev_iterate function. + * + * @param bus + * A pointer to the bus structure. + * @param start + * The starting device (NULL to start from the beginning). + * @param str + * The device filter string (e.g., "name=eth0"). + * + * @return + * Pointer to the matching device, or NULL if not found. + */ +__rte_internal +void *rte_bus_generic_dev_iterate(const struct rte_bus *bus, + const void *start, + const char *str, + const struct rte_dev_iterator *it); + /** * Helper for Bus registration. * The constructor has higher priority than PMD constructors. diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c index 2edc7a362e..43475bace9 100644 --- a/lib/ethdev/rte_ethdev.c +++ b/lib/ethdev/rte_ethdev.c @@ -313,7 +313,7 @@ rte_eth_iterator_next(struct rte_dev_iterator *iter) iter->class_device == NULL) { /* get next rte_device to try. */ iter->device = iter->bus->dev_iterate( - iter->device, iter->bus_str, iter); + iter->bus, iter->device, iter->bus_str, iter); if (iter->device == NULL) break; /* no more rte_device candidate */ } -- 2.53.0

