qemu: implement driver's shutdown/shutdown wait methods

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>
This commit is contained in:
Nikolay Shirokovskiy 2020-07-09 11:12:26 +03:00
parent 860a999802
commit 399039a6b1

View 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)