[dpdk-dev,v3,15/28] eal/pci: Add probe and close function for virtual drivers
Commit Message
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@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(+)
Comments
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@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
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@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
@@ -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 */
@@ -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. */
};
/**
@@ -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