[dpdk-dev] [PATCH v8 04/14] eal/pci: Consolidate pci address comparison APIs
Iremonger, Bernard
bernard.iremonger at intel.com
Wed Feb 18 11:26:41 CET 2015
> -----Original Message-----
> From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Tetsuya Mukawa
> Sent: Wednesday, February 18, 2015 1:55 AM
> To: Thomas Monjalon
> Cc: dev at dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v8 04/14] eal/pci: Consolidate pci address comparison APIs
>
> On 2015/02/18 10:02, Thomas Monjalon wrote:
> > 2015-02-17 15:14, Tetsuya Mukawa:
> >> On 2015/02/17 9:44, Thomas Monjalon wrote:
> >>> 2015-02-16 13:14, Tetsuya Mukawa:
> >>>> @@ -356,13 +342,24 @@ pci_scan_one(int dev_pci_fd, struct pci_conf *conf)
> >>>> }
> >>>> else {
> >>>> struct rte_pci_device *dev2 = NULL;
> >>>> + int ret;
> >>>>
> >>>> TAILQ_FOREACH(dev2, &pci_device_list, next) {
> >>>> - if (pci_addr_comparison(&dev->addr, &dev2->addr))
> >>>> + ret = eal_compare_pci_addr(&dev->addr, &dev2->addr);
> >>>> + if (ret > 0)
> >>>> continue;
> >>>> - else {
> >>>> + else if (ret < 0) {
> >>>> TAILQ_INSERT_BEFORE(dev2, dev, next);
> >>>> return 0;
> >>>> + } else { /* already registered */
> >>>> + /* update pt_driver */
> >>>> + dev2->pt_driver = dev->pt_driver;
> >>>> + dev2->max_vfs = dev->max_vfs;
> >>>> + memmove(dev2->mem_resource,
> >>>> + dev->mem_resource,
> >>>> + sizeof(dev->mem_resource));
> >>>> + free(dev);
> >>>> + return 0;
> >>> Could you comment this "else part" please?
> >> PCI device list is allocated when rte_eal_init() is called. At the
> >> time, to fill pci device information, sysfs value is used.
> >> If sysfs values written by kernel device driver will not be changed
> >> by igb_uio, vfio or pci_uio_genereic, above code isn't needed.
> >> But actually above values are changed or added by them.
> >>
> >> Here is a step to cause issue.
> >> 1. Boot linux.
> >> 2. Start DPDK application without any physical NIC ports.
> >> - Here, some sysfs values are read, and store to pci device list.
> >> 3. igb_uio starts managing a port.
> >> - Here, some sysfs values are changed.
> >> 4. Add a NIC port to DPDK application using hotplug functions.
> >> - Here, we need to replace some values.
> > I think that you are showing that something is wrongly designed in
> > these EAL structures. I suggest to try cleaning this mess instead of workarounding.
Hi Tetsuya, Thomas,
I think that redesigning the EAL structures is beyond the scope of this patchset and should be undertaken as a separate task.
I suspect there may be a problem in the original code when a device which was using a kernel driver is bound to igb_uio. The igb_uio driver adds /sys/bus/pci/devices/0000\:05\:00.0/max_vfs.
Regards,
Bernard.
> >
> > [...]
> >>>> - if (memcmp(&uio_res->pci_addr, &dev->addr, sizeof(dev->addr)))
> >>>> + if (eal_compare_pci_addr(&uio_res->pci_addr, &dev->addr))
> >>> Why memcmp is not sufficient to compare PCI addresses?
> >>> The only exception I see is endianness for natural sorting.
> >> Here is the definition.
> >>
> >> struct rte_pci_addr {
> >> uint16_t domain; /**< Device domain */
> >> uint8_t bus; /**< Device bus */
> >> uint8_t devid; /**< Device ID */
> >> uint8_t function; /**< Device function. */
> >> };
> >>
> >> But, sizeof(struct rte_pci_addr) will be 6.
> >> If rte_pci_addr is allocated in a function without bzero, last 1 byte
> >> may have some value.
> >> As a result, memcmp may not work. To avoid such a case, I checked
> >> like above.
> > OK thanks. That's the kind of information which is valuable in a commit log.
> >
>
> Sure I will add it.
>
> Thanks,
> Tetsuya
More information about the dev
mailing list