[libvirt] [PATCH v2 7/8] Move the detach of PCI device to the beginnging of live hotplug

Shivaprasad bhat shivaprasadbhat at gmail.com
Thu May 19 18:46:59 UTC 2016


On Fri, May 20, 2016 at 12:05 AM, Laine Stump <laine at laine.org> wrote:

> On 05/18/2016 05:35 PM, Shivaprasad G Bhat wrote:
>
>> The hostdevices are the only devices which have dependencies
>> outside of themselves such that, other functions of the PCI
>> card should also have been detached from host driver before
>> attempting the hotplug.
>>
>
> Are you saying that all the functions on a host device must be detached
> from their host driver, even if you're only assigning one or another of
> them to the guest?
>
> Yes. All devices from same iommu group should be detached from the host.
Here, I hope the Card is independent. Otherwise, many cards can also
belong to same iommu group. In such case, manual the nodedev-detach for
other card functions is necessary.


>
>> This patch moves the detach to the beginning of the hotplug
>> so that the following patch can detach all funtions first before
>> attempting to hotplug any.
>>
>> We need not move the detach for net devices using SRIOV as
>> all SRIOV devices are single function devices.
>>
>
>
> I'm not sure why that makes any difference. In any case, you should detach
> all the devices that are going to be assigned, then assign them all, with
> the one going to function 0 being last.


There will be only function zero. So I felt its not necessary. Are you
saying different SRIOV functions(all with function zero) be hotplugged as
different functions of single card in guest ? In that case, we would need
to do that.


>
>
>
>> Signed-off-by: Shivaprasad G Bhat <sbhat at linux.vnet.ibm.com>
>> ---
>>   src/qemu/qemu_driver.c  |   13 ++++++++++++-
>>   src/qemu/qemu_hotplug.c |   18 +++++++++---------
>>   2 files changed, 21 insertions(+), 10 deletions(-)
>>
>> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
>> index 37d970e..9cff397 100644
>> --- a/src/qemu/qemu_driver.c
>> +++ b/src/qemu/qemu_driver.c
>> @@ -8273,8 +8273,13 @@ static int
>> qemuDomainAttachDeviceFlags(virDomainPtr dom, const char *xml,
>>
>>  VIR_DOMAIN_DEVICE_ACTION_ATTACH) < 0)
>>               goto endjob;
>>   -        if ((ret = qemuDomainAttachDeviceLive(vm, dev_copy, dom)) < 0)
>> +        if (dev_copy->type == VIR_DOMAIN_DEVICE_HOSTDEV &&
>> +            dev_copy->data.hostdev->source.subsys.type ==
>> VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI &&
>> +            qemuDomainAttachPCIHostDevicePrepare(driver,vm->def,
>> dev_copy->data.hostdev, qemuCaps) < 0)
>>               goto endjob;
>> +
>> +        if ((ret = qemuDomainAttachDeviceLive(vm, dev_copy, dom)) < 0)
>> +            goto undoprepare;
>>           /*
>>            * update domain status forcibly because the domain status may
>> be
>>            * changed even if we failed to attach the device. For example,
>> @@ -8309,6 +8314,12 @@ static int
>> qemuDomainAttachDeviceFlags(virDomainPtr dom, const char *xml,
>>       virObjectUnref(cfg);
>>       virNWFilterUnlockFilterUpdates();
>>       return ret;
>> +
>> +  undoprepare:
>> +    if (dev_copy->type == VIR_DOMAIN_DEVICE_HOSTDEV &&
>> +        dev_copy->data.hostdev->source.subsys.type ==
>> VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
>> +        qemuHostdevReAttachPCIDevices(driver, vm->def->name,
>> &dev_copy->data.hostdev, 1);
>> +    goto endjob;
>>   }
>>     static int qemuDomainAttachDevice(virDomainPtr dom, const char *xml)
>> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
>> index a2bcd89..bdfbafe 100644
>> --- a/src/qemu/qemu_hotplug.c
>> +++ b/src/qemu/qemu_hotplug.c
>> @@ -899,6 +899,7 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver,
>>       actualType = virDomainNetGetActualType(net);
>>         if (actualType == VIR_DOMAIN_NET_TYPE_HOSTDEV) {
>> +        virDomainHostdevDefPtr hostdev =
>> virDomainNetGetActualHostdev(net);
>>           /* This is really a "smart hostdev", so it should be attached
>>            * as a hostdev (the hostdev code will reach over into the
>>            * netdev-specific code as appropriate), then also added to
>> @@ -907,8 +908,14 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver,
>>            * qemuDomainAttachHostDevice uses a connection to resolve
>>            * a SCSI hostdev secret, which is not this case, so pass NULL.
>>            */
>> -        ret = qemuDomainAttachHostDevice(NULL, driver, vm,
>> -
>>  virDomainNetGetActualHostdev(net));
>> +        if (qemuDomainAttachPCIHostDevicePrepare(driver, vm->def,
>> +                                                 hostdev,
>> priv->qemuCaps) < 0)
>> +            goto cleanup;
>> +
>> +        ret = qemuDomainAttachHostDevice(NULL, driver, vm, hostdev);
>> +        if (!ret)
>> +            qemuHostdevReAttachPCIDevices(driver, vm->def->name,
>> &hostdev, 1);
>> +
>>           goto cleanup;
>>       }
>>   @@ -1248,10 +1255,6 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr
>> driver,
>>       if (VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs + 1) < 0)
>>           return -1;
>>   -    if (qemuDomainAttachPCIHostDevicePrepare(driver, vm->def,
>> -                                             hostdev, priv->qemuCaps) <
>> 0)
>> -        return -1;
>> -
>>       backend = hostdev->source.subsys.u.pci.backend;
>>         /* Temporarily add the hostdev to the domain definition. This is
>> needed
>> @@ -1330,13 +1333,10 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr
>> driver,
>>       if (releaseaddr)
>>           qemuDomainReleaseDeviceAddress(vm, hostdev->info, NULL);
>>   -    qemuHostdevReAttachPCIDevices(driver, vm->def->name, &hostdev, 1);
>> -
>>       VIR_FREE(devstr);
>>       VIR_FREE(configfd_name);
>>       VIR_FORCE_CLOSE(configfd);
>>   - cleanup:
>>       return -1;
>>   }
>>
>> --
>> libvir-list mailing list
>> libvir-list at redhat.com
>> https://www.redhat.com/mailman/listinfo/libvir-list
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20160520/6cc4aa6a/attachment-0001.htm>


More information about the libvir-list mailing list