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 <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?

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

Reply via email to