[dpdk-dev] [PATCH v8 01/14] eal_pci: Add flag to hold kernel driver type
Qiu, Michael
michael.qiu at intel.com
Tue Feb 17 04:09:19 CET 2015
On 2/17/2015 8:13 AM, Thomas Monjalon wrote:
> 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"?
We only care vfio and uio driver, here pass through means pass the
devices from kernel to userspace
If use "kernel driver"or "kn_driver", there will be some issue that we
set to "UNKNOWN" when the devices use the native linux 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.
Why NONE? Do you mean, leave it unset? RTE_PT_UNKNOWN equals to zero,
when code runs here means the devices does not have a driver or not bind
to any driver.
For virtio with port I/O, as I know it will use the kernel driver
virtio-pci. So it will not run here.
Thanks,
Michael
>
>> +
>> /* 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