[libvirt] [PATCH] qemu: domain: Extract common clearing of VM private data

Peter Krempa posted 1 patch 6 years, 7 months ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/libvirt tags/patchew/d629f1ba72e193ffdc3a616bb7b32a6d204abc48.1506420302.git.pkrempa@redhat.com
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(-)
[libvirt] [PATCH] qemu: domain: Extract common clearing of VM private data
Posted by Peter Krempa 6 years, 7 months ago
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 cb371f1e8..7cb2bfce1 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 09201b1a4..cdf94b2f6 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 c104985aa..0a2493770 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -6196,8 +6196,6 @@ void qemuProcessStop(virQEMUDriverPtr driver,
     virFileDeleteTree(priv->libDir);
     virFileDeleteTree(priv->channelTargetDir);

-    qemuDomainClearPrivatePaths(vm);
-
     ignore_value(virDomainChrDefForeach(vm->def,
                                         false,
                                         qemuProcessCleanupChardevDevice,
@@ -6248,9 +6246,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;
@@ -6319,10 +6314,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);

@@ -6376,37 +6367,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)) {
-- 
2.14.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH] qemu: domain: Extract common clearing of VM private data
Posted by Ján Tomko 6 years, 7 months ago
On Tue, Sep 26, 2017 at 12:05:02PM +0200, Peter Krempa wrote:
>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(-)
>

ACK

Jan
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list