[PATCH 10/23] bus: consolidate device iteration
David Marchand
david.marchand at redhat.com
Wed Apr 29 13:44:43 CEST 2026
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 <david.marchand at redhat.com>
---
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
More information about the dev
mailing list