[libvirt] [PATCH 15/24] hostdev: Remove virHostdevGetActivePCIHostDeviceList()

John Ferlan jferlan at redhat.com
Fri Mar 11 19:01:53 UTC 2016



On 03/10/2016 02:25 PM, John Ferlan wrote:
> 
> 
> On 03/10/2016 01:54 PM, John Ferlan wrote:
>>
>>
>> On 03/07/2016 12:24 PM, Andrea Bolognani wrote:
>>> virHostdevGetPCIHostDeviceList() is similar but does not filter out
>>> devices that are not in the active list; that said, we are looking
>>> up the device in the active list just a few lines after anyway, so
>>> we might as well just keep a single function around.
>>>
>>> This also helps stress the fact the objects contained in pcidevs are
>>> only for looking up the actual devices, which is something later
>>> commits will make even more explicit.
>>> ---
>>>  src/util/virhostdev.c | 50 ++++----------------------------------------------
>>>  1 file changed, 4 insertions(+), 46 deletions(-)
>>>

Please read my logic in patch 20 before doing anything - I'm in the
middle of it... scroll down for my short thoughts [1]...

John
> 
> <SIGH>  Should have read patch 18 & 19 first... Looks like I'm getting
> confuzzled by all these lists and multitude of ways names were
> generated. The comparison being done is against the copy that came from
> the activePCIHostdev list which will have the fields I was concerned
> about. So in retrospect...
> 
> ACK
> 
> John
>>
>>
>> Existing code uses virPCIDeviceListAddCopy (as does code that populates
>> inactiveDevs list).  The AddCopy code will
>>
>> 1. virPCIDeviceCopy(virPCIDevicePtr dev)
>>    VIR_ALLOC(copy);
>>    *copy = *dev;
>>    Update copy->path, copy->used_by_drvname, & copy->used_by_domname
>>
>> 2. Add to a virPCIDeviceListPtr
>>
>> The new code.
>>
>> 1. virPCIDeviceNew for a virPCIDevicePtr pci;
>>    VIR_ALLOC(dev);
>>    copy in dev->address
>>    generate dev->name, dev->id (similar to copy)
>>    generate dev->path from dev->name
>>
>> 2. Add to a virPCIDeviceListPtr
>>
>> 3. Caller sets the managed and stubDriver backend.
>>
>> NOTE: there's no copy of 'used_by_drvname' and 'used_by_domname', like
>> the copy function nor are a few other fields set.  This seems to be
>> important later [1].
>>
>>> diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c
>>> index fef7898..67e6e7b 100644
>>> --- a/src/util/virhostdev.c
>>> +++ b/src/util/virhostdev.c
>>> @@ -245,49 +245,6 @@ virHostdevGetPCIHostDeviceList(virDomainHostdevDefPtr *hostdevs, int nhostdevs)
>>>  }
>>>  
>>>  
>>> -/*
>>> - * virHostdevGetActivePCIHostDeviceList - make a new list with a *copy* of
>>> - *   every virPCIDevice object that is found on the activePCIHostdevs
>>> - *   list *and* is in the hostdev list for this domain.
>>> - *
>>> - * Return the new list, or NULL if there was a failure.
>>> - *
>>> - * Pre-condition: activePCIHostdevs is locked
>>> - */
>>> -static virPCIDeviceListPtr
>>> -virHostdevGetActivePCIHostDeviceList(virHostdevManagerPtr mgr,
>>> -                                     virDomainHostdevDefPtr *hostdevs,
>>> -                                     int nhostdevs)
>>> -{
>>> -    virPCIDeviceListPtr list;
>>> -    size_t i;
>>> -
>>> -    if (!(list = virPCIDeviceListNew()))
>>> -        return NULL;
>>> -
>>> -    for (i = 0; i < nhostdevs; i++) {
>>> -        virDomainHostdevDefPtr hostdev = hostdevs[i];
>>> -        virDevicePCIAddressPtr addr;
>>> -        virPCIDevicePtr activeDev;
>>> -
>>> -        if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
>>> -            continue;
>>> -        if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
>>> -            continue;
>>> -
>>> -        addr = &hostdev->source.subsys.u.pci.addr;
>>> -        activeDev = virPCIDeviceListFindByIDs(mgr->activePCIHostdevs,
>>> -                                              addr->domain, addr->bus,
>>> -                                              addr->slot, addr->function);
>>> -        if (activeDev && virPCIDeviceListAddCopy(list, activeDev) < 0) {
>>> -            virObjectUnref(list);
>>> -            return NULL;
>>> -        }
>>> -    }
>>> -
>>> -    return list;
>>> -}
>>> -
>>>  static int
>>>  virHostdevPCISysfsPath(virDomainHostdevDefPtr hostdev,
>>>                         char **sysfs_path)
>>> @@ -800,9 +757,7 @@ virHostdevReAttachPCIDevices(virHostdevManagerPtr hostdev_mgr,
>>>      virObjectLock(hostdev_mgr->activePCIHostdevs);
>>>      virObjectLock(hostdev_mgr->inactivePCIHostdevs);
>>>  
>>> -    if (!(pcidevs = virHostdevGetActivePCIHostDeviceList(hostdev_mgr,
>>> -                                                         hostdevs,
>>> -                                                         nhostdevs))) {
>>> +    if (!(pcidevs = virHostdevGetPCIHostDeviceList(hostdevs, nhostdevs))) {
>>>          virErrorPtr err = virGetLastError();
>>>          VIR_ERROR(_("Failed to allocate PCI device list: %s"),
>>>                    err ? err->message : _("unknown error"));
>>> @@ -832,6 +787,9 @@ virHostdevReAttachPCIDevices(virHostdevManagerPtr hostdev_mgr,
>>
>> [1] This code checks for usedby_drvname and usedby_domname
>>
>> These are set by virHostdevPreparePCIDevices and
>> virHostdevUpdateActivePCIDevices.  The virHostdevPreparePCIDevices is
>> the only current caller of virHostdevGetPCIHostDeviceList.  The latter
>> will call the virPCIDeviceNew and then set the Managed, UsedBy, and
>> stubDriver fields.
>>
>> The PreparePCIDevices code seems to do many of the same functions for
>> the activePCIHostdevs.
>>
>> I think this one needs to be rethought..
>>
>>
>> John
>>>                  virPCIDeviceListDel(pcidevs, dev);
>>>                  continue;

[1] this...

>>>              }
>>> +        } else {
>>> +            virPCIDeviceListDel(pcidevs, dev);
>>> +            continue;

[1] ... and this mean...
>>>          }
>>>  
>>>          VIR_DEBUG("Removing PCI device %s from active list",

[1] ... this doesn't happen!
>>>
>>




More information about the libvir-list mailing list