[dpdk-dev] [PATCH v8 01/14] eal_pci: Add flag to hold kernel driver type
Thomas Monjalon
thomas.monjalon at 6wind.com
Tue Feb 17 01:12:46 CET 2015
2015-02-16 13:14, Tetsuya Mukawa:
> From: Michael Qiu <michael.qiu at intel.com>
>
> Currently, dpdk has no ability to know which type of driver(
> vfio-pci/igb_uio/uio_pci_generic) the device used. It only can
> check whether vfio is enabled or not staticly.
>
> It really useful to have the flag, becasue different type need to
> handle differently in runtime. For example, pci memory map,
> pot hotplug, and so on.
>
> This patch add a flag field for pci device to solve above issue.
>
> Signed-off-by: Michael Qiu <michael.qiu at intel.com>
> Signed-off-by: Tetsuya Mukawa <mukawa at igel.co.jp>
> ---
> lib/librte_eal/common/include/rte_pci.h | 8 +++++
> lib/librte_eal/linuxapp/eal/eal_pci.c | 53 +++++++++++++++++++++++++++++++--
> 2 files changed, 59 insertions(+), 2 deletions(-)
>
> diff --git a/lib/librte_eal/common/include/rte_pci.h b/lib/librte_eal/common/include/rte_pci.h
> index 66ed793..7b48b55 100644
> --- a/lib/librte_eal/common/include/rte_pci.h
> +++ b/lib/librte_eal/common/include/rte_pci.h
> @@ -139,6 +139,13 @@ struct rte_pci_addr {
>
> struct rte_devargs;
>
> +enum rte_pt_driver {
> + RTE_PT_UNKNOWN = 0,
> + RTE_PT_IGB_UIO = 1,
> + RTE_PT_VFIO = 2,
> + RTE_PT_UIO_GENERIC = 3,
> +};
What means PT?
> +
> /**
> * A structure describing a PCI device.
> */
> @@ -152,6 +159,7 @@ struct rte_pci_device {
> uint16_t max_vfs; /**< sriov enable if not zero */
> int numa_node; /**< NUMA node connection */
> struct rte_devargs *devargs; /**< Device user arguments */
> + enum rte_pt_driver pt_driver; /**< Driver of passthrough */
I'm not sure passtrough is the right word for this kind of driver.
What about "kernel driver"?
> };
>
> /** Any PCI device identifier (vendor, device, ...) */
> diff --git a/lib/librte_eal/linuxapp/eal/eal_pci.c b/lib/librte_eal/linuxapp/eal/eal_pci.c
> index 15db9c4..e760452 100644
> --- a/lib/librte_eal/linuxapp/eal/eal_pci.c
> +++ b/lib/librte_eal/linuxapp/eal/eal_pci.c
> @@ -97,6 +97,35 @@ error:
> return -1;
> }
>
> +static int
> +pci_get_kernel_driver_by_path(const char *filename, char *dri_name)
> +{
> + int count;
> + char path[PATH_MAX];
> + char *name;
> +
> + if (!filename || !dri_name)
> + return -1;
> +
> + count = readlink(filename, path, PATH_MAX);
> + if (count >= PATH_MAX)
> + return -1;
> +
> + /* For device does not have a driver */
> + if (count < 0)
> + return 1;
> +
> + path[count] = '\0';
> +
> + name = strrchr(path, '/');
> + if (name) {
> + strncpy(dri_name, name + 1, strlen(name + 1) + 1);
> + return 0;
> + }
> +
> + return -1;
> +}
> +
> void *
> pci_find_max_end_va(void)
> {
> @@ -222,11 +251,12 @@ pci_scan_one(const char *dirname, uint16_t domain, uint8_t bus,
> char filename[PATH_MAX];
> unsigned long tmp;
> struct rte_pci_device *dev;
> + char driver[PATH_MAX];
> + int ret;
>
> dev = malloc(sizeof(*dev));
> - if (dev == NULL) {
> + if (dev == NULL)
> return -1;
> - }
>
> memset(dev, 0, sizeof(*dev));
> dev->addr.domain = domain;
> @@ -305,6 +335,25 @@ pci_scan_one(const char *dirname, uint16_t domain, uint8_t bus,
> return -1;
> }
>
> + /* parse driver */
> + snprintf(filename, sizeof(filename), "%s/driver", dirname);
> + ret = pci_get_kernel_driver_by_path(filename, driver);
> + if (!ret) {
> + if (!strcmp(driver, "vfio-pci"))
> + dev->pt_driver = RTE_PT_VFIO;
> + else if (!strcmp(driver, "igb_uio"))
> + dev->pt_driver = RTE_PT_IGB_UIO;
> + else if (!strcmp(driver, "uio_pci_generic"))
> + dev->pt_driver = RTE_PT_UIO_GENERIC;
> + else
> + dev->pt_driver = RTE_PT_UNKNOWN;
> + } else if (ret < 0) {
> + RTE_LOG(ERR, EAL, "Fail to get kernel driver\n");
> + free(dev);
> + return -1;
> + } else
> + dev->pt_driver = RTE_PT_UNKNOWN;
Why not considering a NONE value? Example: for virtio with port I/O.
> +
> /* device is valid, add in list (sorted) */
> if (TAILQ_EMPTY(&pci_device_list)) {
> TAILQ_INSERT_TAIL(&pci_device_list, dev, next);
>
More information about the dev
mailing list