On 2015/02/18 20:39, Iremonger, Bernard wrote:
>
>> -----Original Message-----
>> From: Thomas Monjalon [mailto:thomas.monjalon at 6wind.com]
>> Sent: Wednesday, February 18, 2015 10:33 AM
>> To: Iremonger, Bernard
>> Cc: Tetsuya Mukawa; dev at dpdk.org; ivan.boule at 6wind.com
>> Subject: Re: [dpdk-dev] [PATCH v8 04/14] eal/pci: Consolidate pci address 
>> comparison APIs
>>
>> Hi Bernard,
>>
>> 2015-02-18 10:26, Iremonger, Bernard:
>>> From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Tetsuya Mukawa
>>>> 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 strongly disagrees this opinion. We should never workaround design 
>> problems and add more
>> complex/weird code.
>> I think that this kind of consideration is the heart of some design problems 
>> we have to face today.
>> Please let's stop adding some code which just works without thinking the 
>> whole design.
>>
>>> 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.
> Hi Tomas, Tetsuya,
>
> In general, I agree that we should not workaround design problems.
> In this case I don't think there is a problem with the rte_pci_device and 
> pci_device_list structures.

I agree with it.

> The "already registered" device has been replaced. It would probably be 
> cleaner to remove the "already registered" device from the list and then add 
> the new device to the list rather than update the "already registered" device.
>

I guess "replacing" will not work, because rte_pci_device structure is
also registered in rte_eth_dev structure.
If we remove and free the pci device, I guess something goes wrong in
ethdev library.
Just removing is one more option, but it means there is a working pci
device that is not registered in the pci_device_list. I guess it's weird.

I still think updating may be correct behavior.
The pci_device_list is used like below when rte_eal_init() is called.

1. When rte_eal_pci_init() is called, all pci devices are registered in
the pci_device_list.
2. When rte_eal_dev_init() is called, dev_driver_list is traversed, and
if a PCI device for a driver is found in the pci_device_list, init() of
the driver is called.

I guess it's not so strange design.
But this design assumes pci_device_list is latest while matching a
driver registered in dev_driver_list.

 Now, we have hotplug patch.
I guess we should do same thing.
Before matching, we should update the pci_device_list.

Thanks,
Tetsuya

> Regards,
>
> Bernard.
>


Reply via email to