[dpdk-dev] [PATCH 02/38] eal: parse "driver" device argument before probing drivers

Jan Blunck jblunck at infradead.org
Mon Mar 6 10:59:54 CET 2017


In some cases the virtual device name should be totally different than
the driver being used for the device. Therefore lets parse the devargs for
the "driver" argument before probing drivers in vdev_probe_all_drivers().

Signed-off-by: Jan Blunck <jblunck at infradead.org>
---
 lib/librte_eal/common/eal_common_vdev.c | 48 +++++++++++++++++++++++++++++----
 1 file changed, 43 insertions(+), 5 deletions(-)

diff --git a/lib/librte_eal/common/eal_common_vdev.c b/lib/librte_eal/common/eal_common_vdev.c
index c922297..4b5c0eb 100644
--- a/lib/librte_eal/common/eal_common_vdev.c
+++ b/lib/librte_eal/common/eal_common_vdev.c
@@ -72,12 +72,48 @@ rte_eal_vdrv_unregister(struct rte_vdev_driver *driver)
 	TAILQ_REMOVE(&vdev_driver_list, driver, next);
 }
 
+/*
+ * Parse "driver" devargs without adding a dependency on rte_kvargs.h
+ */
+static char *parse_driver_arg(const char *args)
+{
+	char *str, *c;
+
+	if (!args || args[0] == '\0')
+		return NULL;
+
+	c = str = strdup(args);
+
+	do {
+		if (strncmp(c, "driver=", 7) == 0) {
+			c += 7;
+			break;
+		}
+
+		c = strchr(c, ',');
+		if (c)
+			c++;
+	} while (c);
+
+	if (!c)
+		free(str);
+
+	return c;
+}
+
 static int
 vdev_probe_all_drivers(struct rte_vdev_device *dev)
 {
-	const char *name = rte_vdev_device_name(dev);
+	const char *name;
+	char *drv_name;
 	struct rte_vdev_driver *driver;
-	int ret;
+	int ret = 1;
+
+	drv_name = parse_driver_arg(rte_vdev_device_args(dev));
+	name = drv_name ? drv_name : rte_vdev_device_name(dev);
+
+	RTE_LOG(DEBUG, EAL, "Search driver %s to probe device %s\n", name,
+		rte_vdev_device_name(dev));
 
 	TAILQ_FOREACH(driver, &vdev_driver_list, next) {
 		/*
@@ -92,7 +128,7 @@ vdev_probe_all_drivers(struct rte_vdev_device *dev)
 			ret = driver->probe(dev);
 			if (ret)
 				dev->device.driver = NULL;
-			return ret;
+			goto out;
 		}
 	}
 
@@ -105,11 +141,13 @@ vdev_probe_all_drivers(struct rte_vdev_device *dev)
 			ret = driver->probe(dev);
 			if (ret)
 				dev->device.driver = NULL;
-			return ret;
+			break;
 		}
 	}
 
-	return 1;
+out:
+	free(drv_name);
+	return ret;
 }
 
 static struct rte_vdev_device *
-- 
2.7.4



More information about the dev mailing list