[dpdk-dev,v6,02/22] eal: fix hotplug add
Checks
Commit Message
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.rivet@6wind.com>
---
lib/librte_eal/common/eal_common_dev.c | 43 +++++++++++++++++++++++++++++++---
1 file changed, 40 insertions(+), 3 deletions(-)
@@ -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)