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.
>
> [...]
>>>> -          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

Reply via email to