Re: [libvirt] [PATCH v13 02/49] qemu: reuse hostdev interfaces to avoid duplicate
On Sat, Mar 01, 2014 at 02:28:57PM +0800, Chunyan Liu wrote: Same logic of preparing/reattaching hostdevs could be used in attach/detach hotplug places, so reuse hostdev interfaces to avoid duplicate, also for later extracting general code to common library. Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c |8 +++--- src/qemu/qemu_hostdev.h | 11 +++- src/qemu/qemu_hotplug.c | 61 +++--- 3 files changed, 18 insertions(+), 62 deletions(-) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 6703c92..5546693 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1454,28 +1454,16 @@ qemuDomainAttachHostUsbDevice(virQEMUDriverPtr driver, virDomainHostdevDefPtr hostdev) { qemuDomainObjPrivatePtr priv = vm-privateData; -virUSBDeviceList *list = NULL; -virUSBDevicePtr usb = NULL; char *devstr = NULL; bool added = false; bool teardowncgroup = false; bool teardownlabel = false; int ret = -1; -if (qemuFindHostdevUSBDevice(hostdev, true, usb) 0) -return -1; - -if (!(list = virUSBDeviceListNew())) -goto cleanup; - -if (virUSBDeviceListAdd(list, usb) 0) -goto cleanup; - -if (qemuPrepareHostdevUSBDevices(driver, vm-def-name, list) 0) This code you're deleting took the 'hostdev' parameter that was passed into this method, and runs the 'qemuPrepareHostdevUSBDevices' method on it. +if (qemuPrepareHostUSBDevices(driver, vm-def, 0) 0) goto cleanup; This code you're adding takes the list of existing hostdevs in the virDomainDefPtr and runs the 'qemuPrepareHostdevUSBDevices' method on it. I don't see how this can possibly be correct, since the before and after code processes totally different hostdev device instances. @@ -2531,29 +2514,7 @@ qemuDomainRemovePCIHostDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, virDomainHostdevDefPtr hostdev) { -virDomainHostdevSubsysPtr subsys = hostdev-source.subsys; -virPCIDevicePtr pci; -virPCIDevicePtr activePci; - -virObjectLock(driver-activePciHostdevs); -virObjectLock(driver-inactivePciHostdevs); -pci = virPCIDeviceNew(subsys-u.pci.addr.domain, subsys-u.pci.addr.bus, - subsys-u.pci.addr.slot, subsys-u.pci.addr.function); -if (pci) { -activePci = virPCIDeviceListSteal(driver-activePciHostdevs, pci); -if (activePci -virPCIDeviceReset(activePci, driver-activePciHostdevs, - driver-inactivePciHostdevs) == 0) { -qemuReattachPciDevice(activePci, driver); -} else { -/* reset of the device failed, treat it as if it was returned */ -virPCIDeviceFree(activePci); -} -virPCIDeviceFree(pci); -} -virObjectUnlock(driver-activePciHostdevs); -virObjectUnlock(driver-inactivePciHostdevs); - +qemuDomainReAttachHostdevDevices(driver, vm-def-name, hostdev, 1); qemuDomainReleaseDeviceAddress(vm, hostdev-info, NULL); } @@ -2562,19 +2523,7 @@ qemuDomainRemoveUSBHostDevice(virQEMUDriverPtr driver, virDomainObjPtr vm ATTRIBUTE_UNUSED, virDomainHostdevDefPtr hostdev) { -virDomainHostdevSubsysPtr subsys = hostdev-source.subsys; -virUSBDevicePtr usb; - -usb = virUSBDeviceNew(subsys-u.usb.bus, subsys-u.usb.device, NULL); -if (usb) { -virObjectLock(driver-activeUsbHostdevs); -virUSBDeviceListDel(driver-activeUsbHostdevs, usb); -virObjectUnlock(driver-activeUsbHostdevs); -virUSBDeviceFree(usb); -} else { -VIR_WARN(Unable to find device %03d.%03d in list of used USB devices, - subsys-u.usb.bus, subsys-u.usb.device); -} +qemuDomainReAttachHostUsbDevices(driver, vm-def-name, hostdev, 1); } static void @@ -2622,8 +2571,6 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver, virDomainAuditHostdev(vm, hostdev, detach, true); -qemuDomainHostdevNetConfigRestore(hostdev, cfg-stateDir); - This doesn't look valid to remove. Regards, Daniel -- |: http://berrange.com -o-http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :| -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v13 02/49] qemu: reuse hostdev interfaces to avoid duplicate
2014-03-04 20:17 GMT+08:00 Daniel P. Berrange berra...@redhat.com: On Sat, Mar 01, 2014 at 02:28:57PM +0800, Chunyan Liu wrote: Same logic of preparing/reattaching hostdevs could be used in attach/detach hotplug places, so reuse hostdev interfaces to avoid duplicate, also for later extracting general code to common library. Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c |8 +++--- src/qemu/qemu_hostdev.h | 11 +++- src/qemu/qemu_hotplug.c | 61 +++--- 3 files changed, 18 insertions(+), 62 deletions(-) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 6703c92..5546693 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1454,28 +1454,16 @@ qemuDomainAttachHostUsbDevice(virQEMUDriverPtr driver, virDomainHostdevDefPtr hostdev) { qemuDomainObjPrivatePtr priv = vm-privateData; -virUSBDeviceList *list = NULL; -virUSBDevicePtr usb = NULL; char *devstr = NULL; bool added = false; bool teardowncgroup = false; bool teardownlabel = false; int ret = -1; -if (qemuFindHostdevUSBDevice(hostdev, true, usb) 0) -return -1; - -if (!(list = virUSBDeviceListNew())) -goto cleanup; - -if (virUSBDeviceListAdd(list, usb) 0) -goto cleanup; - -if (qemuPrepareHostdevUSBDevices(driver, vm-def-name, list) 0) This code you're deleting took the 'hostdev' parameter that was passed into this method, and runs the 'qemuPrepareHostdevUSBDevices' method on it. +if (qemuPrepareHostUSBDevices(driver, vm-def, 0) 0) goto cleanup; This code you're adding takes the list of existing hostdevs in the virDomainDefPtr and runs the 'qemuPrepareHostdevUSBDevices' method on it. I don't see how this can possibly be correct, since the before and after code processes totally different hostdev device instances. My mistake. It should be: qemuPrepareHostUSBDevices(driver, vm-def-name,driver, hostdev, 1, 0); qemuPrepareHostUSBDevices interface shoule be updated a bit, just to be consistency with *PreparePCIDevices and *PrepareSCSIDevices. Will update. @@ -2531,29 +2514,7 @@ qemuDomainRemovePCIHostDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, virDomainHostdevDefPtr hostdev) { -virDomainHostdevSubsysPtr subsys = hostdev-source.subsys; -virPCIDevicePtr pci; -virPCIDevicePtr activePci; - -virObjectLock(driver-activePciHostdevs); -virObjectLock(driver-inactivePciHostdevs); -pci = virPCIDeviceNew(subsys-u.pci.addr.domain, subsys-u.pci.addr.bus, - subsys-u.pci.addr.slot, subsys-u.pci.addr.function); -if (pci) { -activePci = virPCIDeviceListSteal(driver-activePciHostdevs, pci); -if (activePci -virPCIDeviceReset(activePci, driver-activePciHostdevs, - driver-inactivePciHostdevs) == 0) { -qemuReattachPciDevice(activePci, driver); -} else { -/* reset of the device failed, treat it as if it was returned */ -virPCIDeviceFree(activePci); -} -virPCIDeviceFree(pci); -} -virObjectUnlock(driver-activePciHostdevs); -virObjectUnlock(driver-inactivePciHostdevs); - +qemuDomainReAttachHostdevDevices(driver, vm-def-name, hostdev, 1); qemuDomainReleaseDeviceAddress(vm, hostdev-info, NULL); } @@ -2562,19 +2523,7 @@ qemuDomainRemoveUSBHostDevice(virQEMUDriverPtr driver, virDomainObjPtr vm ATTRIBUTE_UNUSED, virDomainHostdevDefPtr hostdev) { -virDomainHostdevSubsysPtr subsys = hostdev-source.subsys; -virUSBDevicePtr usb; - -usb = virUSBDeviceNew(subsys-u.usb.bus, subsys-u.usb.device, NULL); -if (usb) { -virObjectLock(driver-activeUsbHostdevs); -virUSBDeviceListDel(driver-activeUsbHostdevs, usb); -virObjectUnlock(driver-activeUsbHostdevs); -virUSBDeviceFree(usb); -} else { -VIR_WARN(Unable to find device %03d.%03d in list of used USB devices, - subsys-u.usb.bus, subsys-u.usb.device); -} +qemuDomainReAttachHostUsbDevices(driver, vm-def-name, hostdev, 1); } static void @@ -2622,8 +2571,6 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver, virDomainAuditHostdev(vm, hostdev, detach, true); -qemuDomainHostdevNetConfigRestore(hostdev, cfg-stateDir); - This doesn't look valid to remove. qemuDomainHostdevNetConfigRestore will be done in qemuDomainReAttachHostdevDevices after using the latter in qemuDomainRemovePCIHostDevice. So, it's not needed here. Regards, Daniel -- |: http://berrange.com -o-
[libvirt] [PATCH v13 02/49] qemu: reuse hostdev interfaces to avoid duplicate
Same logic of preparing/reattaching hostdevs could be used in attach/detach hotplug places, so reuse hostdev interfaces to avoid duplicate, also for later extracting general code to common library. Signed-off-by: Chunyan Liu cy...@suse.com --- src/qemu/qemu_hostdev.c |8 +++--- src/qemu/qemu_hostdev.h | 11 +++- src/qemu/qemu_hotplug.c | 61 +++--- 3 files changed, 18 insertions(+), 62 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index e4f6b1b..e9c33f8 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -847,7 +847,7 @@ cleanup: int -qemuPrepareHostdevUSBDevices(virQEMUDriverPtr driver, +qemuPrepareHostdevUSBDevices(virHostdevManagerPtr mgr, const char *name, virUSBDeviceListPtr list) { @@ -991,7 +991,7 @@ out: } -static int +int qemuPrepareHostUSBDevices(virQEMUDriverPtr driver, virDomainDefPtr def, bool coldBoot) @@ -1217,7 +1217,7 @@ qemuPrepareHostDevices(virQEMUDriverPtr driver, * are locked */ void -qemuReattachPciDevice(virPCIDevicePtr dev, virQEMUDriverPtr driver) +qemuReattachPciDevice(virPCIDevicePtr dev, QEMUDriverPtr driver) { int retries = 100; @@ -1333,7 +1333,7 @@ cleanup: } -static void +void qemuDomainReAttachHostUsbDevices(virQEMUDriverPtr driver, const char *name, virDomainHostdevDefPtr *hostdevs, diff --git a/src/qemu/qemu_hostdev.h b/src/qemu/qemu_hostdev.h index ffb3167..1567c1d 100644 --- a/src/qemu/qemu_hostdev.h +++ b/src/qemu/qemu_hostdev.h @@ -47,6 +47,10 @@ int qemuFindHostdevUSBDevice(virDomainHostdevDefPtr hostdev, int qemuPrepareHostdevUSBDevices(virQEMUDriverPtr driver, const char *name, virUSBDeviceListPtr list); +int +qemuPrepareHostUSBDevices(virQEMUDriverPtr driver, + virDomainDefPtr def, + bool coldBoot); int qemuPrepareHostdevSCSIDevices(virQEMUDriverPtr driver, const char *name, virDomainHostdevDefPtr *hostdevs, @@ -55,11 +59,16 @@ int qemuPrepareHostDevices(virQEMUDriverPtr driver, virDomainDefPtr def, virQEMUCapsPtr qemuCaps, bool coldBoot); +void qemuReattachPciDevice(virPCIDevicePtr dev, virQEMUDriverPtr driver); +void +qemuDomainReAttachHostUsbDevices(virQEMUDriverPtr driver, + const char *name, + virDomainHostdevDefPtr *hostdevs, + int nhostdevs); void qemuDomainReAttachHostScsiDevices(virQEMUDriverPtr driver, const char *name, virDomainHostdevDefPtr *hostdevs, int nhostdevs); -void qemuReattachPciDevice(virPCIDevicePtr dev, virQEMUDriverPtr driver); void qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, const char *name, virDomainHostdevDefPtr *hostdevs, diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 6703c92..5546693 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1454,28 +1454,16 @@ qemuDomainAttachHostUsbDevice(virQEMUDriverPtr driver, virDomainHostdevDefPtr hostdev) { qemuDomainObjPrivatePtr priv = vm-privateData; -virUSBDeviceList *list = NULL; -virUSBDevicePtr usb = NULL; char *devstr = NULL; bool added = false; bool teardowncgroup = false; bool teardownlabel = false; int ret = -1; -if (qemuFindHostdevUSBDevice(hostdev, true, usb) 0) -return -1; - -if (!(list = virUSBDeviceListNew())) -goto cleanup; - -if (virUSBDeviceListAdd(list, usb) 0) -goto cleanup; - -if (qemuPrepareHostdevUSBDevices(driver, vm-def-name, list) 0) +if (qemuPrepareHostUSBDevices(driver, vm-def, 0) 0) goto cleanup; added = true; -virUSBDeviceListSteal(list, usb); if (qemuSetupHostdevCGroup(vm, hostdev) 0) goto cleanup; @@ -1520,13 +1508,8 @@ cleanup: vm-def, hostdev, NULL) 0) VIR_WARN(Unable to restore host device labelling on hotplug fail); if (added) -virUSBDeviceListSteal(driver-activeUsbHostdevs, usb); +qemuDomainReAttachHostUsbDevices(driver, vm-def-name, hostdev, 1); } -if (list usb -!virUSBDeviceListFind(list, usb) -!virUSBDeviceListFind(driver-activeUsbHostdevs, usb)) -virUSBDeviceFree(usb); -virObjectUnref(list); VIR_FREE(devstr); return ret; } @@