[libvirt] [PATCH 21/24] hostdev: Stop early if unmanaged devices have not been detached

John Ferlan jferlan at redhat.com
Tue Mar 15 18:38:56 UTC 2016



On 03/15/2016 07:54 AM, Andrea Bolognani wrote:
> On Sat, 2016-03-12 at 09:23 -0500, John Ferlan wrote:
>> On 03/07/2016 12:24 PM, Andrea Bolognani wrote:
>>>  
>>> Unmanaged devices, as the name suggests, are not detached
>>> automatically from the host by libvirt before being attached to a
>>> guest: it's the user's responsability to detach them manually
>>> beforehand. If that preliminary step has not been performed, the
>>> attach operation can't complete successfully.
>>>  
>>> Instead of relying on the lower layers to error out with cryptic
>>> messages such as
>>>  
>>>    error: Failed to attach device from /tmp/hostdev.xml
>>>    error: Path '/dev/vfio/12' is not accessible: No such file or directory
>>>  
>>> prevent the situation altogether and provide the user with a more
>>> useful error message.
>>> ---
>>>   src/util/virhostdev.c | 7 +++++++
>>>   1 file changed, 7 insertions(+)
>>>  
>>> diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c
>>> index 03c3445..d1529c5 100644
>>> --- a/src/util/virhostdev.c
>>> +++ b/src/util/virhostdev.c
>>> @@ -576,6 +576,13 @@ virHostdevPreparePCIDevices(virHostdevManagerPtr mgr,
>>>                                      mgr->inactivePCIHostdevs) < 0)
>>  
>> Is this in the right place?
>>  
>> Consider a few lines above:
>>  
>>      /* Step 1: validate that non-managed device isn't in use, ...
> 
> Well, that comment is not really 100% accurate now that I look
> at it.
> 
> What the code in step 1 is really doing is making sure that the
> device is assignable (virPCIDeviceIsAssignable(), haven't really
> investigated that function TBH so I'm just assuming it's doing
> something valuable ;) and that none of the devices we're about
> to assign to the guest have already been assigned to another
> guest - or, in the case of VFIO, that no devices that are in
> the same IOMMU group as a device we're about to assign to the
> guest have already been assigned to another guest.
> 
> There are actually no checks on unmanaged devices, and rightly
> so: it's totally okay to add unmanaged devices to a guest!
> 
> We just have to make sure the user has actually taken care to
> detach the device from the host first, hence the new check I'm
> adding with this commit.
> 
> The comment for step 1 needs some work, though, as you point
> out...
> 
>> Second question - how would the device get on the inactiveList
>> initially? Looking at virPCIDeviceListAdd calls for inactiveList.
>>  
>> 'pcidevs' is the list of all devices both managed and unmanaged
>>  
>> 'activeList' is populated in step 5 and virHostdevUpdateActivePCIDevices
>>  
>> 'inactiveList' is populated in 'inactivedevs:' label, in step 2 of
>> virHostdevReAttachPCIDevices, and in virPCIDeviceDetach via
>> virPCIDeviceListAddCopy *if* the device is managed in step 2 of Prepare.
> 
> 'pcidevs' is not the list of all devices, it's the list
> of (really just names of) devices that we're handling at the
> moment. It's our working set, basically. But yes, devices
> in 'pcidevs' can be both managed or unmanaged.
> 
> As for your question, a device might end up in the inactive
> list because of:
> 
>   * PreparePCIDevices(), step 2, if managed. Just temporarily,
>     it's moved to the active list in step 5
> 
>   * ReattachPCIDevices(), step 4, whether managed or
>     unmanaged. If it's managed is also removed from the
>     inactive list in the same step, if it's unmanaged it
>     will remain in the inactive list
> 
>   * PCINodeDeviceDetach()
> 
> This is not including rollback paths. So it ends up in the
> inactive list when it's either *not yet* active, or *no
> longer* active.
> 
>> I don't disagree this is an important step, but it's the "how" we
>> determine this that I'm questioning.
> 
> Hopefully the above helped :)
> 

Partially, let's consider an initial startup where Prepare is called
(and I assume we don't call either virHostdevReattachPCIDevice or
virHostdevPCINodeDeviceDetach yet).

So how does this code check if the device has been manually detached
from the host? Step 1 doesn't add to the inactiveList and step 2 only
adds managed devices.  How would that lookaside element be on the
inactiveList - what put it there?

Is there some magic w/ virHostdevPCINodeDeviceDetach that I'm missing?


John




More information about the libvir-list mailing list