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

Reply via email to