<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">2014-03-04 20:17 GMT+08:00 Daniel P. Berrange <span dir="ltr"><<a href="mailto:berrange@redhat.com" target="_blank">berrange@redhat.com</a>></span>:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class="">On Sat, Mar 01, 2014 at 02:28:57PM +0800, Chunyan Liu wrote:<br>
> Same logic of preparing/reattaching hostdevs could be used in attach/detach<br>
> hotplug places, so reuse hostdev interfaces to avoid duplicate, also for later<br>
> extracting general code to common library.<br>
><br>
> Signed-off-by: Chunyan Liu <<a href="mailto:cyliu@suse.com">cyliu@suse.com</a>><br>
> ---<br>
>  src/qemu/qemu_hostdev.c |    8 +++---<br>
>  src/qemu/qemu_hostdev.h |   11 +++++++-<br>
>  src/qemu/qemu_hotplug.c |   61 +++-------------------------------------------<br>
>  3 files changed, 18 insertions(+), 62 deletions(-)<br>
<br>
</div><div class="">> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c<br>
> index 6703c92..5546693 100644<br>
> --- a/src/qemu/qemu_hotplug.c<br>
> +++ b/src/qemu/qemu_hotplug.c<br>
> @@ -1454,28 +1454,16 @@ qemuDomainAttachHostUsbDevice(virQEMUDriverPtr driver,<br>
>                                virDomainHostdevDefPtr hostdev)<br>
>  {<br>
>      qemuDomainObjPrivatePtr priv = vm->privateData;<br>
> -    virUSBDeviceList *list = NULL;<br>
> -    virUSBDevicePtr usb = NULL;<br>
>      char *devstr = NULL;<br>
>      bool added = false;<br>
>      bool teardowncgroup = false;<br>
>      bool teardownlabel = false;<br>
>      int ret = -1;<br>
><br>
> -    if (qemuFindHostdevUSBDevice(hostdev, true, &usb) < 0)<br>
> -        return -1;<br>
> -<br>
> -    if (!(list = virUSBDeviceListNew()))<br>
> -        goto cleanup;<br>
> -<br>
> -    if (virUSBDeviceListAdd(list, usb) < 0)<br>
> -        goto cleanup;<br>
> -<br>
> -    if (qemuPrepareHostdevUSBDevices(driver, vm->def->name, list) < 0)<br>
<br>
</div>This code you're deleting took the 'hostdev' parameter that was passed<br>
into this method, and runs the 'qemuPrepareHostdevUSBDevices' method<br>
on it.<br>
<div class=""><br>
<br>
> +    if (qemuPrepareHostUSBDevices(driver, vm->def, 0) < 0)<br>
>          goto cleanup;<br>
<br>
</div>This code you're adding takes the list of existing hostdevs in the<br>
virDomainDefPtr and runs the 'qemuPrepareHostdevUSBDevices' method<br>
on it.<br>
<br>
I don't see how this can possibly be correct, since the before and<br>
after code processes totally different hostdev device instances.<br><div><div><br></div></div></blockquote><div><br>My mistake. It should be:<br>qemuPrepareHostUSBDevices(driver, vm->def->name,driver,  &hostdev, 1, 0);<br>
qemuPrepareHostUSBDevices interface shoule be updated a bit, just to be<br>consistency with *PreparePCIDevices and *PrepareSCSIDevices.<br></div><div>Will update.<br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div><div class="h5">
> @@ -2531,29 +2514,7 @@ qemuDomainRemovePCIHostDevice(virQEMUDriverPtr driver,<br>
>                                virDomainObjPtr vm,<br>
>                                virDomainHostdevDefPtr hostdev)<br>
>  {<br>
> -    virDomainHostdevSubsysPtr subsys = &hostdev->source.subsys;<br>
> -    virPCIDevicePtr pci;<br>
> -    virPCIDevicePtr activePci;<br>
> -<br>
> -    virObjectLock(driver->activePciHostdevs);<br>
> -    virObjectLock(driver->inactivePciHostdevs);<br>
> -    pci = virPCIDeviceNew(subsys->u.pci.addr.domain, subsys->u.pci.addr.bus,<br>
> -                          subsys->u.pci.addr.slot, subsys->u.pci.addr.function);<br>
> -    if (pci) {<br>
> -        activePci = virPCIDeviceListSteal(driver->activePciHostdevs, pci);<br>
> -        if (activePci &&<br>
> -            virPCIDeviceReset(activePci, driver->activePciHostdevs,<br>
> -                              driver->inactivePciHostdevs) == 0) {<br>
> -            qemuReattachPciDevice(activePci, driver);<br>
> -        } else {<br>
> -            /* reset of the device failed, treat it as if it was returned */<br>
> -            virPCIDeviceFree(activePci);<br>
> -        }<br>
> -        virPCIDeviceFree(pci);<br>
> -    }<br>
> -    virObjectUnlock(driver->activePciHostdevs);<br>
> -    virObjectUnlock(driver->inactivePciHostdevs);<br>
> -<br>
> +    qemuDomainReAttachHostdevDevices(driver, vm->def->name, &hostdev, 1);<br>
>      qemuDomainReleaseDeviceAddress(vm, hostdev->info, NULL);<br>
>  }<br>
><br>
> @@ -2562,19 +2523,7 @@ qemuDomainRemoveUSBHostDevice(virQEMUDriverPtr driver,<br>
>                                virDomainObjPtr vm ATTRIBUTE_UNUSED,<br>
>                                virDomainHostdevDefPtr hostdev)<br>
>  {<br>
> -    virDomainHostdevSubsysPtr subsys = &hostdev->source.subsys;<br>
> -    virUSBDevicePtr usb;<br>
> -<br>
> -    usb = virUSBDeviceNew(subsys->u.usb.bus, subsys->u.usb.device, NULL);<br>
> -    if (usb) {<br>
> -        virObjectLock(driver->activeUsbHostdevs);<br>
> -        virUSBDeviceListDel(driver->activeUsbHostdevs, usb);<br>
> -        virObjectUnlock(driver->activeUsbHostdevs);<br>
> -        virUSBDeviceFree(usb);<br>
> -    } else {<br>
> -        VIR_WARN("Unable to find device %03d.%03d in list of used USB devices",<br>
> -                 subsys->u.usb.bus, subsys->u.usb.device);<br>
> -    }<br>
> +    qemuDomainReAttachHostUsbDevices(driver, vm->def->name, &hostdev, 1);<br>
>  }<br>
><br>
>  static void<br>
> @@ -2622,8 +2571,6 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver,<br>
><br>
>      virDomainAuditHostdev(vm, hostdev, "detach", true);<br>
><br>
> -    qemuDomainHostdevNetConfigRestore(hostdev, cfg->stateDir);<br>
> -<br>
<br>
</div></div>This doesn't look valid to remove.<br>
<br></blockquote><div>qemuDomainHostdevNetConfigRestore will be done in qemuDomainReAttachHostdevDevices after using the latter in qemuDomainRemovePCIHostDevice. So, it's not needed here.<br><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

<br>
Regards,<br>
Daniel<br>
<span class=""><font color="#888888">--<br>
|: <a href="http://berrange.com" target="_blank">http://berrange.com</a>      -o-    <a href="http://www.flickr.com/photos/dberrange/" target="_blank">http://www.flickr.com/photos/dberrange/</a> :|<br>
|: <a href="http://libvirt.org" target="_blank">http://libvirt.org</a>              -o-             <a href="http://virt-manager.org" target="_blank">http://virt-manager.org</a> :|<br>
|: <a href="http://autobuild.org" target="_blank">http://autobuild.org</a>       -o-         <a href="http://search.cpan.org/~danberr/" target="_blank">http://search.cpan.org/~danberr/</a> :|<br>
|: <a href="http://entangle-photo.org" target="_blank">http://entangle-photo.org</a>       -o-       <a href="http://live.gnome.org/gtk-vnc" target="_blank">http://live.gnome.org/gtk-vnc</a> :|<br>
<br>
</font></span></blockquote></div><br></div></div>