On 2014/12/9 14:33, Tetsuya Mukawa wrote: > 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. */
Sorry, I don't know if I get your point, should be "only linux" right? > +#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