@@ -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;
@@ -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 */
@@ -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;
}
@@ -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;
@@ -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);
ret = 0;
@@ -459,9 +459,8 @@ ifpga_find_device(const struct rte_device *start,
return NULL;
}
static int
-ifpga_parse(const char *name, void *addr)
+ifpga_parse(const char *name, void *addr, int *size)
{
- int *out = addr;
struct rte_rawdev *rawdev = NULL;
char rawdev_name[RTE_RAWDEV_NAME_MAX_LEN];
char *c1 = NULL;
@@ -491,9 +490,14 @@ ifpga_parse(const char *name, void *addr)
rawdev = rte_rawdev_pmd_get_named_dev(rawdev_name);
if ((port < IFPGA_BUS_DEV_PORT_MAX) &&
- rawdev &&
- (addr != NULL))
- *out = port;
+ rawdev) {
+ if (size != NULL)
+ *size = sizeof(port);
+
+ if (addr != NULL)
+ *(int *)addr = port;
+ }
+
if ((port < IFPGA_BUS_DEV_PORT_MAX) &&
rawdev)
@@ -84,7 +84,7 @@ pci_devargs_lookup(const struct rte_pci_addr *pci_addr)
struct rte_pci_addr addr;
RTE_EAL_DEVARGS_FOREACH("pci", devargs) {
- devargs->bus->parse(devargs->name, &addr);
+ devargs->bus->parse(devargs->name, &addr, NULL);
if (!rte_pci_addr_cmp(pci_addr, &addr))
return devargs;
}
@@ -487,12 +487,15 @@ rte_pci_dump(FILE *f)
}
static int
-pci_parse(const char *name, void *addr)
+pci_parse(const char *name, void *addr, int *size)
{
struct rte_pci_addr *out = addr;
struct rte_pci_addr pci_addr;
bool parse;
+ if (size != NULL)
+ *size = sizeof(struct rte_pci_addr);
+
parse = (rte_pci_addr_parse(name, &pci_addr) == 0);
if (parse && addr != NULL)
*out = pci_addr;
@@ -542,11 +542,10 @@ platform_bus_unplug(struct rte_device *dev)
}
static int
-platform_bus_parse(const char *name, void *addr)
+platform_bus_parse(const char *name, void *addr, int *size)
{
struct rte_platform_device pdev = { };
struct rte_platform_driver *pdrv;
- const char **out = addr;
rte_strscpy(pdev.name, name, sizeof(pdev.name));
@@ -555,10 +554,16 @@ platform_bus_parse(const char *name, void *addr)
break;
}
- if (pdrv != NULL && addr != NULL)
- *out = name;
+ if (pdrv == NULL)
+ return -ENODEV;
+
+ if (size != NULL)
+ *size = strlen(name) + 1;
- return pdrv != NULL ? 0 : -ENODEV;
+ if (addr != NULL)
+ rte_strscpy(addr, name, strlen(name) + 1);
+
+ return 0;
}
static int
@@ -20,6 +20,7 @@
#include <rte_errno.h>
#include <rte_log.h>
#include <rte_kvargs.h>
+#include <rte_string_fns.h>
#include <bus_driver.h>
#include "bus_uacce_driver.h"
@@ -529,15 +530,20 @@ uacce_find_device(const struct rte_device *start, rte_dev_cmp_t cmp, const void
}
static int
-uacce_parse(const char *name, void *addr)
+uacce_parse(const char *name, void *addr, int *size)
{
- const char **out = addr;
int ret;
ret = strncmp(name, UACCE_DEV_PREFIX, strlen(UACCE_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;
}
@@ -113,7 +113,7 @@ rte_vdev_remove_custom_scan(rte_vdev_scan_callback callback, void *user_arg)
}
static int
-vdev_parse(const char *name, void *addr)
+vdev_find_driver(const char *name, void *addr)
{
struct rte_vdev_driver **out = addr;
struct rte_vdev_driver *driver = NULL;
@@ -197,7 +197,7 @@ vdev_probe_all_drivers(struct rte_vdev_device *dev)
name = rte_vdev_device_name(dev);
VDEV_LOG(DEBUG, "Search driver to probe device %s", name);
- if (vdev_parse(name, &driver))
+ if (vdev_find_driver(name, &driver))
return -1;
iova_mode = rte_eal_iova_mode();
@@ -232,6 +232,23 @@ find_vdev(const char *name)
return NULL;
}
+static int
+vdev_parse(const char *name, void *addr, int *size)
+{
+ struct rte_vdev_driver *driver;
+
+ if (vdev_find_driver(name, &driver))
+ return 1;
+
+ if (size != NULL)
+ *size = strlen(name) + 1;
+
+ if (addr != NULL)
+ rte_strscpy(addr, name, strlen(name) + 1);
+
+ return 0;
+}
+
static struct rte_devargs *
alloc_devargs(const char *name, const char *args)
{
@@ -647,7 +664,7 @@ vdev_get_iommu_class(void)
TAILQ_FOREACH(dev, &vdev_device_list, next) {
name = rte_vdev_device_name(dev);
- if (vdev_parse(name, &driver))
+ if (vdev_find_driver(name, &driver))
continue;
if (driver->drv_flags & RTE_VDEV_DRV_NEED_IOVA_AS_VA)
@@ -245,13 +245,16 @@ rte_vmbus_cleanup(void)
}
static int
-vmbus_parse(const char *name, void *addr)
+vmbus_parse(const char *name, void *addr, int *size)
{
rte_uuid_t guid;
int ret;
+ if (size != NULL)
+ *size = sizeof(guid);
+
ret = rte_uuid_parse(name, guid);
- if (ret == 0 && addr)
+ if (ret == 0 && addr != NULL)
memcpy(addr, &guid, sizeof(guid));
return ret;
@@ -269,7 +272,7 @@ vmbus_devargs_lookup(struct rte_vmbus_device *dev)
rte_uuid_t addr;
RTE_EAL_DEVARGS_FOREACH("vmbus", devargs) {
- vmbus_parse(devargs->name, &addr);
+ vmbus_parse(devargs->name, &addr, NULL);
if (rte_uuid_compare(dev->device_id, addr) == 0)
return devargs;
@@ -47,7 +47,7 @@ static int dsa_probe(void);
static struct rte_device *dsa_find_device(const struct rte_device *start,
rte_dev_cmp_t cmp, const void *data);
static enum rte_iova_mode dsa_get_iommu_class(void);
-static int dsa_addr_parse(const char *name, void *addr);
+static int dsa_addr_parse(const char *name, void *addr, int *size);
/** List of devices */
TAILQ_HEAD(dsa_device_list, rte_dsa_device);
@@ -345,7 +345,7 @@ dsa_scan(void)
closedir(dev_dir);
return -ENOMEM;
}
- if (dsa_addr_parse(wq->d_name, &dev->addr) < 0) {
+ if (dsa_addr_parse(wq->d_name, &dev->addr, NULL) < 0) {
IDXD_PMD_ERR("Error parsing WQ name: %s", wq->d_name);
free(dev);
continue;
@@ -391,11 +391,14 @@ dsa_get_iommu_class(void)
}
static int
-dsa_addr_parse(const char *name, void *addr)
+dsa_addr_parse(const char *name, void *addr, int *size)
{
struct dsa_wq_addr *wq = addr;
unsigned int device_id, wq_id;
+ if (size != NULL)
+ *size = sizeof(struct dsa_wq_addr);
+
if (sscanf(name, "wq%u.%u", &device_id, &wq_id) != 2) {
IDXD_PMD_DEBUG("Parsing WQ name failed: %s", name);
return -1;
@@ -1833,12 +1833,6 @@ ifpga_cfg_probe(struct rte_vdev_device *vdev)
return ret;
}
-static int cmp_dev_name(const struct rte_device *dev, const void *_name)
-{
- const char *name = _name;
- return strcmp(dev->name, name);
-}
-
static int
ifpga_cfg_remove(struct rte_vdev_device *vdev)
{
@@ -1874,7 +1868,7 @@ ifpga_cfg_remove(struct rte_vdev_device *vdev)
args.port, args.bdf);
bus = rte_bus_find_by_name(RTE_STR(IFPGA_BUS_NAME));
if (bus) {
- if (bus->find_device(NULL, cmp_dev_name, dev_name)) {
+ if (bus->find_device(NULL, rte_cmp_dev_name, dev_name)) {
ret = rte_eal_hotplug_remove(RTE_STR(IFPGA_BUS_NAME),
dev_name);
}
@@ -200,7 +200,7 @@ bus_can_parse(const struct rte_bus *bus, const void *_name)
{
const char *name = _name;
- return !(bus->parse && bus->parse(name, NULL) == 0);
+ return !(bus->parse && bus->parse(name, NULL, NULL) == 0);
}
struct rte_bus *
@@ -107,11 +107,42 @@ struct dev_next_ctx {
#define CLSCTX(ptr) \
(((struct dev_next_ctx *)(intptr_t)ptr)->cls_str)
-static int cmp_dev_name(const struct rte_device *dev, const void *_name)
+int
+rte_cmp_dev_name(const struct rte_device *dev1, const void *name2)
{
- const char *name = _name;
+ void *parsed_name1;
+ void *parsed_name2;
+ int size1 = 0;
+ int size2 = 0;
+ int ret;
+
+ if (dev1->bus->parse(dev1->name, NULL, &size1) != 0 ||
+ dev1->bus->parse(name2, NULL, &size2) != 0)
+ return 1;
+
+ if (size1 != size2)
+ return 1;
+
+ parsed_name1 = malloc(size1);
+ if (parsed_name1 == NULL)
+ return 1;
+
+ parsed_name2 = malloc(size2);
+ if (parsed_name2 == NULL) {
+ free(parsed_name1);
+ return 1;
+ }
- return strcmp(dev->name, name);
+ memset(parsed_name1, 0, size1);
+ memset(parsed_name2, 0, size2);
+
+ dev1->bus->parse(dev1->name, parsed_name1, NULL);
+ dev1->bus->parse(name2, parsed_name2, NULL);
+
+ ret = memcmp(parsed_name1, parsed_name2, size1);
+ free(parsed_name1);
+ free(parsed_name2);
+ return ret;
}
int
@@ -197,7 +228,7 @@ local_dev_probe(const char *devargs, struct rte_device **new_dev)
if (ret)
goto err_devarg;
- dev = da->bus->find_device(NULL, cmp_dev_name, da->name);
+ dev = da->bus->find_device(NULL, rte_cmp_dev_name, da->name);
if (dev == NULL) {
EAL_LOG(ERR, "Cannot find device (%s)",
da->name);
@@ -335,7 +366,7 @@ rte_eal_hotplug_remove(const char *busname, const char *devname)
return -ENOENT;
}
- dev = bus->find_device(NULL, cmp_dev_name, devname);
+ dev = bus->find_device(NULL, rte_cmp_dev_name, devname);
if (dev == NULL) {
EAL_LOG(ERR, "Cannot find plugged device (%s)", devname);
return -EINVAL;
@@ -21,13 +21,6 @@ struct mp_reply_bundle {
void *peer;
};
-static int cmp_dev_name(const struct rte_device *dev, const void *_name)
-{
- const char *name = _name;
-
- return strcmp(dev->name, name);
-}
-
/**
* Secondary to primary request.
* start from function eal_dev_hotplug_request_to_primary.
@@ -135,7 +128,7 @@ __handle_secondary_request(void *param)
goto finish;
}
- dev = bus->find_device(NULL, cmp_dev_name, da.name);
+ dev = bus->find_device(NULL, rte_cmp_dev_name, da.name);
if (dev == NULL) {
EAL_LOG(ERR, "Cannot find plugged device (%s)", da.name);
ret = -ENOENT;
@@ -262,7 +255,7 @@ static void __handle_primary_request(void *param)
goto quit;
}
- dev = bus->find_device(NULL, cmp_dev_name, da->name);
+ dev = bus->find_device(NULL, rte_cmp_dev_name, da->name);
if (dev == NULL) {
EAL_LOG(ERR, "Cannot find plugged device (%s)", da->name);
ret = -ENOENT;
@@ -112,11 +112,32 @@ typedef int (*rte_bus_unplug_t)(struct rte_device *dev);
* should be written. If NULL, nothing should be written, which
* is not an error.
*
+ * @param[out] size
+ * device information size. If NULL, nothing should
+ * be written, which is not an error.
+ *
* @return
* 0 if parsing was successful.
* !0 for any error.
*/
-typedef int (*rte_bus_parse_t)(const char *name, void *addr);
+typedef int (*rte_bus_parse_t)(const char *name, void *addr, int *size);
+
+/**
+ * Bus specific device name comparison function.
+ *
+ * This type of function is used to compare a bus name with an arbitrary
+ * name.
+ *
+ * @param dev
+ * Device handle.
+ *
+ * @param name
+ * Name to compare against.
+ *
+ * @return
+ * 0 if the device matches the name. Nonzero otherwise.
+ */
+typedef int (*rte_bus_cmp_name_t)(const struct rte_device *dev, const void *name);
/**
* Parse bus part of the device arguments.
@@ -258,6 +279,7 @@ struct rte_bus {
rte_bus_plug_t plug; /**< Probe single device for drivers */
rte_bus_unplug_t unplug; /**< Remove single device from driver */
rte_bus_parse_t parse; /**< Parse a device name */
+ rte_bus_cmp_name_t cmp_name; /**< Compare device name */
rte_bus_devargs_parse_t devargs_parse; /**< Parse bus devargs */
rte_dev_dma_map_t dma_map; /**< DMA map for device in the bus */
rte_dev_dma_unmap_t dma_unmap; /**< DMA unmap for device in the bus */
@@ -17,6 +17,7 @@
#include <rte_config.h>
#include <rte_common.h>
+#include <rte_compat.h>
#include <rte_log.h>
#ifdef __cplusplus
@@ -170,6 +171,20 @@ int rte_dev_is_probed(const struct rte_device *dev);
int rte_eal_hotplug_add(const char *busname, const char *devname,
const char *drvargs);
+/**
+ * General device name comparison. Will compare by using the specific bus
+ * compare function or by comparing the names directly.
+ *
+ * @param dev
+ * Device handle.
+ * @param name
+ * Name to compare against.
+ * @return
+ * 0 if the device matches the name. Nonzero otherwise.
+ */
+__rte_internal
+int rte_cmp_dev_name(const struct rte_device *dev, const void *name);
+
/**
* Add matching devices.
*
@@ -91,14 +91,6 @@ static void sigbus_handler(int signum, siginfo_t *info,
EAL_LOG(DEBUG, "Success to handle SIGBUS for hot-unplug!");
}
-static int cmp_dev_name(const struct rte_device *dev,
- const void *_name)
-{
- const char *name = _name;
-
- return strcmp(dev->name, name);
-}
-
static int
dev_uev_socket_fd_create(void)
{
@@ -280,7 +272,7 @@ dev_uev_handler(__rte_unused void *param)
goto failure_handle_err;
}
- dev = bus->find_device(NULL, cmp_dev_name,
+ dev = bus->find_device(NULL, rte_cmp_dev_name,
uevent.devname);
if (dev == NULL) {
EAL_LOG(ERR, "Cannot find device (%s) on "
@@ -448,4 +448,5 @@ INTERNAL {
rte_mem_unmap;
rte_thread_create_internal_control;
rte_thread_set_prefixed_name;
+ rte_cmp_dev_name;
};