]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: implement driver's shutdown/shutdown wait methods
authorNikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
Thu, 9 Jul 2020 08:12:26 +0000 (11:12 +0300)
committerNikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
Mon, 7 Sep 2020 06:33:59 +0000 (09:33 +0300)
On shutdown we just stop accepting new jobs for worker thread so that on
shutdown wait we can exit worker thread faster. Yes we basically stop
processing of events for VMs but we are going to do so anyway in case of daemon
shutdown.

At the same time synchronous event processing that some API calls may require
are still possible as per VM event loop is still running and we don't need
worker thread for synchronous event processing.

Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
src/qemu/qemu_driver.c

index ce72e1021d1607b9fd7441e6137d862b51cb2b40..5ae030affee96d8d225f7e526e32fbbe288eec15 100644 (file)
@@ -1090,6 +1090,36 @@ qemuStateStop(void)
     return ret;
 }
 
+
+static int
+qemuStateShutdownPrepare(void)
+{
+    virThreadPoolStop(qemu_driver->workerPool);
+    return 0;
+}
+
+
+static int
+qemuDomainObjStopWorkerIter(virDomainObjPtr vm,
+                            void *opaque G_GNUC_UNUSED)
+{
+    virObjectLock(vm);
+    qemuDomainObjStopWorker(vm);
+    virObjectUnlock(vm);
+    return 0;
+}
+
+
+static int
+qemuStateShutdownWait(void)
+{
+    virDomainObjListForEach(qemu_driver->domains, false,
+                            qemuDomainObjStopWorkerIter, NULL);
+    virThreadPoolDrain(qemu_driver->workerPool);
+    return 0;
+}
+
+
 /**
  * qemuStateCleanup:
  *
@@ -20336,6 +20366,8 @@ static virStateDriver qemuStateDriver = {
     .stateCleanup = qemuStateCleanup,
     .stateReload = qemuStateReload,
     .stateStop = qemuStateStop,
+    .stateShutdownPrepare = qemuStateShutdownPrepare,
+    .stateShutdownWait = qemuStateShutdownWait,
 };
 
 int qemuRegister(void)