<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>