[libvirt] [PATCH v1 2/3] virhostdev: introduce virHostdevReattachAllPCIDevices
Daniel Henrique Barboza
danielhb413 at gmail.com
Fri Jul 19 12:26:09 UTC 2019
On 7/19/19 8:52 AM, Michal Privoznik wrote:
> On 7/18/19 10:10 PM, Daniel Henrique Barboza wrote:
>> There are two places in virhostdev that executes a re-attach operation
>> in all pci devices of a virPCIDeviceListPtr array:
>> virHostdevPreparePCIDevices and virHostdevReAttachPCIDevices. The
>> difference is that the code inside virHostdevPreparePCIDevices uses
>> virPCIDeviceReattach(), while inside virHostdevReAttachPCIDevices
>> virHostdevReattachPCIDevice() is used. Both are called in the
>> same manner inside a loop.
>>
>> To make the code easier to follow and to standardize it further,
>> a new virHostdevReattachAllPCIDevices() helper function is created,
>> which is now called in both places. virHostdevReattachPCIDevice()
>> was chosen as re-attach function because it is an improved version
>> of the raw virPCIDeviceReattach(), including a timer to wait for
>> device cleanup in case of pci_stub_kvm.
>>
>> Signed-off-by: Daniel Henrique Barboza <danielhb413 at gmail.com>
>> ---
>> src/util/virhostdev.c | 114 +++++++++++++++++++-----------------------
>> 1 file changed, 52 insertions(+), 62 deletions(-)
>>
>> diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c
>> index 7cb0beb545..53aacb59b4 100644
>> --- a/src/util/virhostdev.c
>> +++ b/src/util/virhostdev.c
>> @@ -613,6 +613,56 @@
>> virHostdevRestoreNetConfig(virDomainHostdevDefPtr hostdev,
>> }
>> }
>> +/*
>> + * Pre-condition: inactivePCIHostdevs & activePCIHostdevs
>> + * are locked
>> + */
>> +static void
>> +virHostdevReattachPCIDevice(virHostdevManagerPtr mgr,
>> + virPCIDevicePtr actual)
>> +{
>> + /* Wait for device cleanup if it is qemu/kvm */
>> + if (virPCIDeviceGetStubDriver(actual) == VIR_PCI_STUB_DRIVER_KVM) {
>> + int retries = 100;
>> + while (virPCIDeviceWaitForCleanup(actual,
>> "kvm_assigned_device")
>> + && retries) {
>> + usleep(100*1000);
>> + retries--;
>> + }
>> + }
>> +
>> + VIR_DEBUG("Reattaching PCI device %s",
>> virPCIDeviceGetName(actual));
>> + if (virPCIDeviceReattach(actual, mgr->activePCIHostdevs,
>> + mgr->inactivePCIHostdevs) < 0) {
>> + VIR_ERROR(_("Failed to re-attach PCI device: %s"),
>> + virGetLastErrorMessage());
>> + virResetLastError();
>> + }
>> +}
>
> What good is there in introducing this new function if you're removing
> in the very next patch?
Yep, I'll probably merge this up with patch 3 in a re-spin.
>
>> +
>> +static void
>> +virHostdevReattachAllPCIDevices(virPCIDeviceListPtr pcidevs,
>> + virHostdevManagerPtr mgr)
>> +{
>> + size_t i;
>> +
>> + for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) {
>> + virPCIDevicePtr pci = virPCIDeviceListGet(pcidevs, i);
>> + virPCIDevicePtr actual;
>> +
>> + /* We need to look up the actual device because that's what
>> + * virHostdevReattachPCIDevice() expects as its argument */
>> + if (!(actual =
>> virPCIDeviceListFind(mgr->inactivePCIHostdevs, pci)))
>> + continue;
>> +
>> + if (virPCIDeviceGetManaged(actual))
>> + virHostdevReattachPCIDevice(mgr, actual);
>
> Just move its internals here. I mean, even from the code you're moving
> we would be calling virPCIDeviceReattach().
>
>> + else
>> + VIR_DEBUG("Not reattaching unmanaged PCI device %s",
>> + virPCIDeviceGetName(actual));
>> + }
>> +}
>> +
>
> Michal
More information about the libvir-list
mailing list