diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 0b094a15e4..e395c4ddfa 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1684,16 +1684,6 @@ qemuDomainSetPrivatePaths(virQEMUDriverPtr driver, } -void -qemuDomainClearPrivatePaths(virDomainObjPtr vm) -{ - qemuDomainObjPrivatePtr priv = vm->privateData; - - VIR_FREE(priv->libDir); - VIR_FREE(priv->channelTargetDir); -} - - static void * qemuDomainObjPrivateAlloc(void *opaque) { @@ -1721,24 +1711,69 @@ qemuDomainObjPrivateAlloc(void *opaque) return NULL; } +/** + * qemuDomainObjPrivateDataClear: + * @priv: domain private data + * + * Clears private data entries, which are not necessary or stale if the VM is + * not running. + */ +void +qemuDomainObjPrivateDataClear(qemuDomainObjPrivatePtr priv) +{ + virStringListFree(priv->qemuDevices); + priv->qemuDevices = NULL; + + virCgroupFree(&priv->cgroup); + + virPerfFree(priv->perf); + priv->perf = NULL; + + VIR_FREE(priv->machineName); + + virObjectUnref(priv->qemuCaps); + priv->qemuCaps = NULL; + + VIR_FREE(priv->pidfile); + + VIR_FREE(priv->libDir); + VIR_FREE(priv->channelTargetDir); + + /* remove automatic pinning data */ + virBitmapFree(priv->autoNodeset); + priv->autoNodeset = NULL; + virBitmapFree(priv->autoCpuset); + priv->autoCpuset = NULL; + + /* remove address data */ + virDomainPCIAddressSetFree(priv->pciaddrs); + priv->pciaddrs = NULL; + virDomainUSBAddressSetFree(priv->usbaddrs); + priv->usbaddrs = NULL; + + /* clean up migration data */ + VIR_FREE(priv->migTLSAlias); + virCPUDefFree(priv->origCPU); + priv->origCPU = NULL; + + /* clear previously used namespaces */ + virBitmapFree(priv->namespaces); + priv->namespaces = NULL; +} + + static void qemuDomainObjPrivateFree(void *data) { qemuDomainObjPrivatePtr priv = data; - virObjectUnref(priv->qemuCaps); + qemuDomainObjPrivateDataClear(priv); - virBitmapFree(priv->namespaces); - - virCgroupFree(&priv->cgroup); - virDomainPCIAddressSetFree(priv->pciaddrs); - virDomainUSBAddressSetFree(priv->usbaddrs); virDomainChrSourceDefFree(priv->monConfig); qemuDomainObjFreeJob(priv); VIR_FREE(priv->lockState); VIR_FREE(priv->origname); - virStringListFree(priv->qemuDevices); virChrdevFree(priv->devs); /* This should never be non-NULL if we get here, but just in case... */ @@ -1751,19 +1786,10 @@ qemuDomainObjPrivateFree(void *data) qemuAgentClose(priv->agent); } VIR_FREE(priv->cleanupCallbacks); - virBitmapFree(priv->autoNodeset); - virBitmapFree(priv->autoCpuset); - - VIR_FREE(priv->machineName); - VIR_FREE(priv->libDir); - VIR_FREE(priv->channelTargetDir); qemuDomainSecretInfoFree(&priv->migSecinfo); - VIR_FREE(priv->migTLSAlias); qemuDomainMasterKeyFree(priv); - virCPUDefFree(priv->origCPU); - VIR_FREE(priv); } diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 09201b1a40..cdf94b2f65 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -676,6 +676,8 @@ void qemuDomainCleanupRemove(virDomainObjPtr vm, void qemuDomainCleanupRun(virQEMUDriverPtr driver, virDomainObjPtr vm); +void qemuDomainObjPrivateDataClear(qemuDomainObjPrivatePtr priv); + extern virDomainXMLPrivateDataCallbacks virQEMUDriverPrivateDataCallbacks; extern virDomainXMLNamespace virQEMUDriverDomainXMLNamespace; extern virDomainDefParserConfig virQEMUDriverDomainDefParserConfig; @@ -783,8 +785,6 @@ int qemuDomainNetVLAN(virDomainNetDefPtr def); int qemuDomainSetPrivatePaths(virQEMUDriverPtr driver, virDomainObjPtr vm); -void qemuDomainClearPrivatePaths(virDomainObjPtr vm); - virDomainDiskDefPtr qemuDomainDiskByName(virDomainDefPtr def, const char *name); char *qemuDomainGetMasterKeyFilePath(const char *libDir); diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 929a0d2e96..474899aaab 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -6218,8 +6218,6 @@ void qemuProcessStop(virQEMUDriverPtr driver, virFileDeleteTree(priv->libDir); virFileDeleteTree(priv->channelTargetDir); - qemuDomainClearPrivatePaths(vm); - ignore_value(virDomainChrDefForeach(vm->def, false, qemuProcessCleanupChardevDevice, @@ -6270,9 +6268,6 @@ void qemuProcessStop(virQEMUDriverPtr driver, VIR_FREE(vm->def->seclabels[i]->imagelabel); } - virStringListFree(priv->qemuDevices); - priv->qemuDevices = NULL; - qemuHostdevReAttachDomainDevices(driver, vm->def); def = vm->def; @@ -6341,10 +6336,6 @@ void qemuProcessStop(virQEMUDriverPtr driver, VIR_WARN("Failed to remove cgroup for %s", vm->def->name); } - virCgroupFree(&priv->cgroup); - - virPerfFree(priv->perf); - priv->perf = NULL; qemuProcessRemoveDomainStatus(driver, vm); @@ -6398,37 +6389,14 @@ void qemuProcessStop(virQEMUDriverPtr driver, } } - VIR_FREE(priv->machineName); - vm->taint = 0; vm->pid = -1; virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF, reason); for (i = 0; i < vm->def->niothreadids; i++) vm->def->iothreadids[i]->thread_id = 0; - virObjectUnref(priv->qemuCaps); - priv->qemuCaps = NULL; - VIR_FREE(priv->pidfile); - /* remove automatic pinning data */ - virBitmapFree(priv->autoNodeset); - priv->autoNodeset = NULL; - virBitmapFree(priv->autoCpuset); - priv->autoCpuset = NULL; - - /* remove address data */ - virDomainPCIAddressSetFree(priv->pciaddrs); - priv->pciaddrs = NULL; - virDomainUSBAddressSetFree(priv->usbaddrs); - priv->usbaddrs = NULL; - - /* clean up migration data */ - VIR_FREE(priv->migTLSAlias); - virCPUDefFree(priv->origCPU); - priv->origCPU = NULL; - - /* clear previously used namespaces */ - virBitmapFree(priv->namespaces); - priv->namespaces = NULL; + /* clear all private data entries which are no longer needed */ + qemuDomainObjPrivateDataClear(priv); /* The "release" hook cleans up additional resources */ if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) {