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

Reply via email to