From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tetsuya Mukawa Subject: Re: [PATCH v3 15/28] eal/pci: Add probe and close function for virtual drivers Date: Thu, 11 Dec 2014 12:14:42 +0900 Message-ID: <54890C22.7060703@igel.co.jp> References: <1416474399-16851-1-git-send-email-mukawa@igel.co.jp> <1418106629-22227-1-git-send-email-mukawa@igel.co.jp> <1418106629-22227-16-git-send-email-mukawa@igel.co.jp> <533710CFB86FA344BFBF2D6802E60286C9E24E@SHSMSX101.ccr.corp.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Cc: "nakajima.yoshihiro-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org" , "masutani.hitoshi-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org" , "menrigh-43mecJUBy8ZBDgjK7y7TUQ@public.gmane.org" To: "Qiu, Michael" , "dev-VfR2kkLFssw@public.gmane.org" Return-path: In-Reply-To: <533710CFB86FA344BFBF2D6802E60286C9E24E-0J0gbvR4kThpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org> List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces-VfR2kkLFssw@public.gmane.org Sender: "dev" Hi Michael, (2014/12/10 0:51), Qiu, Michael wrote: > 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 >> --- >> 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 >> +#include >> #include >> #include >> #include >> >> +#include >> #include >> #include >> #include >> @@ -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? I am sorry for my bad English. "DPDK hotplug function only supports linux" will be correct. Thanks, Tetsuya > >> +#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