New device should be represented by an rte_devarg prior to being plugged. Fixes: a3ee360f4440 ("eal: add hotplug add/remove device")
Signed-off-by: Gaetan Rivet <gaetan.ri...@6wind.com> --- lib/librte_eal/common/eal_common_dev.c | 43 +++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c index 292fefe..708c8e9 100644 --- a/lib/librte_eal/common/eal_common_dev.c +++ b/lib/librte_eal/common/eal_common_dev.c @@ -120,12 +120,32 @@ int rte_eal_dev_detach(struct rte_device *dev) return ret; } +static char * +full_dev_name(const char *bus, const char *dev, const char *args) +{ + char *name; + size_t len; + + len = strlen(bus) + 1 + + strlen(dev) + 1 + + strlen(args) + 1; + name = calloc(1, len); + if (name == NULL) { + RTE_LOG(ERR, EAL, "Could not allocate full device name\n"); + return NULL; + } + snprintf(name, len, "%s:%s,%s", bus, dev, + args ? args : ""); + return name; +} + struct rte_device * rte_eal_hotplug_add(const char *busname, const char *devname, const char *devargs) { struct rte_bus *bus; struct rte_device *dev; + char *name; int ret; bus = rte_bus_find_by_name(busname); @@ -142,10 +162,22 @@ rte_eal_hotplug_add(const char *busname, const char *devname, return NULL; } + name = full_dev_name(busname, devname, devargs); + if (name == NULL) { + rte_errno = ENOMEM; + return NULL; + } + + ret = rte_eal_devargs_add(RTE_DEVTYPE_WHITELISTED, name); + if (ret) { + rte_errno = EINVAL; + goto err_name; + } + ret = bus->scan(); if (ret) { rte_errno = -ret; - return NULL; + goto err_name; } dev = bus->find_device(NULL, cmp_detached_dev_name, devname); @@ -153,7 +185,7 @@ rte_eal_hotplug_add(const char *busname, const char *devname, RTE_LOG(ERR, EAL, "Cannot find unplugged device (%s)\n", devname); rte_errno = EINVAL; - return NULL; + goto err_name; } ret = bus->plug(dev, devargs); @@ -161,9 +193,14 @@ rte_eal_hotplug_add(const char *busname, const char *devname, RTE_LOG(ERR, EAL, "Driver cannot attach the device (%s)\n", dev->name); rte_errno = -ret; - return NULL; + goto err_name; } + free(name); return dev; + +err_name: + free(name); + return NULL; } int rte_eal_hotplug_remove(const char *busname, const char *devname) -- 2.1.4