[PATCH 00/11] qemu & hypervisor: move helper job functions

This series moves helper functions from qemu so that they can be used by other hypervisors or BeginJob / EndJob functions which will be generalized and moved in one of the following series as well. Kristina Hanicova (11): qemu & hypervisor: move qemuDomainObjResetAgentJob() into hypervisor qemu & hypervisor: move qemuDomainObjResetAsyncJob() into hypervisor qemu: propagate virDomainJobObj into qemuDomainObjPreserveJob() qemu & hypervisor: move qemuDomainObjPreserveJob() into hypervisor qemu & hypervisor: move qemuDomainObjClearJob() into hypervisor libxl: use virDomainObjClearJob() instead of libxlDomainObjFreeJob() LXC: use virDomainObjClearJob() instead of virLXCDomainObjFreeJob() CH: use virDomainObjClearJob() instead of virCHDomainObjFreeJob() qemu & hypervisor: move qemuDomainTrackJob() into hypervisor qemu: move virDomainNestedJobAllowed into hypervisor qemu: move virDomainObjCanSetJob() into hypervisor src/ch/ch_domain.c | 10 +-- src/hypervisor/domain_job.c | 99 +++++++++++++++++++++++++++ src/hypervisor/domain_job.h | 18 +++++ src/libvirt_private.syms | 7 ++ src/libxl/libxl_domain.c | 9 +-- src/lxc/lxc_domain.c | 7 +- src/qemu/qemu_domain.c | 2 +- src/qemu/qemu_domainjob.c | 129 ++++-------------------------------- src/qemu/qemu_domainjob.h | 7 -- src/qemu/qemu_process.c | 2 +- 10 files changed, 142 insertions(+), 148 deletions(-) -- 2.37.1

This patch moves qemuDomainObjResetAgentJob() as virDomainObjResetAgentJob() into hypervisor. Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- src/hypervisor/domain_job.c | 9 +++++++++ src/hypervisor/domain_job.h | 2 ++ src/libvirt_private.syms | 1 + src/qemu/qemu_domainjob.c | 14 ++------------ 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/hypervisor/domain_job.c b/src/hypervisor/domain_job.c index 5b97624287..9fbea500c4 100644 --- a/src/hypervisor/domain_job.c +++ b/src/hypervisor/domain_job.c @@ -146,3 +146,12 @@ virDomainObjResetJob(virDomainJobObj *job) g_clear_pointer(&job->ownerAPI, g_free); job->started = 0; } + +void +virDomainObjResetAgentJob(virDomainJobObj *job) +{ + job->agentActive = VIR_AGENT_JOB_NONE; + job->agentOwner = 0; + g_clear_pointer(&job->agentOwnerAPI, g_free); + job->agentStarted = 0; +} diff --git a/src/hypervisor/domain_job.h b/src/hypervisor/domain_job.h index 4c32296117..7a9197cbde 100644 --- a/src/hypervisor/domain_job.h +++ b/src/hypervisor/domain_job.h @@ -210,3 +210,5 @@ int virDomainObjInitJob(virDomainJobObj *job, virDomainObjPrivateJobCallbacks *cb); void virDomainObjResetJob(virDomainJobObj *job); + +void virDomainObjResetAgentJob(virDomainJobObj *job); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index d5046604dd..a50f9aea28 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1591,6 +1591,7 @@ virDomainJobStatusToType; virDomainJobTypeFromString; virDomainJobTypeToString; virDomainObjInitJob; +virDomainObjResetAgentJob; virDomainObjResetJob; diff --git a/src/qemu/qemu_domainjob.c b/src/qemu/qemu_domainjob.c index a45103256a..0f3b38108c 100644 --- a/src/qemu/qemu_domainjob.c +++ b/src/qemu/qemu_domainjob.c @@ -150,16 +150,6 @@ qemuDomainEventEmitJobCompleted(virQEMUDriver *driver, } -static void -qemuDomainObjResetAgentJob(virDomainJobObj *job) -{ - job->agentActive = VIR_AGENT_JOB_NONE; - job->agentOwner = 0; - g_clear_pointer(&job->agentOwnerAPI, g_free); - job->agentStarted = 0; -} - - static void qemuDomainObjResetAsyncJob(virDomainJobObj *job) { @@ -936,7 +926,7 @@ qemuDomainObjBeginJobInternal(virQEMUDriver *driver, } if (agentJob) { - qemuDomainObjResetAgentJob(&priv->job); + virDomainObjResetAgentJob(&priv->job); VIR_DEBUG("Started agent job: %s (vm=%p name=%s job=%s async=%s)", virDomainAgentJobTypeToString(agentJob), @@ -1191,7 +1181,7 @@ qemuDomainObjEndAgentJob(virDomainObj *obj) virDomainAsyncJobTypeToString(priv->job.asyncJob), obj, obj->def->name); - qemuDomainObjResetAgentJob(&priv->job); + virDomainObjResetAgentJob(&priv->job); /* We indeed need to wake up ALL threads waiting because * grabbing a job requires checking more variables. */ virCondBroadcast(&priv->job.cond); -- 2.37.1

This patch moves qemuDomainObjResetAsyncJob() as virDomainObjResetAsyncJob() into hypervisor. Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- src/hypervisor/domain_job.c | 19 +++++++++++++++++++ src/hypervisor/domain_job.h | 2 ++ src/libvirt_private.syms | 1 + src/qemu/qemu_domainjob.c | 29 +++++------------------------ 4 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/hypervisor/domain_job.c b/src/hypervisor/domain_job.c index 9fbea500c4..1cd9b8d728 100644 --- a/src/hypervisor/domain_job.c +++ b/src/hypervisor/domain_job.c @@ -9,6 +9,7 @@ #include <string.h> #include "domain_job.h" +#include "viralloc.h" VIR_ENUM_IMPL(virDomainJob, @@ -155,3 +156,21 @@ virDomainObjResetAgentJob(virDomainJobObj *job) g_clear_pointer(&job->agentOwnerAPI, g_free); job->agentStarted = 0; } + +void +virDomainObjResetAsyncJob(virDomainJobObj *job) +{ + job->asyncJob = VIR_ASYNC_JOB_NONE; + job->asyncOwner = 0; + g_clear_pointer(&job->asyncOwnerAPI, g_free); + job->asyncStarted = 0; + job->phase = 0; + job->mask = VIR_JOB_DEFAULT_MASK; + job->abortJob = false; + VIR_FREE(job->error); + g_clear_pointer(&job->current, virDomainJobDataFree); + job->apiFlags = 0; + + if (job->cb) + job->cb->resetJobPrivate(job->privateData); +} diff --git a/src/hypervisor/domain_job.h b/src/hypervisor/domain_job.h index 7a9197cbde..f857fccce2 100644 --- a/src/hypervisor/domain_job.h +++ b/src/hypervisor/domain_job.h @@ -212,3 +212,5 @@ int virDomainObjInitJob(virDomainJobObj *job, void virDomainObjResetJob(virDomainJobObj *job); void virDomainObjResetAgentJob(virDomainJobObj *job); + +void virDomainObjResetAsyncJob(virDomainJobObj *job); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index a50f9aea28..a8b9d5249f 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1592,6 +1592,7 @@ virDomainJobTypeFromString; virDomainJobTypeToString; virDomainObjInitJob; virDomainObjResetAgentJob; +virDomainObjResetAsyncJob; virDomainObjResetJob; diff --git a/src/qemu/qemu_domainjob.c b/src/qemu/qemu_domainjob.c index 0f3b38108c..132f2a0025 100644 --- a/src/qemu/qemu_domainjob.c +++ b/src/qemu/qemu_domainjob.c @@ -150,25 +150,6 @@ qemuDomainEventEmitJobCompleted(virQEMUDriver *driver, } -static void -qemuDomainObjResetAsyncJob(virDomainJobObj *job) -{ - job->asyncJob = VIR_ASYNC_JOB_NONE; - job->asyncOwner = 0; - g_clear_pointer(&job->asyncOwnerAPI, g_free); - job->asyncStarted = 0; - job->phase = 0; - job->mask = VIR_JOB_DEFAULT_MASK; - job->abortJob = false; - VIR_FREE(job->error); - g_clear_pointer(&job->current, virDomainJobDataFree); - job->apiFlags = 0; - - if (job->cb) - job->cb->resetJobPrivate(job->privateData); -} - - /** * qemuDomainObjPreserveJob * @param obj domain with a job that needs to be preserved @@ -200,7 +181,7 @@ qemuDomainObjPreserveJob(virDomainObj *obj, job->cb = priv->job.cb; virDomainObjResetJob(&priv->job); - qemuDomainObjResetAsyncJob(&priv->job); + virDomainObjResetAsyncJob(&priv->job); return 0; } @@ -244,7 +225,7 @@ void qemuDomainObjClearJob(virDomainJobObj *job) { virDomainObjResetJob(job); - qemuDomainObjResetAsyncJob(job); + virDomainObjResetAsyncJob(job); g_clear_pointer(&job->current, virDomainJobDataFree); g_clear_pointer(&job->completed, virDomainJobDataFree); virCondDestroy(&job->cond); @@ -753,7 +734,7 @@ qemuDomainObjDiscardAsyncJob(virDomainObj *obj) if (priv->job.active == VIR_JOB_ASYNC_NESTED) virDomainObjResetJob(&priv->job); - qemuDomainObjResetAsyncJob(&priv->job); + virDomainObjResetAsyncJob(&priv->job); qemuDomainSaveStatus(obj); } @@ -914,7 +895,7 @@ qemuDomainObjBeginJobInternal(virQEMUDriver *driver, VIR_DEBUG("Started async job: %s (vm=%p name=%s)", virDomainAsyncJobTypeToString(asyncJob), obj, obj->def->name); - qemuDomainObjResetAsyncJob(&priv->job); + virDomainObjResetAsyncJob(&priv->job); priv->job.current = virDomainJobDataInit(&qemuJobDataPrivateDataCallbacks); priv->job.current->status = VIR_DOMAIN_JOB_STATUS_ACTIVE; priv->job.asyncJob = asyncJob; @@ -1198,7 +1179,7 @@ qemuDomainObjEndAsyncJob(virDomainObj *obj) virDomainAsyncJobTypeToString(priv->job.asyncJob), obj, obj->def->name); - qemuDomainObjResetAsyncJob(&priv->job); + virDomainObjResetAsyncJob(&priv->job); qemuDomainSaveStatus(obj); virCondBroadcast(&priv->job.asyncCond); } -- 2.37.1

It does not make sense to propagate virDomainObj and get qemuDomainObjPrivate from it, when it is already accessible in the only function qemuDomainObjPreserveJob() is called from. That being said, we can also propagate virDomainJobObj directly and avoid using qemu private structure. Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- src/qemu/qemu_domainjob.c | 31 ++++++++++++++----------------- src/qemu/qemu_domainjob.h | 2 +- src/qemu/qemu_process.c | 2 +- 3 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/qemu/qemu_domainjob.c b/src/qemu/qemu_domainjob.c index 132f2a0025..260717aa88 100644 --- a/src/qemu/qemu_domainjob.c +++ b/src/qemu/qemu_domainjob.c @@ -160,28 +160,25 @@ qemuDomainEventEmitJobCompleted(virQEMUDriver *driver, * Returns 0 on success, -1 on failure. */ int -qemuDomainObjPreserveJob(virDomainObj *obj, +qemuDomainObjPreserveJob(virDomainJobObj *currJob, virDomainJobObj *job) { - qemuDomainObjPrivate *priv = obj->privateData; - memset(job, 0, sizeof(*job)); - job->active = priv->job.active; - job->owner = priv->job.owner; - job->asyncJob = priv->job.asyncJob; - job->asyncOwner = priv->job.asyncOwner; - job->asyncStarted = priv->job.asyncStarted; - job->phase = priv->job.phase; - job->privateData = g_steal_pointer(&priv->job.privateData); - job->apiFlags = priv->job.apiFlags; - - if (priv->job.cb && - !(priv->job.privateData = priv->job.cb->allocJobPrivate())) + job->active = currJob->active; + job->owner = currJob->owner; + job->asyncJob = currJob->asyncJob; + job->asyncOwner = currJob->asyncOwner; + job->phase = currJob->phase; + job->privateData = g_steal_pointer(&currJob->privateData); + job->apiFlags = currJob->apiFlags; + + if (currJob->cb && + !(currJob->privateData = currJob->cb->allocJobPrivate())) return -1; - job->cb = priv->job.cb; + job->cb = currJob->cb; - virDomainObjResetJob(&priv->job); - virDomainObjResetAsyncJob(&priv->job); + virDomainObjResetJob(currJob); + virDomainObjResetAsyncJob(currJob); return 0; } diff --git a/src/qemu/qemu_domainjob.h b/src/qemu/qemu_domainjob.h index 36747154c6..a0cd79c705 100644 --- a/src/qemu/qemu_domainjob.h +++ b/src/qemu/qemu_domainjob.h @@ -105,7 +105,7 @@ qemuDomainObjStartJobPhase(virDomainObj *obj, int phase); void qemuDomainObjSetAsyncJobMask(virDomainObj *obj, unsigned long long allowedJobs); -int qemuDomainObjPreserveJob(virDomainObj *obj, +int qemuDomainObjPreserveJob(virDomainJobObj *currJob, virDomainJobObj *job); void qemuDomainObjRestoreAsyncJob(virDomainObj *vm, diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index d29da63242..fc42434a0d 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -8874,7 +8874,7 @@ qemuProcessReconnect(void *opaque) cfg = virQEMUDriverGetConfig(driver); priv = obj->privateData; - qemuDomainObjPreserveJob(obj, &oldjob); + qemuDomainObjPreserveJob(&priv->job, &oldjob); if (oldjob.asyncJob == VIR_ASYNC_JOB_MIGRATION_IN) stopFlags |= VIR_QEMU_PROCESS_STOP_MIGRATED; if (oldjob.asyncJob == VIR_ASYNC_JOB_BACKUP && priv->backup) -- 2.37.1

This patch moves qemuDomainObjPreserveJob() as virDomainObjPreserveJob() into hypervisor in order to be used by other hypervisors as well. Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- src/hypervisor/domain_job.c | 32 ++++++++++++++++++++++++++++++++ src/hypervisor/domain_job.h | 3 +++ src/libvirt_private.syms | 1 + src/qemu/qemu_domainjob.c | 33 --------------------------------- src/qemu/qemu_domainjob.h | 2 -- src/qemu/qemu_process.c | 2 +- 6 files changed, 37 insertions(+), 36 deletions(-) diff --git a/src/hypervisor/domain_job.c b/src/hypervisor/domain_job.c index 1cd9b8d728..804a58047f 100644 --- a/src/hypervisor/domain_job.c +++ b/src/hypervisor/domain_job.c @@ -174,3 +174,35 @@ virDomainObjResetAsyncJob(virDomainJobObj *job) if (job->cb) job->cb->resetJobPrivate(job->privateData); } + +/** + * virDomainObjPreserveJob + * @param currJob structure is a job that needs to be preserved + * @param job structure where to store job details from @currJob + * + * Saves the current job details from @currJob to @job and resets the job in @currJob. + * + * Returns 0 on success, -1 on failure. + */ +int +virDomainObjPreserveJob(virDomainJobObj *currJob, + virDomainJobObj *job) +{ + memset(job, 0, sizeof(*job)); + job->active = currJob->active; + job->owner = currJob->owner; + job->asyncJob = currJob->asyncJob; + job->asyncOwner = currJob->asyncOwner; + job->phase = currJob->phase; + job->privateData = g_steal_pointer(&currJob->privateData); + job->apiFlags = currJob->apiFlags; + + if (currJob->cb && + !(currJob->privateData = currJob->cb->allocJobPrivate())) + return -1; + job->cb = currJob->cb; + + virDomainObjResetJob(currJob); + virDomainObjResetAsyncJob(currJob); + return 0; +} diff --git a/src/hypervisor/domain_job.h b/src/hypervisor/domain_job.h index f857fccce2..44e4bfdb4a 100644 --- a/src/hypervisor/domain_job.h +++ b/src/hypervisor/domain_job.h @@ -214,3 +214,6 @@ void virDomainObjResetJob(virDomainJobObj *job); void virDomainObjResetAgentJob(virDomainJobObj *job); void virDomainObjResetAsyncJob(virDomainJobObj *job); + +int virDomainObjPreserveJob(virDomainJobObj *currJob, + virDomainJobObj *job); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index a8b9d5249f..edfa38c857 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1591,6 +1591,7 @@ virDomainJobStatusToType; virDomainJobTypeFromString; virDomainJobTypeToString; virDomainObjInitJob; +virDomainObjPreserveJob; virDomainObjResetAgentJob; virDomainObjResetAsyncJob; virDomainObjResetJob; diff --git a/src/qemu/qemu_domainjob.c b/src/qemu/qemu_domainjob.c index 260717aa88..4b8ba3f0bc 100644 --- a/src/qemu/qemu_domainjob.c +++ b/src/qemu/qemu_domainjob.c @@ -150,39 +150,6 @@ qemuDomainEventEmitJobCompleted(virQEMUDriver *driver, } -/** - * qemuDomainObjPreserveJob - * @param obj domain with a job that needs to be preserved - * @param job structure where to store job details from @obj - * - * Saves the current job details from @obj to @job and resets the job in @obj. - * - * Returns 0 on success, -1 on failure. - */ -int -qemuDomainObjPreserveJob(virDomainJobObj *currJob, - virDomainJobObj *job) -{ - memset(job, 0, sizeof(*job)); - job->active = currJob->active; - job->owner = currJob->owner; - job->asyncJob = currJob->asyncJob; - job->asyncOwner = currJob->asyncOwner; - job->phase = currJob->phase; - job->privateData = g_steal_pointer(&currJob->privateData); - job->apiFlags = currJob->apiFlags; - - if (currJob->cb && - !(currJob->privateData = currJob->cb->allocJobPrivate())) - return -1; - job->cb = currJob->cb; - - virDomainObjResetJob(currJob); - virDomainObjResetAsyncJob(currJob); - return 0; -} - - void qemuDomainObjRestoreAsyncJob(virDomainObj *vm, virDomainAsyncJob asyncJob, diff --git a/src/qemu/qemu_domainjob.h b/src/qemu/qemu_domainjob.h index a0cd79c705..6272f9d845 100644 --- a/src/qemu/qemu_domainjob.h +++ b/src/qemu/qemu_domainjob.h @@ -105,8 +105,6 @@ qemuDomainObjStartJobPhase(virDomainObj *obj, int phase); void qemuDomainObjSetAsyncJobMask(virDomainObj *obj, unsigned long long allowedJobs); -int qemuDomainObjPreserveJob(virDomainJobObj *currJob, - virDomainJobObj *job); void qemuDomainObjRestoreAsyncJob(virDomainObj *vm, virDomainAsyncJob asyncJob, diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index fc42434a0d..2010c013a6 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -8874,7 +8874,7 @@ qemuProcessReconnect(void *opaque) cfg = virQEMUDriverGetConfig(driver); priv = obj->privateData; - qemuDomainObjPreserveJob(&priv->job, &oldjob); + virDomainObjPreserveJob(&priv->job, &oldjob); if (oldjob.asyncJob == VIR_ASYNC_JOB_MIGRATION_IN) stopFlags |= VIR_QEMU_PROCESS_STOP_MIGRATED; if (oldjob.asyncJob == VIR_ASYNC_JOB_BACKUP && priv->backup) -- 2.37.1

This patch moves qemuDomainObjClearJob() as virDomainObjClearJob() into hypervisor in order to be used by other hypervisors as well. Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- src/hypervisor/domain_job.c | 14 ++++++++++++++ src/hypervisor/domain_job.h | 3 +++ src/libvirt_private.syms | 1 + src/qemu/qemu_domain.c | 2 +- src/qemu/qemu_domainjob.c | 14 -------------- src/qemu/qemu_domainjob.h | 3 --- 6 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/hypervisor/domain_job.c b/src/hypervisor/domain_job.c index 804a58047f..2a19811670 100644 --- a/src/hypervisor/domain_job.c +++ b/src/hypervisor/domain_job.c @@ -206,3 +206,17 @@ virDomainObjPreserveJob(virDomainJobObj *currJob, virDomainObjResetAsyncJob(currJob); return 0; } + +void +virDomainObjClearJob(virDomainJobObj *job) +{ + virDomainObjResetJob(job); + virDomainObjResetAsyncJob(job); + g_clear_pointer(&job->current, virDomainJobDataFree); + g_clear_pointer(&job->completed, virDomainJobDataFree); + virCondDestroy(&job->cond); + virCondDestroy(&job->asyncCond); + + if (job->cb) + g_clear_pointer(&job->privateData, job->cb->freeJobPrivate); +} diff --git a/src/hypervisor/domain_job.h b/src/hypervisor/domain_job.h index 44e4bfdb4a..53ce6706d4 100644 --- a/src/hypervisor/domain_job.h +++ b/src/hypervisor/domain_job.h @@ -217,3 +217,6 @@ void virDomainObjResetAsyncJob(virDomainJobObj *job); int virDomainObjPreserveJob(virDomainJobObj *currJob, virDomainJobObj *job); + +void virDomainObjClearJob(virDomainJobObj *job); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(virDomainJobObj, virDomainObjClearJob); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index edfa38c857..0e355abd69 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1590,6 +1590,7 @@ virDomainJobDataInit; virDomainJobStatusToType; virDomainJobTypeFromString; virDomainJobTypeToString; +virDomainObjClearJob; virDomainObjInitJob; virDomainObjPreserveJob; virDomainObjResetAgentJob; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index a53c25f36e..8beb2f31c1 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1716,7 +1716,7 @@ qemuDomainObjPrivateFree(void *data) qemuDomainObjPrivateDataClear(priv); virObjectUnref(priv->monConfig); - qemuDomainObjClearJob(&priv->job); + virDomainObjClearJob(&priv->job); g_free(priv->lockState); g_free(priv->origname); diff --git a/src/qemu/qemu_domainjob.c b/src/qemu/qemu_domainjob.c index 4b8ba3f0bc..f323f28c77 100644 --- a/src/qemu/qemu_domainjob.c +++ b/src/qemu/qemu_domainjob.c @@ -185,20 +185,6 @@ qemuDomainObjRestoreAsyncJob(virDomainObj *vm, } -void -qemuDomainObjClearJob(virDomainJobObj *job) -{ - virDomainObjResetJob(job); - virDomainObjResetAsyncJob(job); - g_clear_pointer(&job->current, virDomainJobDataFree); - g_clear_pointer(&job->completed, virDomainJobDataFree); - virCondDestroy(&job->cond); - virCondDestroy(&job->asyncCond); - - if (job->cb) - g_clear_pointer(&job->privateData, job->cb->freeJobPrivate); -} - bool qemuDomainTrackJob(virDomainJob job) { diff --git a/src/qemu/qemu_domainjob.h b/src/qemu/qemu_domainjob.h index 6272f9d845..eed94cd87c 100644 --- a/src/qemu/qemu_domainjob.h +++ b/src/qemu/qemu_domainjob.h @@ -133,9 +133,6 @@ int qemuDomainJobDataToParams(virDomainJobData *jobData, bool qemuDomainTrackJob(virDomainJob job); -void qemuDomainObjClearJob(virDomainJobObj *job); -G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(virDomainJobObj, qemuDomainObjClearJob); - int qemuDomainObjPrivateXMLFormatJob(virBuffer *buf, virDomainObj *vm); -- 2.37.1

Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- src/libxl/libxl_domain.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index 467c1ee914..9a23598512 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -44,13 +44,6 @@ VIR_LOG_INIT("libxl.libxl_domain"); -static void -libxlDomainObjFreeJob(libxlDomainObjPrivate *priv) -{ - ignore_value(virCondDestroy(&priv->job.cond)); - virDomainJobDataFree(priv->job.current); -} - /* Give up waiting for mutex after 30 seconds */ #define LIBXL_JOB_WAIT_TIME (1000ull * 30) @@ -185,7 +178,7 @@ libxlDomainObjPrivateFree(void *data) libxlDomainObjPrivate *priv = data; g_free(priv->lockState); - libxlDomainObjFreeJob(priv); + virDomainObjClearJob(&priv->job); virChrdevFree(priv->devs); g_free(priv); } -- 2.37.1

Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- src/lxc/lxc_domain.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/lxc/lxc_domain.c b/src/lxc/lxc_domain.c index 6f048a128a..654c35c640 100644 --- a/src/lxc/lxc_domain.c +++ b/src/lxc/lxc_domain.c @@ -35,11 +35,6 @@ VIR_LOG_INIT("lxc.lxc_domain"); -static void -virLXCDomainObjFreeJob(virLXCDomainObjPrivate *priv) -{ - ignore_value(virCondDestroy(&priv->job.cond)); -} /* Give up waiting for mutex after 30 seconds */ #define LXC_JOB_WAIT_TIME (1000ull * 30) @@ -142,7 +137,7 @@ virLXCDomainObjPrivateFree(void *data) virLXCDomainObjPrivate *priv = data; virCgroupFree(priv->cgroup); - virLXCDomainObjFreeJob(priv); + virDomainObjClearJob(&priv->job); g_free(priv); } -- 2.37.1

Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- src/ch/ch_domain.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/ch/ch_domain.c b/src/ch/ch_domain.c index 499d31cf4a..817b1176d5 100644 --- a/src/ch/ch_domain.c +++ b/src/ch/ch_domain.c @@ -32,12 +32,6 @@ VIR_LOG_INIT("ch.ch_domain"); -static void -virCHDomainObjFreeJob(virCHDomainObjPrivate *priv) -{ - ignore_value(virCondDestroy(&priv->job.cond)); -} - /* * obj must be locked before calling, virCHDriver must NOT be locked * @@ -129,7 +123,7 @@ virCHDomainObjPrivateAlloc(void *opaque) } if (!(priv->chrdevs = virChrdevAlloc())) { - virCHDomainObjFreeJob(priv); + virDomainObjClearJob(&priv->job); g_free(priv); return NULL; } @@ -144,7 +138,7 @@ virCHDomainObjPrivateFree(void *data) virCHDomainObjPrivate *priv = data; virChrdevFree(priv->chrdevs); - virCHDomainObjFreeJob(priv); + virDomainObjClearJob(&priv->job); g_free(priv->machineName); g_free(priv); } -- 2.37.1

This patch moves qemuDomainTrackJob() as virDomainTrackJob() into hypervisor because it is called in begin job and end job functions that will be generalized in the following series. Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- src/hypervisor/domain_job.c | 6 ++++++ src/hypervisor/domain_job.h | 2 ++ src/libvirt_private.syms | 1 + src/qemu/qemu_domainjob.c | 13 +++---------- src/qemu/qemu_domainjob.h | 2 -- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/hypervisor/domain_job.c b/src/hypervisor/domain_job.c index 2a19811670..08e84d575f 100644 --- a/src/hypervisor/domain_job.c +++ b/src/hypervisor/domain_job.c @@ -220,3 +220,9 @@ virDomainObjClearJob(virDomainJobObj *job) if (job->cb) g_clear_pointer(&job->privateData, job->cb->freeJobPrivate); } + +bool +virDomainTrackJob(virDomainJob job) +{ + return (VIR_DOMAIN_TRACK_JOBS & JOB_MASK(job)) != 0; +} diff --git a/src/hypervisor/domain_job.h b/src/hypervisor/domain_job.h index 53ce6706d4..824876b460 100644 --- a/src/hypervisor/domain_job.h +++ b/src/hypervisor/domain_job.h @@ -220,3 +220,5 @@ int virDomainObjPreserveJob(virDomainJobObj *currJob, void virDomainObjClearJob(virDomainJobObj *job); G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(virDomainJobObj, virDomainObjClearJob); + +bool virDomainTrackJob(virDomainJob job); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 0e355abd69..4c35e2a945 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1596,6 +1596,7 @@ virDomainObjPreserveJob; virDomainObjResetAgentJob; virDomainObjResetAsyncJob; virDomainObjResetJob; +virDomainTrackJob; # hypervisor/virclosecallbacks.h diff --git a/src/qemu/qemu_domainjob.c b/src/qemu/qemu_domainjob.c index f323f28c77..f92ec44cb7 100644 --- a/src/qemu/qemu_domainjob.c +++ b/src/qemu/qemu_domainjob.c @@ -185,13 +185,6 @@ qemuDomainObjRestoreAsyncJob(virDomainObj *vm, } -bool -qemuDomainTrackJob(virDomainJob job) -{ - return (VIR_DOMAIN_TRACK_JOBS & JOB_MASK(job)) != 0; -} - - int qemuDomainJobDataUpdateTime(virDomainJobData *jobData) { @@ -870,7 +863,7 @@ qemuDomainObjBeginJobInternal(virQEMUDriver *driver, priv->job.agentStarted = now; } - if (qemuDomainTrackJob(job)) + if (virDomainTrackJob(job)) qemuDomainSaveStatus(obj); return 0; @@ -1092,7 +1085,7 @@ qemuDomainObjEndJob(virDomainObj *obj) obj, obj->def->name); virDomainObjResetJob(&priv->job); - if (qemuDomainTrackJob(job)) + if (virDomainTrackJob(job)) qemuDomainSaveStatus(obj); /* We indeed need to wake up ALL threads waiting because * grabbing a job requires checking more variables. */ @@ -1156,7 +1149,7 @@ qemuDomainObjPrivateXMLFormatJob(virBuffer *buf, g_auto(virBuffer) childBuf = VIR_BUFFER_INIT_CHILD(buf); virDomainJob job = priv->job.active; - if (!qemuDomainTrackJob(job)) + if (!virDomainTrackJob(job)) job = VIR_JOB_NONE; if (job == VIR_JOB_NONE && diff --git a/src/qemu/qemu_domainjob.h b/src/qemu/qemu_domainjob.h index eed94cd87c..7f2869bb41 100644 --- a/src/qemu/qemu_domainjob.h +++ b/src/qemu/qemu_domainjob.h @@ -131,8 +131,6 @@ int qemuDomainJobDataToParams(virDomainJobData *jobData, ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4); -bool qemuDomainTrackJob(virDomainJob job); - int qemuDomainObjPrivateXMLFormatJob(virBuffer *buf, virDomainObj *vm); -- 2.37.1

Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- src/hypervisor/domain_job.c | 8 ++++++++ src/hypervisor/domain_job.h | 2 ++ src/libvirt_private.syms | 1 + src/qemu/qemu_domainjob.c | 14 +++----------- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/hypervisor/domain_job.c b/src/hypervisor/domain_job.c index 08e84d575f..6a7116fb2a 100644 --- a/src/hypervisor/domain_job.c +++ b/src/hypervisor/domain_job.c @@ -226,3 +226,11 @@ virDomainTrackJob(virDomainJob job) { return (VIR_DOMAIN_TRACK_JOBS & JOB_MASK(job)) != 0; } + +bool +virDomainNestedJobAllowed(virDomainJobObj *jobs, virDomainJob newJob) +{ + return !jobs->asyncJob || + newJob == VIR_JOB_NONE || + (jobs->mask & JOB_MASK(newJob)); +} diff --git a/src/hypervisor/domain_job.h b/src/hypervisor/domain_job.h index 824876b460..618fba45bd 100644 --- a/src/hypervisor/domain_job.h +++ b/src/hypervisor/domain_job.h @@ -222,3 +222,5 @@ void virDomainObjClearJob(virDomainJobObj *job); G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(virDomainJobObj, virDomainObjClearJob); bool virDomainTrackJob(virDomainJob job); + +bool virDomainNestedJobAllowed(virDomainJobObj *jobs, virDomainJob newJob); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 4c35e2a945..16117970f2 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1590,6 +1590,7 @@ virDomainJobDataInit; virDomainJobStatusToType; virDomainJobTypeFromString; virDomainJobTypeToString; +virDomainNestedJobAllowed; virDomainObjClearJob; virDomainObjInitJob; virDomainObjPreserveJob; diff --git a/src/qemu/qemu_domainjob.c b/src/qemu/qemu_domainjob.c index f92ec44cb7..46fb2d704b 100644 --- a/src/qemu/qemu_domainjob.c +++ b/src/qemu/qemu_domainjob.c @@ -697,14 +697,6 @@ qemuDomainObjReleaseAsyncJob(virDomainObj *obj) priv->job.asyncOwner = 0; } -static bool -qemuDomainNestedJobAllowed(virDomainJobObj *jobs, virDomainJob newJob) -{ - return !jobs->asyncJob || - newJob == VIR_JOB_NONE || - (jobs->mask & JOB_MASK(newJob)) != 0; -} - static bool qemuDomainObjCanSetJob(virDomainJobObj *job, virDomainJob newJob, @@ -787,7 +779,7 @@ qemuDomainObjBeginJobInternal(virQEMUDriver *driver, goto error; } - while (!nested && !qemuDomainNestedJobAllowed(&priv->job, job)) { + while (!nested && !virDomainNestedJobAllowed(&priv->job, job)) { if (nowait) goto cleanup; @@ -807,7 +799,7 @@ qemuDomainObjBeginJobInternal(virQEMUDriver *driver, /* No job is active but a new async job could have been started while obj * was unlocked, so we need to recheck it. */ - if (!nested && !qemuDomainNestedJobAllowed(&priv->job, job)) + if (!nested && !virDomainNestedJobAllowed(&priv->job, job)) goto retry; if (obj->removing) { @@ -896,7 +888,7 @@ qemuDomainObjBeginJobInternal(virQEMUDriver *driver, duration / 1000, agentDuration / 1000, asyncDuration / 1000); if (job) { - if (nested || qemuDomainNestedJobAllowed(&priv->job, job)) + if (nested || virDomainNestedJobAllowed(&priv->job, job)) blocker = priv->job.ownerAPI; else blocker = priv->job.asyncOwnerAPI; -- 2.37.1

Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- src/hypervisor/domain_job.c | 11 +++++++++++ src/hypervisor/domain_job.h | 4 ++++ src/libvirt_private.syms | 1 + src/qemu/qemu_domainjob.c | 13 +------------ 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/hypervisor/domain_job.c b/src/hypervisor/domain_job.c index 6a7116fb2a..0afed46418 100644 --- a/src/hypervisor/domain_job.c +++ b/src/hypervisor/domain_job.c @@ -234,3 +234,14 @@ virDomainNestedJobAllowed(virDomainJobObj *jobs, virDomainJob newJob) newJob == VIR_JOB_NONE || (jobs->mask & JOB_MASK(newJob)); } + +bool +virDomainObjCanSetJob(virDomainJobObj *job, + virDomainJob newJob, + virDomainAgentJob newAgentJob) +{ + return ((newJob == VIR_JOB_NONE || + job->active == VIR_JOB_NONE) && + (newAgentJob == VIR_AGENT_JOB_NONE || + job->agentActive == VIR_AGENT_JOB_NONE)); +} diff --git a/src/hypervisor/domain_job.h b/src/hypervisor/domain_job.h index 618fba45bd..30893dabc3 100644 --- a/src/hypervisor/domain_job.h +++ b/src/hypervisor/domain_job.h @@ -224,3 +224,7 @@ G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(virDomainJobObj, virDomainObjClearJob); bool virDomainTrackJob(virDomainJob job); bool virDomainNestedJobAllowed(virDomainJobObj *jobs, virDomainJob newJob); + +bool virDomainObjCanSetJob(virDomainJobObj *job, + virDomainJob newJob, + virDomainAgentJob newAgentJob); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 16117970f2..9f6389ae63 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1591,6 +1591,7 @@ virDomainJobStatusToType; virDomainJobTypeFromString; virDomainJobTypeToString; virDomainNestedJobAllowed; +virDomainObjCanSetJob; virDomainObjClearJob; virDomainObjInitJob; virDomainObjPreserveJob; diff --git a/src/qemu/qemu_domainjob.c b/src/qemu/qemu_domainjob.c index 46fb2d704b..d682f7be38 100644 --- a/src/qemu/qemu_domainjob.c +++ b/src/qemu/qemu_domainjob.c @@ -697,17 +697,6 @@ qemuDomainObjReleaseAsyncJob(virDomainObj *obj) priv->job.asyncOwner = 0; } -static bool -qemuDomainObjCanSetJob(virDomainJobObj *job, - virDomainJob newJob, - virDomainAgentJob newAgentJob) -{ - return ((newJob == VIR_JOB_NONE || - job->active == VIR_JOB_NONE) && - (newAgentJob == VIR_AGENT_JOB_NONE || - job->agentActive == VIR_AGENT_JOB_NONE)); -} - /* Give up waiting for mutex after 30 seconds */ #define QEMU_JOB_WAIT_TIME (1000ull * 30) @@ -788,7 +777,7 @@ qemuDomainObjBeginJobInternal(virQEMUDriver *driver, goto error; } - while (!qemuDomainObjCanSetJob(&priv->job, job, agentJob)) { + while (!virDomainObjCanSetJob(&priv->job, job, agentJob)) { if (nowait) goto cleanup; -- 2.37.1

On 8/3/22 14:43, Kristina Hanicova wrote:
This series moves helper functions from qemu so that they can be used by other hypervisors or BeginJob / EndJob functions which will be generalized and moved in one of the following series as well.
Kristina Hanicova (11): qemu & hypervisor: move qemuDomainObjResetAgentJob() into hypervisor qemu & hypervisor: move qemuDomainObjResetAsyncJob() into hypervisor qemu: propagate virDomainJobObj into qemuDomainObjPreserveJob() qemu & hypervisor: move qemuDomainObjPreserveJob() into hypervisor qemu & hypervisor: move qemuDomainObjClearJob() into hypervisor libxl: use virDomainObjClearJob() instead of libxlDomainObjFreeJob() LXC: use virDomainObjClearJob() instead of virLXCDomainObjFreeJob() CH: use virDomainObjClearJob() instead of virCHDomainObjFreeJob() qemu & hypervisor: move qemuDomainTrackJob() into hypervisor qemu: move virDomainNestedJobAllowed into hypervisor qemu: move virDomainObjCanSetJob() into hypervisor
src/ch/ch_domain.c | 10 +-- src/hypervisor/domain_job.c | 99 +++++++++++++++++++++++++++ src/hypervisor/domain_job.h | 18 +++++ src/libvirt_private.syms | 7 ++ src/libxl/libxl_domain.c | 9 +-- src/lxc/lxc_domain.c | 7 +- src/qemu/qemu_domain.c | 2 +- src/qemu/qemu_domainjob.c | 129 ++++-------------------------------- src/qemu/qemu_domainjob.h | 7 -- src/qemu/qemu_process.c | 2 +- 10 files changed, 142 insertions(+), 148 deletions(-)
Reviewed-by: Michal Privoznik <mprivozn@redhat.com> Michal
participants (2)
-
Kristina Hanicova
-
Michal Prívozník