qemu_domainjob: introduce privateData for qemuDomainJob

To remove dependecy of `qemuDomainJob` on job specific
paramters, a `privateData` pointer is introduced.
To handle it, structure of callback functions is
also introduced.

Signed-off-by: Prathamesh Chavan <pc44800@gmail.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Prathamesh Chavan 2020-07-16 17:18:34 +05:30 committed by Michal Privoznik
parent a9f1ac3a97
commit aca37c3fb2
8 changed files with 170 additions and 43 deletions

View File

@ -88,6 +88,74 @@ VIR_ENUM_IMPL(qemuDomainNamespace,
"mount", "mount",
); );
static void *
qemuJobAllocPrivate(void)
{
return g_new0(qemuDomainJobPrivate, 1);
}
static void
qemuJobFreePrivate(void *opaque)
{
qemuDomainJobPrivatePtr priv = opaque;
if (!priv)
return;
qemuMigrationParamsFree(priv->migParams);
VIR_FREE(priv);
}
static void
qemuJobResetPrivate(void *opaque)
{
qemuDomainJobPrivatePtr priv = opaque;
priv->spiceMigration = false;
priv->spiceMigrated = false;
priv->dumpCompleted = false;
qemuMigrationParamsFree(priv->migParams);
priv->migParams = NULL;
}
static int
qemuDomainFormatJobPrivate(virBufferPtr buf,
qemuDomainJobObjPtr job)
{
qemuDomainJobPrivatePtr priv = job->privateData;
if (priv->migParams)
qemuMigrationParamsFormat(buf, priv->migParams);
return 0;
}
static int
qemuDomainParseJobPrivate(xmlXPathContextPtr ctxt,
qemuDomainJobObjPtr job)
{
qemuDomainJobPrivatePtr priv = job->privateData;
if (qemuMigrationParamsParse(ctxt, &priv->migParams) < 0)
return -1;
return 0;
}
static qemuDomainObjPrivateJobCallbacks qemuPrivateJobCallbacks = {
.allocJobPrivate = qemuJobAllocPrivate,
.freeJobPrivate = qemuJobFreePrivate,
.resetJobPrivate = qemuJobResetPrivate,
.formatJob = qemuDomainFormatJobPrivate,
.parseJob = qemuDomainParseJobPrivate,
};
/** /**
* qemuDomainObjFromDomain: * qemuDomainObjFromDomain:
* @domain: Domain pointer that has to be looked up * @domain: Domain pointer that has to be looked up
@ -1585,7 +1653,7 @@ qemuDomainObjPrivateAlloc(void *opaque)
if (VIR_ALLOC(priv) < 0) if (VIR_ALLOC(priv) < 0)
return NULL; return NULL;
if (qemuDomainObjInitJob(&priv->job) < 0) { if (qemuDomainObjInitJob(&priv->job, &qemuPrivateJobCallbacks) < 0) {
virReportSystemError(errno, "%s", virReportSystemError(errno, "%s",
_("Unable to init qemu driver mutexes")); _("Unable to init qemu driver mutexes"));
goto error; goto error;

View File

@ -492,6 +492,16 @@ struct _qemuDomainXmlNsDef {
char **capsdel; char **capsdel;
}; };
typedef struct _qemuDomainJobPrivate qemuDomainJobPrivate;
typedef qemuDomainJobPrivate *qemuDomainJobPrivatePtr;
struct _qemuDomainJobPrivate {
bool spiceMigration; /* we asked for spice migration and we
* should wait for it to finish */
bool spiceMigrated; /* spice migration completed */
bool dumpCompleted; /* dump completed */
qemuMigrationParamsPtr migParams;
};
int qemuDomainObjStartWorker(virDomainObjPtr dom); int qemuDomainObjStartWorker(virDomainObjPtr dom);
void qemuDomainObjStopWorker(virDomainObjPtr dom); void qemuDomainObjStopWorker(virDomainObjPtr dom);

View File

@ -161,14 +161,22 @@ qemuDomainEventEmitJobCompleted(virQEMUDriverPtr driver,
int int
qemuDomainObjInitJob(qemuDomainJobObjPtr job) qemuDomainObjInitJob(qemuDomainJobObjPtr job,
qemuDomainObjPrivateJobCallbacksPtr cb)
{ {
memset(job, 0, sizeof(*job)); memset(job, 0, sizeof(*job));
job->cb = cb;
if (virCondInit(&job->cond) < 0) if (!(job->privateData = job->cb->allocJobPrivate()))
return -1; return -1;
if (virCondInit(&job->cond) < 0) {
job->cb->freeJobPrivate(job->privateData);
return -1;
}
if (virCondInit(&job->asyncCond) < 0) { if (virCondInit(&job->asyncCond) < 0) {
job->cb->freeJobPrivate(job->privateData);
virCondDestroy(&job->cond); virCondDestroy(&job->cond);
return -1; return -1;
} }
@ -207,17 +215,13 @@ qemuDomainObjResetAsyncJob(qemuDomainJobObjPtr job)
job->phase = 0; job->phase = 0;
job->mask = QEMU_JOB_DEFAULT_MASK; job->mask = QEMU_JOB_DEFAULT_MASK;
job->abortJob = false; job->abortJob = false;
job->spiceMigration = false;
job->spiceMigrated = false;
job->dumpCompleted = false;
VIR_FREE(job->error); VIR_FREE(job->error);
g_clear_pointer(&job->current, qemuDomainJobInfoFree); g_clear_pointer(&job->current, qemuDomainJobInfoFree);
qemuMigrationParamsFree(job->migParams); job->cb->resetJobPrivate(job->privateData);
job->migParams = NULL;
job->apiFlags = 0; job->apiFlags = 0;
} }
void int
qemuDomainObjRestoreJob(virDomainObjPtr obj, qemuDomainObjRestoreJob(virDomainObjPtr obj,
qemuDomainJobObjPtr job) qemuDomainJobObjPtr job)
{ {
@ -229,11 +233,16 @@ qemuDomainObjRestoreJob(virDomainObjPtr obj,
job->asyncJob = priv->job.asyncJob; job->asyncJob = priv->job.asyncJob;
job->asyncOwner = priv->job.asyncOwner; job->asyncOwner = priv->job.asyncOwner;
job->phase = priv->job.phase; job->phase = priv->job.phase;
job->migParams = g_steal_pointer(&priv->job.migParams); job->privateData = g_steal_pointer(&priv->job.privateData);
job->apiFlags = priv->job.apiFlags; job->apiFlags = priv->job.apiFlags;
if (!(priv->job.privateData = priv->job.cb->allocJobPrivate()))
return -1;
job->cb = priv->job.cb;
qemuDomainObjResetJob(&priv->job); qemuDomainObjResetJob(&priv->job);
qemuDomainObjResetAsyncJob(&priv->job); qemuDomainObjResetAsyncJob(&priv->job);
return 0;
} }
void void
@ -241,6 +250,7 @@ qemuDomainObjFreeJob(qemuDomainJobObjPtr job)
{ {
qemuDomainObjResetJob(job); qemuDomainObjResetJob(job);
qemuDomainObjResetAsyncJob(job); qemuDomainObjResetAsyncJob(job);
job->cb->freeJobPrivate(job->privateData);
g_clear_pointer(&job->current, qemuDomainJobInfoFree); g_clear_pointer(&job->current, qemuDomainJobInfoFree);
g_clear_pointer(&job->completed, qemuDomainJobInfoFree); g_clear_pointer(&job->completed, qemuDomainJobInfoFree);
virCondDestroy(&job->cond); virCondDestroy(&job->cond);
@ -1239,14 +1249,14 @@ qemuDomainObjPrivateXMLFormatNBDMigration(virBufferPtr buf,
return 0; return 0;
} }
int int
qemuDomainObjPrivateXMLFormatJob(virBufferPtr buf, qemuDomainObjPrivateXMLFormatJob(virBufferPtr buf,
virDomainObjPtr vm) virDomainObjPtr vm)
{ {
qemuDomainObjPrivatePtr priv = vm->privateData;
qemuDomainJobObjPtr jobObj = &priv->job;
g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER; g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER;
g_auto(virBuffer) childBuf = VIR_BUFFER_INIT_CHILD(buf); g_auto(virBuffer) childBuf = VIR_BUFFER_INIT_CHILD(buf);
qemuDomainObjPrivatePtr priv = vm->privateData;
qemuDomainJob job = priv->job.active; qemuDomainJob job = priv->job.active;
if (!qemuDomainTrackJob(job)) if (!qemuDomainTrackJob(job))
@ -1273,8 +1283,8 @@ qemuDomainObjPrivateXMLFormatJob(virBufferPtr buf,
qemuDomainObjPrivateXMLFormatNBDMigration(&childBuf, vm) < 0) qemuDomainObjPrivateXMLFormatNBDMigration(&childBuf, vm) < 0)
return -1; return -1;
if (priv->job.migParams) if (jobObj->cb->formatJob(&childBuf, jobObj) < 0)
qemuMigrationParamsFormat(&childBuf, priv->job.migParams); return -1;
virXMLFormatElement(buf, "job", &attrBuf, &childBuf); virXMLFormatElement(buf, "job", &attrBuf, &childBuf);
@ -1366,12 +1376,12 @@ qemuDomainObjPrivateXMLParseJobNBD(virDomainObjPtr vm,
return 0; return 0;
} }
int int
qemuDomainObjPrivateXMLParseJob(virDomainObjPtr vm, qemuDomainObjPrivateXMLParseJob(virDomainObjPtr vm,
xmlXPathContextPtr ctxt) xmlXPathContextPtr ctxt)
{ {
qemuDomainObjPrivatePtr priv = vm->privateData; qemuDomainObjPrivatePtr priv = vm->privateData;
qemuDomainJobObjPtr job = &priv->job;
VIR_XPATH_NODE_AUTORESTORE(ctxt); VIR_XPATH_NODE_AUTORESTORE(ctxt);
g_autofree char *tmp = NULL; g_autofree char *tmp = NULL;
@ -1420,7 +1430,7 @@ qemuDomainObjPrivateXMLParseJob(virDomainObjPtr vm,
if (qemuDomainObjPrivateXMLParseJobNBD(vm, ctxt) < 0) if (qemuDomainObjPrivateXMLParseJobNBD(vm, ctxt) < 0)
return -1; return -1;
if (qemuMigrationParamsParse(ctxt, &priv->job.migParams) < 0) if (job->cb->parseJob(ctxt, job) < 0)
return -1; return -1;
return 0; return 0;

View File

@ -19,7 +19,7 @@
#pragma once #pragma once
#include <glib-object.h> #include <glib-object.h>
#include "qemu_migration_params.h" #include "qemu_monitor.h"
#define JOB_MASK(job) (job == 0 ? 0 : 1 << (job - 1)) #define JOB_MASK(job) (job == 0 ? 0 : 1 << (job - 1))
#define QEMU_JOB_DEFAULT_MASK \ #define QEMU_JOB_DEFAULT_MASK \
@ -156,6 +156,25 @@ qemuDomainJobInfoCopy(qemuDomainJobInfoPtr info);
typedef struct _qemuDomainJobObj qemuDomainJobObj; typedef struct _qemuDomainJobObj qemuDomainJobObj;
typedef qemuDomainJobObj *qemuDomainJobObjPtr; typedef qemuDomainJobObj *qemuDomainJobObjPtr;
typedef void *(*qemuDomainObjPrivateJobAlloc)(void);
typedef void (*qemuDomainObjPrivateJobFree)(void *);
typedef void (*qemuDomainObjPrivateJobReset)(void *);
typedef int (*qemuDomainObjPrivateJobFormat)(virBufferPtr,
qemuDomainJobObjPtr);
typedef int (*qemuDomainObjPrivateJobParse)(xmlXPathContextPtr,
qemuDomainJobObjPtr);
typedef struct _qemuDomainObjPrivateJobCallbacks qemuDomainObjPrivateJobCallbacks;
typedef qemuDomainObjPrivateJobCallbacks *qemuDomainObjPrivateJobCallbacksPtr;
struct _qemuDomainObjPrivateJobCallbacks {
qemuDomainObjPrivateJobAlloc allocJobPrivate;
qemuDomainObjPrivateJobFree freeJobPrivate;
qemuDomainObjPrivateJobReset resetJobPrivate;
qemuDomainObjPrivateJobFormat formatJob;
qemuDomainObjPrivateJobParse parseJob;
};
struct _qemuDomainJobObj { struct _qemuDomainJobObj {
virCond cond; /* Use to coordinate jobs */ virCond cond; /* Use to coordinate jobs */
@ -182,14 +201,11 @@ struct _qemuDomainJobObj {
qemuDomainJobInfoPtr current; /* async job progress data */ qemuDomainJobInfoPtr current; /* async job progress data */
qemuDomainJobInfoPtr completed; /* statistics data of a recently completed job */ qemuDomainJobInfoPtr completed; /* statistics data of a recently completed job */
bool abortJob; /* abort of the job requested */ bool abortJob; /* abort of the job requested */
bool spiceMigration; /* we asked for spice migration and we
* should wait for it to finish */
bool spiceMigrated; /* spice migration completed */
char *error; /* job event completion error */ char *error; /* job event completion error */
bool dumpCompleted; /* dump completed */
qemuMigrationParamsPtr migParams;
unsigned long apiFlags; /* flags passed to the API which started the async job */ unsigned long apiFlags; /* flags passed to the API which started the async job */
void *privateData; /* job specific collection of data */
qemuDomainObjPrivateJobCallbacksPtr cb;
}; };
const char *qemuDomainAsyncJobPhaseToString(qemuDomainAsyncJob job, const char *qemuDomainAsyncJobPhaseToString(qemuDomainAsyncJob job,
@ -234,8 +250,8 @@ void qemuDomainObjSetJobPhase(virQEMUDriverPtr driver,
int phase); int phase);
void qemuDomainObjSetAsyncJobMask(virDomainObjPtr obj, void qemuDomainObjSetAsyncJobMask(virDomainObjPtr obj,
unsigned long long allowedJobs); unsigned long long allowedJobs);
void qemuDomainObjRestoreJob(virDomainObjPtr obj, int qemuDomainObjRestoreJob(virDomainObjPtr obj,
qemuDomainJobObjPtr job); qemuDomainJobObjPtr job);
void qemuDomainObjDiscardAsyncJob(virQEMUDriverPtr driver, void qemuDomainObjDiscardAsyncJob(virQEMUDriverPtr driver,
virDomainObjPtr obj); virDomainObjPtr obj);
void qemuDomainObjReleaseAsyncJob(virDomainObjPtr obj); void qemuDomainObjReleaseAsyncJob(virDomainObjPtr obj);
@ -264,7 +280,9 @@ bool qemuDomainTrackJob(qemuDomainJob job);
void qemuDomainObjFreeJob(qemuDomainJobObjPtr job); void qemuDomainObjFreeJob(qemuDomainJobObjPtr job);
int qemuDomainObjInitJob(qemuDomainJobObjPtr job); int
qemuDomainObjInitJob(qemuDomainJobObjPtr job,
qemuDomainObjPrivateJobCallbacksPtr cb);
bool qemuDomainJobAllowed(qemuDomainJobObjPtr jobs, qemuDomainJob newJob); bool qemuDomainJobAllowed(qemuDomainJobObjPtr jobs, qemuDomainJob newJob);

View File

@ -3701,9 +3701,10 @@ static int
qemuDumpWaitForCompletion(virDomainObjPtr vm) qemuDumpWaitForCompletion(virDomainObjPtr vm)
{ {
qemuDomainObjPrivatePtr priv = vm->privateData; qemuDomainObjPrivatePtr priv = vm->privateData;
qemuDomainJobPrivatePtr jobPriv = priv->job.privateData;
VIR_DEBUG("Waiting for dump completion"); VIR_DEBUG("Waiting for dump completion");
while (!priv->job.dumpCompleted && !priv->job.abortJob) { while (!jobPriv->dumpCompleted && !priv->job.abortJob) {
if (virDomainObjWait(vm) < 0) if (virDomainObjWait(vm) < 0)
return -1; return -1;
} }

View File

@ -1422,12 +1422,13 @@ static int
qemuMigrationSrcWaitForSpice(virDomainObjPtr vm) qemuMigrationSrcWaitForSpice(virDomainObjPtr vm)
{ {
qemuDomainObjPrivatePtr priv = vm->privateData; qemuDomainObjPrivatePtr priv = vm->privateData;
qemuDomainJobPrivatePtr jobPriv = priv->job.privateData;
if (!priv->job.spiceMigration) if (!jobPriv->spiceMigration)
return 0; return 0;
VIR_DEBUG("Waiting for SPICE to finish migration"); VIR_DEBUG("Waiting for SPICE to finish migration");
while (!priv->job.spiceMigrated && !priv->job.abortJob) { while (!jobPriv->spiceMigrated && !priv->job.abortJob) {
if (virDomainObjWait(vm) < 0) if (virDomainObjWait(vm) < 0)
return -1; return -1;
} }
@ -1856,9 +1857,11 @@ qemuMigrationSrcGraphicsRelocate(virQEMUDriverPtr driver,
if (qemuDomainObjEnterMonitorAsync(driver, vm, if (qemuDomainObjEnterMonitorAsync(driver, vm,
QEMU_ASYNC_JOB_MIGRATION_OUT) == 0) { QEMU_ASYNC_JOB_MIGRATION_OUT) == 0) {
qemuDomainJobPrivatePtr jobPriv = priv->job.privateData;
ret = qemuMonitorGraphicsRelocate(priv->mon, type, listenAddress, ret = qemuMonitorGraphicsRelocate(priv->mon, type, listenAddress,
port, tlsPort, tlsSubject); port, tlsPort, tlsSubject);
priv->job.spiceMigration = !ret; jobPriv->spiceMigration = !ret;
if (qemuDomainObjExitMonitor(driver, vm) < 0) if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1; ret = -1;
} }
@ -1993,6 +1996,7 @@ qemuMigrationSrcCleanup(virDomainObjPtr vm,
{ {
virQEMUDriverPtr driver = opaque; virQEMUDriverPtr driver = opaque;
qemuDomainObjPrivatePtr priv = vm->privateData; qemuDomainObjPrivatePtr priv = vm->privateData;
qemuDomainJobPrivatePtr jobPriv = priv->job.privateData;
VIR_DEBUG("vm=%s, conn=%p, asyncJob=%s, phase=%s", VIR_DEBUG("vm=%s, conn=%p, asyncJob=%s, phase=%s",
vm->def->name, conn, vm->def->name, conn,
@ -2018,7 +2022,7 @@ qemuMigrationSrcCleanup(virDomainObjPtr vm,
" domain was successfully started on destination or not", " domain was successfully started on destination or not",
vm->def->name); vm->def->name);
qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT, qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
priv->job.migParams, priv->job.apiFlags); jobPriv->migParams, priv->job.apiFlags);
/* clear the job and let higher levels decide what to do */ /* clear the job and let higher levels decide what to do */
qemuDomainObjDiscardAsyncJob(driver, vm); qemuDomainObjDiscardAsyncJob(driver, vm);
break; break;
@ -2382,6 +2386,7 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
int dataFD[2] = { -1, -1 }; int dataFD[2] = { -1, -1 };
qemuDomainObjPrivatePtr priv = NULL; qemuDomainObjPrivatePtr priv = NULL;
qemuMigrationCookiePtr mig = NULL; qemuMigrationCookiePtr mig = NULL;
qemuDomainJobPrivatePtr jobPriv = NULL;
bool tunnel = !!st; bool tunnel = !!st;
g_autofree char *xmlout = NULL; g_autofree char *xmlout = NULL;
unsigned int cookieFlags; unsigned int cookieFlags;
@ -2505,6 +2510,7 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
*def = NULL; *def = NULL;
priv = vm->privateData; priv = vm->privateData;
jobPriv = priv->job.privateData;
priv->origname = g_strdup(origname); priv->origname = g_strdup(origname);
if (taint_hook) { if (taint_hook) {
@ -2710,7 +2716,7 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
stopjob: stopjob:
qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN, qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN,
priv->job.migParams, priv->job.apiFlags); jobPriv->migParams, priv->job.apiFlags);
if (stopProcess) { if (stopProcess) {
unsigned int stopFlags = VIR_QEMU_PROCESS_STOP_MIGRATED; unsigned int stopFlags = VIR_QEMU_PROCESS_STOP_MIGRATED;
@ -2979,6 +2985,7 @@ qemuMigrationSrcConfirmPhase(virQEMUDriverPtr driver,
virObjectEventPtr event; virObjectEventPtr event;
g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
qemuDomainObjPrivatePtr priv = vm->privateData; qemuDomainObjPrivatePtr priv = vm->privateData;
qemuDomainJobPrivatePtr jobPriv = priv->job.privateData;
qemuDomainJobInfoPtr jobInfo = NULL; qemuDomainJobInfoPtr jobInfo = NULL;
VIR_DEBUG("driver=%p, vm=%p, cookiein=%s, cookieinlen=%d, " VIR_DEBUG("driver=%p, vm=%p, cookiein=%s, cookieinlen=%d, "
@ -3064,7 +3071,7 @@ qemuMigrationSrcConfirmPhase(virQEMUDriverPtr driver,
qemuMigrationSrcRestoreDomainState(driver, vm); qemuMigrationSrcRestoreDomainState(driver, vm);
qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT, qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
priv->job.migParams, priv->job.apiFlags); jobPriv->migParams, priv->job.apiFlags);
if (virDomainObjSave(vm, driver->xmlopt, cfg->stateDir) < 0) if (virDomainObjSave(vm, driver->xmlopt, cfg->stateDir) < 0)
VIR_WARN("Failed to save status on vm %s", vm->def->name); VIR_WARN("Failed to save status on vm %s", vm->def->name);
@ -4642,6 +4649,7 @@ qemuMigrationSrcPerformJob(virQEMUDriverPtr driver,
virErrorPtr orig_err = NULL; virErrorPtr orig_err = NULL;
g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
qemuDomainObjPrivatePtr priv = vm->privateData; qemuDomainObjPrivatePtr priv = vm->privateData;
qemuDomainJobPrivatePtr jobPriv = priv->job.privateData;
if (qemuMigrationJobStart(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT, if (qemuMigrationJobStart(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
flags) < 0) flags) < 0)
@ -4699,7 +4707,7 @@ qemuMigrationSrcPerformJob(virQEMUDriverPtr driver,
*/ */
if (!v3proto && ret < 0) if (!v3proto && ret < 0)
qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT, qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
priv->job.migParams, priv->job.apiFlags); jobPriv->migParams, priv->job.apiFlags);
qemuMigrationSrcRestoreDomainState(driver, vm); qemuMigrationSrcRestoreDomainState(driver, vm);
@ -4740,6 +4748,7 @@ qemuMigrationSrcPerformPhase(virQEMUDriverPtr driver,
unsigned long resource) unsigned long resource)
{ {
qemuDomainObjPrivatePtr priv = vm->privateData; qemuDomainObjPrivatePtr priv = vm->privateData;
qemuDomainJobPrivatePtr jobPriv = priv->job.privateData;
int ret = -1; int ret = -1;
/* If we didn't start the job in the begin phase, start it now. */ /* If we didn't start the job in the begin phase, start it now. */
@ -4774,7 +4783,7 @@ qemuMigrationSrcPerformPhase(virQEMUDriverPtr driver,
endjob: endjob:
if (ret < 0) { if (ret < 0) {
qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT, qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
priv->job.migParams, priv->job.apiFlags); jobPriv->migParams, priv->job.apiFlags);
qemuMigrationJobFinish(driver, vm); qemuMigrationJobFinish(driver, vm);
} else { } else {
qemuMigrationJobContinue(vm); qemuMigrationJobContinue(vm);
@ -4973,6 +4982,7 @@ qemuMigrationDstFinish(virQEMUDriverPtr driver,
virErrorPtr orig_err = NULL; virErrorPtr orig_err = NULL;
int cookie_flags = 0; int cookie_flags = 0;
qemuDomainObjPrivatePtr priv = vm->privateData; qemuDomainObjPrivatePtr priv = vm->privateData;
qemuDomainJobPrivatePtr jobPriv = priv->job.privateData;
g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
unsigned short port; unsigned short port;
unsigned long long timeReceived = 0; unsigned long long timeReceived = 0;
@ -5226,7 +5236,7 @@ qemuMigrationDstFinish(virQEMUDriverPtr driver,
} }
qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN, qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN,
priv->job.migParams, priv->job.apiFlags); jobPriv->migParams, priv->job.apiFlags);
qemuMigrationJobFinish(driver, vm); qemuMigrationJobFinish(driver, vm);
if (!virDomainObjIsActive(vm)) if (!virDomainObjIsActive(vm))

View File

@ -950,6 +950,7 @@ qemuMigrationParamsEnableTLS(virQEMUDriverPtr driver,
qemuMigrationParamsPtr migParams) qemuMigrationParamsPtr migParams)
{ {
qemuDomainObjPrivatePtr priv = vm->privateData; qemuDomainObjPrivatePtr priv = vm->privateData;
qemuDomainJobPrivatePtr jobPriv = priv->job.privateData;
g_autoptr(virJSONValue) tlsProps = NULL; g_autoptr(virJSONValue) tlsProps = NULL;
g_autoptr(virJSONValue) secProps = NULL; g_autoptr(virJSONValue) secProps = NULL;
g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
@ -961,7 +962,7 @@ qemuMigrationParamsEnableTLS(virQEMUDriverPtr driver,
return -1; return -1;
} }
if (!priv->job.migParams->params[QEMU_MIGRATION_PARAM_TLS_CREDS].set) { if (!jobPriv->migParams->params[QEMU_MIGRATION_PARAM_TLS_CREDS].set) {
virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
_("TLS migration is not supported with this " _("TLS migration is not supported with this "
"QEMU binary")); "QEMU binary"));
@ -1025,8 +1026,9 @@ qemuMigrationParamsDisableTLS(virDomainObjPtr vm,
qemuMigrationParamsPtr migParams) qemuMigrationParamsPtr migParams)
{ {
qemuDomainObjPrivatePtr priv = vm->privateData; qemuDomainObjPrivatePtr priv = vm->privateData;
qemuDomainJobPrivatePtr jobPriv = priv->job.privateData;
if (!priv->job.migParams->params[QEMU_MIGRATION_PARAM_TLS_CREDS].set) if (!jobPriv->migParams->params[QEMU_MIGRATION_PARAM_TLS_CREDS].set)
return 0; return 0;
if (qemuMigrationParamsSetString(migParams, if (qemuMigrationParamsSetString(migParams,
@ -1150,6 +1152,7 @@ qemuMigrationParamsCheck(virQEMUDriverPtr driver,
virBitmapPtr remoteCaps) virBitmapPtr remoteCaps)
{ {
qemuDomainObjPrivatePtr priv = vm->privateData; qemuDomainObjPrivatePtr priv = vm->privateData;
qemuDomainJobPrivatePtr jobPriv = priv->job.privateData;
qemuMigrationCapability cap; qemuMigrationCapability cap;
qemuMigrationParty party; qemuMigrationParty party;
size_t i; size_t i;
@ -1203,7 +1206,7 @@ qemuMigrationParamsCheck(virQEMUDriverPtr driver,
* to ask QEMU for their current settings. * to ask QEMU for their current settings.
*/ */
return qemuMigrationParamsFetch(driver, vm, asyncJob, &priv->job.migParams); return qemuMigrationParamsFetch(driver, vm, asyncJob, &jobPriv->migParams);
} }

View File

@ -1608,6 +1608,7 @@ qemuProcessHandleSpiceMigrated(qemuMonitorPtr mon G_GNUC_UNUSED,
void *opaque G_GNUC_UNUSED) void *opaque G_GNUC_UNUSED)
{ {
qemuDomainObjPrivatePtr priv; qemuDomainObjPrivatePtr priv;
qemuDomainJobPrivatePtr jobPriv;
virObjectLock(vm); virObjectLock(vm);
@ -1615,12 +1616,13 @@ qemuProcessHandleSpiceMigrated(qemuMonitorPtr mon G_GNUC_UNUSED,
vm, vm->def->name); vm, vm->def->name);
priv = vm->privateData; priv = vm->privateData;
jobPriv = priv->job.privateData;
if (priv->job.asyncJob != QEMU_ASYNC_JOB_MIGRATION_OUT) { if (priv->job.asyncJob != QEMU_ASYNC_JOB_MIGRATION_OUT) {
VIR_DEBUG("got SPICE_MIGRATE_COMPLETED event without a migration job"); VIR_DEBUG("got SPICE_MIGRATE_COMPLETED event without a migration job");
goto cleanup; goto cleanup;
} }
priv->job.spiceMigrated = true; jobPriv->spiceMigrated = true;
virDomainObjBroadcast(vm); virDomainObjBroadcast(vm);
cleanup: cleanup:
@ -1720,6 +1722,7 @@ qemuProcessHandleDumpCompleted(qemuMonitorPtr mon G_GNUC_UNUSED,
void *opaque G_GNUC_UNUSED) void *opaque G_GNUC_UNUSED)
{ {
qemuDomainObjPrivatePtr priv; qemuDomainObjPrivatePtr priv;
qemuDomainJobPrivatePtr jobPriv;
virObjectLock(vm); virObjectLock(vm);
@ -1727,11 +1730,12 @@ qemuProcessHandleDumpCompleted(qemuMonitorPtr mon G_GNUC_UNUSED,
vm, vm->def->name, stats, NULLSTR(error)); vm, vm->def->name, stats, NULLSTR(error));
priv = vm->privateData; priv = vm->privateData;
jobPriv = priv->job.privateData;
if (priv->job.asyncJob == QEMU_ASYNC_JOB_NONE) { if (priv->job.asyncJob == QEMU_ASYNC_JOB_NONE) {
VIR_DEBUG("got DUMP_COMPLETED event without a dump_completed job"); VIR_DEBUG("got DUMP_COMPLETED event without a dump_completed job");
goto cleanup; goto cleanup;
} }
priv->job.dumpCompleted = true; jobPriv->dumpCompleted = true;
priv->job.current->stats.dump = *stats; priv->job.current->stats.dump = *stats;
priv->job.error = g_strdup(error); priv->job.error = g_strdup(error);
@ -3411,6 +3415,8 @@ qemuProcessRecoverMigrationIn(virQEMUDriverPtr driver,
virDomainState state, virDomainState state,
int reason) int reason)
{ {
qemuDomainJobPrivatePtr jobPriv = job->privateData;
bool postcopy = (state == VIR_DOMAIN_PAUSED && bool postcopy = (state == VIR_DOMAIN_PAUSED &&
reason == VIR_DOMAIN_PAUSED_POSTCOPY_FAILED) || reason == VIR_DOMAIN_PAUSED_POSTCOPY_FAILED) ||
(state == VIR_DOMAIN_RUNNING && (state == VIR_DOMAIN_RUNNING &&
@ -3459,7 +3465,7 @@ qemuProcessRecoverMigrationIn(virQEMUDriverPtr driver,
} }
qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_NONE, qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_NONE,
job->migParams, job->apiFlags); jobPriv->migParams, job->apiFlags);
return 0; return 0;
} }
@ -3471,6 +3477,7 @@ qemuProcessRecoverMigrationOut(virQEMUDriverPtr driver,
int reason, int reason,
unsigned int *stopFlags) unsigned int *stopFlags)
{ {
qemuDomainJobPrivatePtr jobPriv = job->privateData;
bool postcopy = state == VIR_DOMAIN_PAUSED && bool postcopy = state == VIR_DOMAIN_PAUSED &&
(reason == VIR_DOMAIN_PAUSED_POSTCOPY || (reason == VIR_DOMAIN_PAUSED_POSTCOPY ||
reason == VIR_DOMAIN_PAUSED_POSTCOPY_FAILED); reason == VIR_DOMAIN_PAUSED_POSTCOPY_FAILED);
@ -3554,7 +3561,7 @@ qemuProcessRecoverMigrationOut(virQEMUDriverPtr driver,
} }
qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_NONE, qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_NONE,
job->migParams, job->apiFlags); jobPriv->migParams, job->apiFlags);
return 0; return 0;
} }