The patch adds rte_eal_dev_init_one() and rte_eal_dev_close_one().
These are used for attaching and detaching virtual devices.

Signed-off-by: Tetsuya Mukawa <mukawa at igel.co.jp>
---
 lib/librte_eal/common/eal_common_dev.c  | 66 +++++++++++++++++++++++++++++++++
 lib/librte_eal/common/include/rte_dev.h |  6 +++
 lib/librte_eal/linuxapp/eal/Makefile    |  1 +
 3 files changed, 73 insertions(+)

diff --git a/lib/librte_eal/common/eal_common_dev.c 
b/lib/librte_eal/common/eal_common_dev.c
index eae5656..f573a54 100644
--- a/lib/librte_eal/common/eal_common_dev.c
+++ b/lib/librte_eal/common/eal_common_dev.c
@@ -32,10 +32,13 @@
  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */

+#include <stdio.h>
+#include <limits.h>
 #include <string.h>
 #include <inttypes.h>
 #include <sys/queue.h>

+#include <rte_ethdev.h>
 #include <rte_dev.h>
 #include <rte_devargs.h>
 #include <rte_debug.h>
@@ -107,3 +110,66 @@ rte_eal_dev_init(void)
        }
        return 0;
 }
+
+/* So far, linux only supports DPDK hotplug function. */
+#if defined(RTE_LIBRTE_EAL_HOTPLUG) && defined(RTE_LIBRTE_EAL_LINUXAPP)
+
+#define INVOKE_PROBE   (0)
+#define INVOKE_CLOSE   (1)
+
+static void
+rte_eal_dev_invoke(struct rte_driver *driver,
+               struct rte_devargs *devargs, int type)
+{
+       if ((driver == NULL) || (devargs == NULL))
+               return;
+
+       switch (type) {
+       case INVOKE_PROBE:
+               driver->init(devargs->virtual.drv_name, devargs->args);
+               break;
+       case INVOKE_CLOSE:
+               driver->close(devargs->virtual.drv_name, devargs->args);
+               break;
+       }
+}
+
+static int
+rte_eal_dev_find_and_invoke(const char *name, int type)
+{
+       struct rte_devargs *devargs;
+       struct rte_driver *driver;
+
+       if (name == NULL)
+               return -EINVAL;
+
+       /* call the init function for each virtual device */
+       TAILQ_FOREACH(devargs, &devargs_list, next) {
+
+               if (devargs->type != RTE_DEVTYPE_VIRTUAL)
+                       continue;
+
+               if (strncmp(name, devargs->virtual.drv_name, strlen(name)))
+                       continue;
+
+               TAILQ_FOREACH(driver, &dev_driver_list, next) {
+                       if (driver->type != PMD_VDEV)
+                               continue;
+
+                       /* search a driver prefix in virtual device name */
+                       if (!strncmp(driver->name, devargs->virtual.drv_name,
+                                       strlen(driver->name))) {
+                               rte_eal_dev_invoke(driver, devargs, type);
+                               break;
+                       }
+               }
+
+               if (driver == NULL) {
+                       RTE_LOG(WARNING, EAL, "no driver found for %s\n",
+                                 devargs->virtual.drv_name);
+               }
+               return 0;
+       }
+       return 1;
+}
+#endif /* RTE_LIBRTE_EAL_HOTPLUG & RTE_LIBRTE_EAL_LINUXAPP */
diff --git a/lib/librte_eal/common/include/rte_dev.h 
b/lib/librte_eal/common/include/rte_dev.h
index f7e3a10..71d40c3 100644
--- a/lib/librte_eal/common/include/rte_dev.h
+++ b/lib/librte_eal/common/include/rte_dev.h
@@ -57,6 +57,11 @@ TAILQ_HEAD(rte_driver_list, rte_driver);
 typedef int (rte_dev_init_t)(const char *name, const char *args);

 /**
+ * Close function called for each device driver once.
+ */
+typedef int (rte_dev_close_t)(const char *name, const char *args);
+
+/**
  * Driver type enumeration
  */
 enum pmd_type {
@@ -72,6 +77,7 @@ struct rte_driver {
        enum pmd_type type;                /**< PMD Driver type */
        const char *name;                   /**< Driver name. */
        rte_dev_init_t *init;              /**< Device init. function. */
+       rte_dev_close_t *close;            /**< Device close. function. */
 };

 /**
diff --git a/lib/librte_eal/linuxapp/eal/Makefile 
b/lib/librte_eal/linuxapp/eal/Makefile
index 72ecf3a..0ec83b5 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -41,6 +41,7 @@ CFLAGS += -I$(RTE_SDK)/lib/librte_eal/common/include
 CFLAGS += -I$(RTE_SDK)/lib/librte_ring
 CFLAGS += -I$(RTE_SDK)/lib/librte_mempool
 CFLAGS += -I$(RTE_SDK)/lib/librte_malloc
+CFLAGS += -I$(RTE_SDK)/lib/librte_mbuf
 CFLAGS += -I$(RTE_SDK)/lib/librte_ether
 CFLAGS += -I$(RTE_SDK)/lib/librte_ivshmem
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_ring
-- 
1.9.1

Reply via email to