From 3685e2dd64f8565d739953bde871860f343436e4 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Wed, 23 Aug 2017 14:19:36 +0200 Subject: [PATCH] qemu: domain: Extract common clearing of VM private data VM private data is cleared when the VM is turned off and also when the VM object is being freed. Some of the clearing code was duplicated. Extract it to a separate function. This also removes the now unnecessary function qemuDomainClearPrivatePaths. --- src/qemu/qemu_domain.c | 76 +++++++++++++++++++++++++++-------------- src/qemu/qemu_domain.h | 4 +-- src/qemu/qemu_process.c | 36 ++----------------- 3 files changed, 55 insertions(+), 61 deletions(-) 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; } -static void -qemuDomainObjPrivateFree(void *data) +/** + * 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) { - qemuDomainObjPrivatePtr priv = data; + 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; - virBitmapFree(priv->namespaces); + VIR_FREE(priv->pidfile); - virCgroupFree(&priv->cgroup); + 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; + + qemuDomainObjPrivateDataClear(priv); + 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)) { -- GitLab