
On 11/23/2011 02:44 PM, Eric Blake wrote:
From: Lei Li <lilei@linux.vnet.ibm.com>
Implement the block I/O throttle setting and getting support to qemu driver.
Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com> Signed-off-by: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com> Signed-off-by: Eric Blake <eblake@redhat.com>
+qemuDomainSetBlockIoTune(virDomainPtr dom, + const char *disk, + virTypedParameterPtr params, + int nparams, + unsigned int flags) +{
+ + if (flags & VIR_DOMAIN_AFFECT_CONFIG) { + if (!vm->persistent) { + qemuReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("cannot change persistent config of a transient domain")); + goto endjob; + } + if (!(persistentDef = virDomainObjGetPersistentDef(driver->caps, vm))) + goto endjob; + } +
+ + if (flags & VIR_DOMAIN_AFFECT_CONFIG) { + sa_assert(persistentDef); + int idx = virDomainDiskIndexByName(vm->def, disk, true);
Oops - this should be on persistentDef, not vm->def.
+ if (i < 0) + goto endjob; + persistentDef->disks[idx]->blkdeviotune = info;
And this assignment should be delayed...
+ } + + if (flags & VIR_DOMAIN_AFFECT_LIVE) { + priv = vm->privateData; + qemuDomainObjEnterMonitorWithDriver(driver, vm); + ret = qemuMonitorSetBlockIoThrottle(priv->mon, device, &info); + qemuDomainObjExitMonitorWithDriver(driver, vm); + } + + if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
to here, after we know the live change (if any) took place. Not to mention that we must not get here if the live change failed. Here's what I'm squashing in: diff --git i/src/qemu/qemu_driver.c w/src/qemu/qemu_driver.c index 698a961..ce4cba1 100644 --- i/src/qemu/qemu_driver.c +++ w/src/qemu/qemu_driver.c @@ -11080,6 +11080,7 @@ qemuDomainSetBlockIoTune(virDomainPtr dom, int ret = -1; int i; bool isActive; + int idx = -1; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG, -1); @@ -11126,6 +11127,9 @@ qemuDomainSetBlockIoTune(virDomainPtr dom, } if (!(persistentDef = virDomainObjGetPersistentDef(driver->caps, vm))) goto endjob; + idx = virDomainDiskIndexByName(persistentDef, disk, true); + if (i < 0) + goto endjob; } for (i = 0; i < nparams; i++) { @@ -11177,22 +11181,18 @@ qemuDomainSetBlockIoTune(virDomainPtr dom, goto endjob; } - if (flags & VIR_DOMAIN_AFFECT_CONFIG) { - sa_assert(persistentDef); - int idx = virDomainDiskIndexByName(vm->def, disk, true); - if (i < 0) - goto endjob; - persistentDef->disks[idx]->blkdeviotune = info; - } - if (flags & VIR_DOMAIN_AFFECT_LIVE) { priv = vm->privateData; qemuDomainObjEnterMonitorWithDriver(driver, vm); ret = qemuMonitorSetBlockIoThrottle(priv->mon, device, &info); qemuDomainObjExitMonitorWithDriver(driver, vm); } + if (ret < 0) + goto endjob; if (flags & VIR_DOMAIN_AFFECT_CONFIG) { + sa_assert(persistentDef && idx >= 0); + persistentDef->disks[idx]->blkdeviotune = info; ret = virDomainSaveConfig(driver->configDir, persistentDef); if (ret < 0) { qemuReportError(VIR_ERR_OPERATION_INVALID, "%s", -- Eric Blake eblake@redhat.com +1-919-301-3266 Libvirt virtualization library http://libvirt.org