[dpdk-dev] [PATCH v11 3/5] eal: support link bonding device initialization

Declan Doherty declan.doherty at intel.com
Sun Jun 29 19:49:19 CEST 2014


Updating functionality in EAL to support adding link bonding
devices via –vdev option. Link bonding devices will be
initialized after all physical devices have been probed and
initialized.

Signed-off-by: Declan Doherty <declan.doherty at intel.com>
Acked-by: Pablo de Lara <pablo.de.lara.guarch at intel.com>
---
 lib/librte_eal/bsdapp/eal/eal.c             |   10 ++++-
 lib/librte_eal/common/eal_common_dev.c      |   58 ++++++++++++++++++--------
 lib/librte_eal/common/eal_common_pci.c      |    3 +
 lib/librte_eal/common/include/eal_private.h |    7 ---
 lib/librte_eal/common/include/rte_dev.h     |   14 ++++++-
 lib/librte_eal/linuxapp/eal/eal.c           |   11 +++++-
 6 files changed, 74 insertions(+), 29 deletions(-)

diff --git a/lib/librte_eal/bsdapp/eal/eal.c b/lib/librte_eal/bsdapp/eal/eal.c
index a1f014f..c53f63e 100644
--- a/lib/librte_eal/bsdapp/eal/eal.c
+++ b/lib/librte_eal/bsdapp/eal/eal.c
@@ -874,7 +874,7 @@ rte_eal_init(int argc, char **argv)
 
 	rte_eal_mcfg_complete();
 
-	if (rte_eal_dev_init() < 0)
+	if (rte_eal_dev_init(PMD_INIT_PRE_PCI_PROBE) < 0)
 		rte_panic("Cannot init pmd devices\n");
 
 	RTE_LCORE_FOREACH_SLAVE(i) {
@@ -906,6 +906,14 @@ rte_eal_init(int argc, char **argv)
 	rte_eal_mp_remote_launch(sync_func, NULL, SKIP_MASTER);
 	rte_eal_mp_wait_lcore();
 
+	/* Probe & Initialize PCI devices */
+	if (rte_eal_pci_probe())
+			rte_panic("Cannot probe PCI\n");
+
+	/* Initialize any outstanding devices */
+	if (rte_eal_dev_init(PMD_INIT_POST_PCI_PROBE) < 0)
+		rte_panic("Cannot init pmd devices\n");
+
 	return fctret;
 }
 
diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c
index eae5656..1194419 100644
--- a/lib/librte_eal/common/eal_common_dev.c
+++ b/lib/librte_eal/common/eal_common_dev.c
@@ -62,7 +62,7 @@ rte_eal_driver_unregister(struct rte_driver *driver)
 }
 
 int
-rte_eal_dev_init(void)
+rte_eal_dev_init(uint8_t init_pri)
 {
 	struct rte_devargs *devargs;
 	struct rte_driver *driver;
@@ -80,30 +80,52 @@ rte_eal_dev_init(void)
 			continue;
 
 		TAILQ_FOREACH(driver, &dev_driver_list, next) {
-			if (driver->type != PMD_VDEV)
-				continue;
+			/* RTE_DEVTYPE_VIRTUAL can only be a virtual or bonded device,
+			 * virtual devices are initialized pre PCI probing and bonded
+			 * device are post pci probing */
+			if ((driver->type == PMD_VDEV && init_pri ==
+					PMD_INIT_PRE_PCI_PROBE) ||
+				(driver->type == PMD_BDEV && init_pri ==
+						PMD_INIT_POST_PCI_PROBE)) {
 
-			/* search a driver prefix in virtual device name */
-			if (!strncmp(driver->name, devargs->virtual.drv_name,
-					strlen(driver->name))) {
-				driver->init(devargs->virtual.drv_name,
-					devargs->args);
-				break;
+				/* search a driver prefix in virtual device name */
+				if (!strncmp(driver->name, devargs->virtual.drv_name,
+						strlen(driver->name))) {
+					printf("init (%u) %s\n", init_pri, devargs->virtual.drv_name);
+					driver->init(devargs->virtual.drv_name,
+						devargs->args);
+					break;
+				}
 			}
 		}
 
-		if (driver == NULL) {
-			rte_panic("no driver found for %s\n",
-				  devargs->virtual.drv_name);
+		/* If initializing pre PCI probe, then we don't expect a bonded driver
+		 * to be found */
+		if (init_pri == PMD_INIT_PRE_PCI_PROBE &&
+				strncmp(PMD_BOND_NAME, devargs->virtual.drv_name,
+					strlen(PMD_BOND_NAME)) != 0) {
+			if (driver == NULL) {
+				rte_panic("no driver found for virtual device %s\n",
+					devargs->virtual.drv_name);
+			}
+		} else if (init_pri == PMD_INIT_POST_PCI_PROBE &&
+				strncmp(PMD_BOND_NAME, devargs->virtual.drv_name,
+					strlen(PMD_BOND_NAME)) == 0) {
+			if (driver == NULL) {
+				rte_panic("no driver found for bonded device %s\n",
+					devargs->virtual.drv_name);
+			}
 		}
 	}
 
-	/* Once the vdevs are initalized, start calling all the pdev drivers */
-	TAILQ_FOREACH(driver, &dev_driver_list, next) {
-		if (driver->type != PMD_PDEV)
-			continue;
-		/* PDEV drivers don't get passed any parameters */
-		driver->init(NULL, NULL);
+	/* Once the vdevs are initialized, start calling all the pdev drivers */
+	if (init_pri == PMD_INIT_PRE_PCI_PROBE) {
+		TAILQ_FOREACH(driver, &dev_driver_list, next) {
+			if (driver->type != PMD_PDEV)
+				continue;
+			/* PDEV drivers don't get passed any parameters */
+			driver->init(NULL, NULL);
+		}
 	}
 	return 0;
 }
diff --git a/lib/librte_eal/common/eal_common_pci.c b/lib/librte_eal/common/eal_common_pci.c
index af809a8..c637361 100644
--- a/lib/librte_eal/common/eal_common_pci.c
+++ b/lib/librte_eal/common/eal_common_pci.c
@@ -150,6 +150,9 @@ rte_eal_pci_probe(void)
 		probe_all = 1;
 
 	TAILQ_FOREACH(dev, &pci_device_list, next) {
+		/* check if device has already been initialized */
+		if (dev->driver != NULL)
+			continue;
 
 		/* set devargs in PCI structure */
 		devargs = pci_devargs_lookup(dev);
diff --git a/lib/librte_eal/common/include/eal_private.h b/lib/librte_eal/common/include/eal_private.h
index 232fcec..b440ffb 100644
--- a/lib/librte_eal/common/include/eal_private.h
+++ b/lib/librte_eal/common/include/eal_private.h
@@ -196,11 +196,4 @@ int rte_eal_intr_init(void);
  */
 int rte_eal_alarm_init(void);
 
-/**
- * This function initialises any virtual devices
- *
- * This function is private to the EAL.
- */
-int rte_eal_dev_init(void);
-
 #endif /* _EAL_PRIVATE_H_ */
diff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h
index f7e3a10..d89f1a5 100644
--- a/lib/librte_eal/common/include/rte_dev.h
+++ b/lib/librte_eal/common/include/rte_dev.h
@@ -62,6 +62,16 @@ typedef int (rte_dev_init_t)(const char *name, const char *args);
 enum pmd_type {
 	PMD_VDEV = 0,
 	PMD_PDEV = 1,
+	PMD_BDEV = 2,	/**< Poll Mode Driver Bonded Device*/
+};
+
+#define PMD_BOND_NAME "eth_bond"
+
+/**
+ * Driver initialization */
+enum pmd_init_priority {
+	PMD_INIT_PRE_PCI_PROBE = 0,
+	PMD_INIT_POST_PCI_PROBE = 1,
 };
 
 /**
@@ -93,9 +103,9 @@ void rte_eal_driver_register(struct rte_driver *driver);
 void rte_eal_driver_unregister(struct rte_driver *driver);
 
 /**
- * Initalize all the registered drivers in this process
+ * Initialize all the registered drivers in this process
  */
-int rte_eal_dev_init(void);
+int rte_eal_dev_init(uint8_t init_priority);
 
 #define PMD_REGISTER_DRIVER(d)\
 void devinitfn_ ##d(void);\
diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c
index d204387..573fd06 100644
--- a/lib/librte_eal/linuxapp/eal/eal.c
+++ b/lib/librte_eal/linuxapp/eal/eal.c
@@ -75,6 +75,7 @@
 #include <rte_atomic.h>
 #include <malloc_heap.h>
 #include <rte_eth_ring.h>
+#include <rte_dev.h>
 
 #include "eal_private.h"
 #include "eal_thread.h"
@@ -1097,7 +1098,7 @@ rte_eal_init(int argc, char **argv)
 	RTE_LOG(DEBUG, EAL, "Master core %u is ready (tid=%x)\n",
 		rte_config.master_lcore, (int)thread_id);
 
-	if (rte_eal_dev_init() < 0)
+	if (rte_eal_dev_init(PMD_INIT_PRE_PCI_PROBE) < 0)
 		rte_panic("Cannot init pmd devices\n");
 
 	RTE_LCORE_FOREACH_SLAVE(i) {
@@ -1127,6 +1128,14 @@ rte_eal_init(int argc, char **argv)
 	rte_eal_mp_remote_launch(sync_func, NULL, SKIP_MASTER);
 	rte_eal_mp_wait_lcore();
 
+	/* Probe & Initialize PCI devices */
+	if (rte_eal_pci_probe())
+			rte_panic("Cannot probe PCI\n");
+
+	/* Initialize any outstanding devices */
+	if (rte_eal_dev_init(PMD_INIT_POST_PCI_PROBE) < 0)
+		rte_panic("Cannot init pmd devices\n");
+
 	return fctret;
 }
 
-- 
1.7.0.7



More information about the dev mailing list