9119d9
From f4a492f7751e066548cd63d2bc56fd0260c7b32b Mon Sep 17 00:00:00 2001
9119d9
Message-Id: <f4a492f7751e066548cd63d2bc56fd0260c7b32b@dist-git>
9119d9
From: Jiri Denemark <jdenemar@redhat.com>
9119d9
Date: Thu, 21 Aug 2014 15:08:39 +0200
9119d9
Subject: [PATCH] Refactor job statistics
9119d9
9119d9
Job statistics data were tracked in several structures and variables.
9119d9
Let's make a new qemuDomainJobInfo structure which can be used as a
9119d9
single source of statistics data as a preparation for storing data about
9119d9
completed a job.
9119d9
9119d9
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
9119d9
(cherry picked from commit 6fcddfcd8f25bc23018a1fc2e37ebca375f7f1c3)
9119d9
9119d9
https://bugzilla.redhat.com/show_bug.cgi?id=1063724
9119d9
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
9119d9
---
9119d9
 src/qemu/qemu_domain.c    | 157 ++++++++++++++++++++++++++++++++++++++++++++--
9119d9
 src/qemu/qemu_domain.h    |  28 ++++++++-
9119d9
 src/qemu/qemu_driver.c    | 119 ++++-------------------------------
9119d9
 src/qemu/qemu_migration.c |  72 ++++++++-------------
9119d9
 4 files changed, 217 insertions(+), 159 deletions(-)
9119d9
9119d9
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
9119d9
index 306ff10..7b54306 100644
9119d9
--- a/src/qemu/qemu_domain.c
9119d9
+++ b/src/qemu/qemu_domain.c
9119d9
@@ -163,11 +163,9 @@ qemuDomainObjResetAsyncJob(qemuDomainObjPrivatePtr priv)
9119d9
     job->asyncOwner = 0;
9119d9
     job->phase = 0;
9119d9
     job->mask = QEMU_JOB_DEFAULT_MASK;
9119d9
-    job->start = 0;
9119d9
     job->dump_memory_only = false;
9119d9
     job->asyncAbort = false;
9119d9
-    memset(&job->status, 0, sizeof(job->status));
9119d9
-    memset(&job->info, 0, sizeof(job->info));
9119d9
+    VIR_FREE(job->current);
9119d9
 }
9119d9
 
9119d9
 void
9119d9
@@ -200,6 +198,7 @@ qemuDomainObjTransferJob(virDomainObjPtr obj)
9119d9
 static void
9119d9
 qemuDomainObjFreeJob(qemuDomainObjPrivatePtr priv)
9119d9
 {
9119d9
+    VIR_FREE(priv->job.current);
9119d9
     virCondDestroy(&priv->job.cond);
9119d9
     virCondDestroy(&priv->job.asyncCond);
9119d9
 }
9119d9
@@ -211,6 +210,150 @@ qemuDomainTrackJob(qemuDomainJob job)
9119d9
 }
9119d9
 
9119d9
 
9119d9
+int
9119d9
+qemuDomainJobInfoUpdateTime(qemuDomainJobInfoPtr jobInfo)
9119d9
+{
9119d9
+    unsigned long long now;
9119d9
+
9119d9
+    if (!jobInfo->started)
9119d9
+        return 0;
9119d9
+
9119d9
+    if (virTimeMillisNow(&now) < 0)
9119d9
+        return -1;
9119d9
+
9119d9
+    jobInfo->timeElapsed = now - jobInfo->started;
9119d9
+    return 0;
9119d9
+}
9119d9
+
9119d9
+int
9119d9
+qemuDomainJobInfoToInfo(qemuDomainJobInfoPtr jobInfo,
9119d9
+                        virDomainJobInfoPtr info)
9119d9
+{
9119d9
+    info->timeElapsed = jobInfo->timeElapsed;
9119d9
+    info->timeRemaining = jobInfo->timeRemaining;
9119d9
+
9119d9
+    info->memTotal = jobInfo->status.ram_total;
9119d9
+    info->memRemaining = jobInfo->status.ram_remaining;
9119d9
+    info->memProcessed = jobInfo->status.ram_transferred;
9119d9
+
9119d9
+    info->fileTotal = jobInfo->status.disk_total;
9119d9
+    info->fileRemaining = jobInfo->status.disk_remaining;
9119d9
+    info->fileProcessed = jobInfo->status.disk_transferred;
9119d9
+
9119d9
+    info->dataTotal = info->memTotal + info->fileTotal;
9119d9
+    info->dataRemaining = info->memRemaining + info->fileRemaining;
9119d9
+    info->dataProcessed = info->memProcessed + info->fileProcessed;
9119d9
+
9119d9
+    return 0;
9119d9
+}
9119d9
+
9119d9
+int
9119d9
+qemuDomainJobInfoToParams(qemuDomainJobInfoPtr jobInfo,
9119d9
+                          int *type,
9119d9
+                          virTypedParameterPtr *params,
9119d9
+                          int *nparams)
9119d9
+{
9119d9
+    qemuMonitorMigrationStatus *status = &jobInfo->status;
9119d9
+    virTypedParameterPtr par = NULL;
9119d9
+    int maxpar = 0;
9119d9
+    int npar = 0;
9119d9
+
9119d9
+    if (virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
+                                VIR_DOMAIN_JOB_TIME_ELAPSED,
9119d9
+                                jobInfo->timeElapsed) < 0)
9119d9
+        goto error;
9119d9
+
9119d9
+    if (jobInfo->type == VIR_DOMAIN_JOB_BOUNDED &&
9119d9
+        virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
+                                VIR_DOMAIN_JOB_TIME_REMAINING,
9119d9
+                                jobInfo->timeRemaining) < 0)
9119d9
+        goto error;
9119d9
+
9119d9
+    if (status->downtime_set &&
9119d9
+        virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
+                                VIR_DOMAIN_JOB_DOWNTIME,
9119d9
+                                status->downtime) < 0)
9119d9
+        goto error;
9119d9
+
9119d9
+    if (virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
+                                VIR_DOMAIN_JOB_DATA_TOTAL,
9119d9
+                                status->ram_total +
9119d9
+                                status->disk_total) < 0 ||
9119d9
+        virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
+                                VIR_DOMAIN_JOB_DATA_PROCESSED,
9119d9
+                                status->ram_transferred +
9119d9
+                                status->disk_transferred) < 0 ||
9119d9
+        virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
+                                VIR_DOMAIN_JOB_DATA_REMAINING,
9119d9
+                                status->ram_remaining +
9119d9
+                                status->disk_remaining) < 0)
9119d9
+        goto error;
9119d9
+
9119d9
+    if (virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
+                                VIR_DOMAIN_JOB_MEMORY_TOTAL,
9119d9
+                                status->ram_total) < 0 ||
9119d9
+        virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
+                                VIR_DOMAIN_JOB_MEMORY_PROCESSED,
9119d9
+                                status->ram_transferred) < 0 ||
9119d9
+        virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
+                                VIR_DOMAIN_JOB_MEMORY_REMAINING,
9119d9
+                                status->ram_remaining) < 0)
9119d9
+        goto error;
9119d9
+
9119d9
+    if (status->ram_duplicate_set) {
9119d9
+        if (virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
+                                    VIR_DOMAIN_JOB_MEMORY_CONSTANT,
9119d9
+                                    status->ram_duplicate) < 0 ||
9119d9
+            virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
+                                    VIR_DOMAIN_JOB_MEMORY_NORMAL,
9119d9
+                                    status->ram_normal) < 0 ||
9119d9
+            virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
+                                    VIR_DOMAIN_JOB_MEMORY_NORMAL_BYTES,
9119d9
+                                    status->ram_normal_bytes) < 0)
9119d9
+            goto error;
9119d9
+    }
9119d9
+
9119d9
+    if (virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
+                                VIR_DOMAIN_JOB_DISK_TOTAL,
9119d9
+                                status->disk_total) < 0 ||
9119d9
+        virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
+                                VIR_DOMAIN_JOB_DISK_PROCESSED,
9119d9
+                                status->disk_transferred) < 0 ||
9119d9
+        virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
+                                VIR_DOMAIN_JOB_DISK_REMAINING,
9119d9
+                                status->disk_remaining) < 0)
9119d9
+        goto error;
9119d9
+
9119d9
+    if (status->xbzrle_set) {
9119d9
+        if (virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
+                                    VIR_DOMAIN_JOB_COMPRESSION_CACHE,
9119d9
+                                    status->xbzrle_cache_size) < 0 ||
9119d9
+            virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
+                                    VIR_DOMAIN_JOB_COMPRESSION_BYTES,
9119d9
+                                    status->xbzrle_bytes) < 0 ||
9119d9
+            virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
+                                    VIR_DOMAIN_JOB_COMPRESSION_PAGES,
9119d9
+                                    status->xbzrle_pages) < 0 ||
9119d9
+            virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
+                                    VIR_DOMAIN_JOB_COMPRESSION_CACHE_MISSES,
9119d9
+                                    status->xbzrle_cache_miss) < 0 ||
9119d9
+            virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
+                                    VIR_DOMAIN_JOB_COMPRESSION_OVERFLOW,
9119d9
+                                    status->xbzrle_overflow) < 0)
9119d9
+            goto error;
9119d9
+    }
9119d9
+
9119d9
+    *type = jobInfo->type;
9119d9
+    *params = par;
9119d9
+    *nparams = npar;
9119d9
+    return 0;
9119d9
+
9119d9
+ error:
9119d9
+    virTypedParamsFree(par, npar);
9119d9
+    return -1;
9119d9
+}
9119d9
+
9119d9
+
9119d9
 static void *
9119d9
 qemuDomainObjPrivateAlloc(void)
9119d9
 {
9119d9
@@ -1071,7 +1214,7 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr driver,
9119d9
     unsigned long long then;
9119d9
     bool nested = job == QEMU_JOB_ASYNC_NESTED;
9119d9
     virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
9119d9
-    int ret;
9119d9
+    int ret = -1;
9119d9
 
9119d9
     VIR_DEBUG("Starting %s: %s (async=%s vm=%p name=%s)",
9119d9
               job == QEMU_JOB_ASYNC ? "async job" : "job",
9119d9
@@ -1127,9 +1270,11 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr driver,
9119d9
                   qemuDomainAsyncJobTypeToString(asyncJob),
9119d9
                   obj, obj->def->name);
9119d9
         qemuDomainObjResetAsyncJob(priv);
9119d9
+        if (VIR_ALLOC(priv->job.current) < 0)
9119d9
+            goto cleanup;
9119d9
         priv->job.asyncJob = asyncJob;
9119d9
         priv->job.asyncOwner = virThreadSelfID();
9119d9
-        priv->job.start = now;
9119d9
+        priv->job.current->started = now;
9119d9
     }
9119d9
 
9119d9
     if (qemuDomainTrackJob(job))
9119d9
@@ -1163,6 +1308,8 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr driver,
9119d9
         virReportSystemError(errno,
9119d9
                              "%s", _("cannot acquire job mutex"));
9119d9
     }
9119d9
+
9119d9
+ cleanup:
9119d9
     priv->jobs_queued--;
9119d9
     virObjectUnref(obj);
9119d9
     virObjectUnref(cfg);
9119d9
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
9119d9
index f353d90..99c7d6a 100644
9119d9
--- a/src/qemu/qemu_domain.h
9119d9
+++ b/src/qemu/qemu_domain.h
9119d9
@@ -100,6 +100,18 @@ typedef enum {
9119d9
 } qemuDomainAsyncJob;
9119d9
 VIR_ENUM_DECL(qemuDomainAsyncJob)
9119d9
 
9119d9
+typedef struct _qemuDomainJobInfo qemuDomainJobInfo;
9119d9
+typedef qemuDomainJobInfo *qemuDomainJobInfoPtr;
9119d9
+struct _qemuDomainJobInfo {
9119d9
+    virDomainJobType type;
9119d9
+    unsigned long long started; /* When the async job started */
9119d9
+    /* Computed values */
9119d9
+    unsigned long long timeElapsed;
9119d9
+    unsigned long long timeRemaining;
9119d9
+    /* Raw values from QEMU */
9119d9
+    qemuMonitorMigrationStatus status;
9119d9
+};
9119d9
+
9119d9
 struct qemuDomainJobObj {
9119d9
     virCond cond;                       /* Use to coordinate jobs */
9119d9
     qemuDomainJob active;               /* Currently running job */
9119d9
@@ -110,10 +122,8 @@ struct qemuDomainJobObj {
9119d9
     unsigned long long asyncOwner;      /* Thread which set current async job */
9119d9
     int phase;                          /* Job phase (mainly for migrations) */
9119d9
     unsigned long long mask;            /* Jobs allowed during async job */
9119d9
-    unsigned long long start;           /* When the async job started */
9119d9
     bool dump_memory_only;              /* use dump-guest-memory to do dump */
9119d9
-    qemuMonitorMigrationStatus status;  /* Raw async job progress data */
9119d9
-    virDomainJobInfo info;              /* Processed async job progress data */
9119d9
+    qemuDomainJobInfoPtr current;       /* async job progress data */
9119d9
     bool asyncAbort;                    /* abort of async job requested */
9119d9
 };
9119d9
 
9119d9
@@ -378,4 +388,16 @@ bool qemuDomainDefCheckABIStability(virQEMUDriverPtr driver,
9119d9
 bool qemuDomainAgentAvailable(qemuDomainObjPrivatePtr priv,
9119d9
                               bool reportError);
9119d9
 
9119d9
+int qemuDomainJobInfoUpdateTime(qemuDomainJobInfoPtr jobInfo)
9119d9
+    ATTRIBUTE_NONNULL(1);
9119d9
+int qemuDomainJobInfoToInfo(qemuDomainJobInfoPtr jobInfo,
9119d9
+                            virDomainJobInfoPtr info)
9119d9
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
9119d9
+int qemuDomainJobInfoToParams(qemuDomainJobInfoPtr jobInfo,
9119d9
+                              int *type,
9119d9
+                              virTypedParameterPtr *params,
9119d9
+                              int *nparams)
9119d9
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
9119d9
+    ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4);
9119d9
+
9119d9
 #endif /* __QEMU_DOMAIN_H__ */
9119d9
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
9119d9
index 53baced..6640a29 100644
9119d9
--- a/src/qemu/qemu_driver.c
9119d9
+++ b/src/qemu/qemu_driver.c
9119d9
@@ -2655,15 +2655,13 @@ qemuDomainGetControlInfo(virDomainPtr dom,
9119d9
     if (priv->monError) {
9119d9
         info->state = VIR_DOMAIN_CONTROL_ERROR;
9119d9
     } else if (priv->job.active) {
9119d9
-        if (!priv->monStart) {
9119d9
+        if (virTimeMillisNow(&info->stateTime) < 0)
9119d9
+            goto cleanup;
9119d9
+        if (priv->job.current) {
9119d9
             info->state = VIR_DOMAIN_CONTROL_JOB;
9119d9
-            if (virTimeMillisNow(&info->stateTime) < 0)
9119d9
-                goto cleanup;
9119d9
-            info->stateTime -= priv->job.start;
9119d9
+            info->stateTime -= priv->job.current->started;
9119d9
         } else {
9119d9
             info->state = VIR_DOMAIN_CONTROL_OCCUPIED;
9119d9
-            if (virTimeMillisNow(&info->stateTime) < 0)
9119d9
-                goto cleanup;
9119d9
             info->stateTime -= priv->monStart;
9119d9
         }
9119d9
     } else {
9119d9
@@ -3110,8 +3108,7 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver, virDomainPtr dom,
9119d9
         goto endjob;
9119d9
     }
9119d9
 
9119d9
-    memset(&priv->job.info, 0, sizeof(priv->job.info));
9119d9
-    priv->job.info.type = VIR_DOMAIN_JOB_UNBOUNDED;
9119d9
+    priv->job.current->type = VIR_DOMAIN_JOB_UNBOUNDED;
9119d9
 
9119d9
     /* Pause */
9119d9
     if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) {
9119d9
@@ -3460,6 +3457,7 @@ static int qemuDumpToFd(virQEMUDriverPtr driver, virDomainObjPtr vm,
9119d9
                                           fd) < 0)
9119d9
         return -1;
9119d9
 
9119d9
+    VIR_FREE(priv->job.current);
9119d9
     priv->job.dump_memory_only = true;
9119d9
 
9119d9
     if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
9119d9
@@ -11624,17 +11622,15 @@ static int qemuDomainGetJobInfo(virDomainPtr dom,
9119d9
         goto cleanup;
9119d9
 
9119d9
     if (virDomainObjIsActive(vm)) {
9119d9
-        if (priv->job.asyncJob && !priv->job.dump_memory_only) {
9119d9
-            memcpy(info, &priv->job.info, sizeof(*info));
9119d9
-
9119d9
+        if (priv->job.current) {
9119d9
             /* Refresh elapsed time again just to ensure it
9119d9
              * is fully updated. This is primarily for benefit
9119d9
              * of incoming migration which we don't currently
9119d9
              * monitor actively in the background thread
9119d9
              */
9119d9
-            if (virTimeMillisNow(&info->timeElapsed) < 0)
9119d9
+            if (qemuDomainJobInfoUpdateTime(priv->job.current) < 0 ||
9119d9
+                qemuDomainJobInfoToInfo(priv->job.current, info) < 0)
9119d9
                 goto cleanup;
9119d9
-            info->timeElapsed -= priv->job.start;
9119d9
         } else {
9119d9
             memset(info, 0, sizeof(*info));
9119d9
             info->type = VIR_DOMAIN_JOB_NONE;
9119d9
@@ -11663,9 +11659,6 @@ qemuDomainGetJobStats(virDomainPtr dom,
9119d9
 {
9119d9
     virDomainObjPtr vm;
9119d9
     qemuDomainObjPrivatePtr priv;
9119d9
-    virTypedParameterPtr par = NULL;
9119d9
-    int maxpar = 0;
9119d9
-    int npar = 0;
9119d9
     int ret = -1;
9119d9
 
9119d9
     virCheckFlags(0, -1);
9119d9
@@ -11684,7 +11677,7 @@ qemuDomainGetJobStats(virDomainPtr dom,
9119d9
         goto cleanup;
9119d9
     }
9119d9
 
9119d9
-    if (!priv->job.asyncJob || priv->job.dump_memory_only) {
9119d9
+    if (!priv->job.current) {
9119d9
         *type = VIR_DOMAIN_JOB_NONE;
9119d9
         *params = NULL;
9119d9
         *nparams = 0;
9119d9
@@ -11697,102 +11690,16 @@ qemuDomainGetJobStats(virDomainPtr dom,
9119d9
      * of incoming migration which we don't currently
9119d9
      * monitor actively in the background thread
9119d9
      */
9119d9
-    if (virTimeMillisNow(&priv->job.info.timeElapsed) < 0)
9119d9
+    if (qemuDomainJobInfoUpdateTime(priv->job.current) < 0 ||
9119d9
+        qemuDomainJobInfoToParams(priv->job.current,
9119d9
+                                  type, params, nparams) < 0)
9119d9
         goto cleanup;
9119d9
-    priv->job.info.timeElapsed -= priv->job.start;
9119d9
 
9119d9
-    if (virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
-                                VIR_DOMAIN_JOB_TIME_ELAPSED,
9119d9
-                                priv->job.info.timeElapsed) < 0)
9119d9
-        goto cleanup;
9119d9
-
9119d9
-    if (priv->job.info.type == VIR_DOMAIN_JOB_BOUNDED &&
9119d9
-        virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
-                                VIR_DOMAIN_JOB_TIME_REMAINING,
9119d9
-                                priv->job.info.timeRemaining) < 0)
9119d9
-        goto cleanup;
9119d9
-
9119d9
-    if (priv->job.status.downtime_set &&
9119d9
-        virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
-                                VIR_DOMAIN_JOB_DOWNTIME,
9119d9
-                                priv->job.status.downtime) < 0)
9119d9
-        goto cleanup;
9119d9
-
9119d9
-    if (virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
-                                VIR_DOMAIN_JOB_DATA_TOTAL,
9119d9
-                                priv->job.info.dataTotal) < 0 ||
9119d9
-        virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
-                                VIR_DOMAIN_JOB_DATA_PROCESSED,
9119d9
-                                priv->job.info.dataProcessed) < 0 ||
9119d9
-        virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
-                                VIR_DOMAIN_JOB_DATA_REMAINING,
9119d9
-                                priv->job.info.dataRemaining) < 0)
9119d9
-        goto cleanup;
9119d9
-
9119d9
-    if (virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
-                                VIR_DOMAIN_JOB_MEMORY_TOTAL,
9119d9
-                                priv->job.info.memTotal) < 0 ||
9119d9
-        virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
-                                VIR_DOMAIN_JOB_MEMORY_PROCESSED,
9119d9
-                                priv->job.info.memProcessed) < 0 ||
9119d9
-        virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
-                                VIR_DOMAIN_JOB_MEMORY_REMAINING,
9119d9
-                                priv->job.info.memRemaining) < 0)
9119d9
-        goto cleanup;
9119d9
-
9119d9
-    if (priv->job.status.ram_duplicate_set) {
9119d9
-        if (virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
-                                    VIR_DOMAIN_JOB_MEMORY_CONSTANT,
9119d9
-                                    priv->job.status.ram_duplicate) < 0 ||
9119d9
-            virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
-                                    VIR_DOMAIN_JOB_MEMORY_NORMAL,
9119d9
-                                    priv->job.status.ram_normal) < 0 ||
9119d9
-            virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
-                                    VIR_DOMAIN_JOB_MEMORY_NORMAL_BYTES,
9119d9
-                                    priv->job.status.ram_normal_bytes) < 0)
9119d9
-            goto cleanup;
9119d9
-    }
9119d9
-
9119d9
-    if (virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
-                                VIR_DOMAIN_JOB_DISK_TOTAL,
9119d9
-                                priv->job.info.fileTotal) < 0 ||
9119d9
-        virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
-                                VIR_DOMAIN_JOB_DISK_PROCESSED,
9119d9
-                                priv->job.info.fileProcessed) < 0 ||
9119d9
-        virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
-                                VIR_DOMAIN_JOB_DISK_REMAINING,
9119d9
-                                priv->job.info.fileRemaining) < 0)
9119d9
-        goto cleanup;
9119d9
-
9119d9
-    if (priv->job.status.xbzrle_set) {
9119d9
-        if (virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
-                                    VIR_DOMAIN_JOB_COMPRESSION_CACHE,
9119d9
-                                    priv->job.status.xbzrle_cache_size) < 0 ||
9119d9
-            virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
-                                    VIR_DOMAIN_JOB_COMPRESSION_BYTES,
9119d9
-                                    priv->job.status.xbzrle_bytes) < 0 ||
9119d9
-            virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
-                                    VIR_DOMAIN_JOB_COMPRESSION_PAGES,
9119d9
-                                    priv->job.status.xbzrle_pages) < 0 ||
9119d9
-            virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
-                                    VIR_DOMAIN_JOB_COMPRESSION_CACHE_MISSES,
9119d9
-                                    priv->job.status.xbzrle_cache_miss) < 0 ||
9119d9
-            virTypedParamsAddULLong(&par, &npar, &maxpar,
9119d9
-                                    VIR_DOMAIN_JOB_COMPRESSION_OVERFLOW,
9119d9
-                                    priv->job.status.xbzrle_overflow) < 0)
9119d9
-            goto cleanup;
9119d9
-    }
9119d9
-
9119d9
-    *type = priv->job.info.type;
9119d9
-    *params = par;
9119d9
-    *nparams = npar;
9119d9
     ret = 0;
9119d9
 
9119d9
  cleanup:
9119d9
     if (vm)
9119d9
         virObjectUnlock(vm);
9119d9
-    if (ret < 0)
9119d9
-        virTypedParamsFree(par, npar);
9119d9
     return ret;
9119d9
 }
9119d9
 
9119d9
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
9119d9
index 2726512..066cc97 100644
9119d9
--- a/src/qemu/qemu_migration.c
9119d9
+++ b/src/qemu/qemu_migration.c
9119d9
@@ -1723,8 +1723,9 @@ qemuMigrationUpdateJobStatus(virQEMUDriverPtr driver,
9119d9
                              qemuDomainAsyncJob asyncJob)
9119d9
 {
9119d9
     qemuDomainObjPrivatePtr priv = vm->privateData;
9119d9
-    int ret;
9119d9
     qemuMonitorMigrationStatus status;
9119d9
+    qemuDomainJobInfoPtr jobInfo;
9119d9
+    int ret;
9119d9
 
9119d9
     memset(&status, 0, sizeof(status));
9119d9
 
9119d9
@@ -1738,62 +1739,40 @@ qemuMigrationUpdateJobStatus(virQEMUDriverPtr driver,
9119d9
 
9119d9
     qemuDomainObjExitMonitor(driver, vm);
9119d9
 
9119d9
-    priv->job.status = status;
9119d9
-
9119d9
-    if (ret < 0 || virTimeMillisNow(&priv->job.info.timeElapsed) < 0)
9119d9
+    if (ret < 0 ||
9119d9
+        qemuDomainJobInfoUpdateTime(priv->job.current) < 0)
9119d9
         return -1;
9119d9
 
9119d9
-    priv->job.info.timeElapsed -= priv->job.start;
9119d9
-
9119d9
     ret = -1;
9119d9
-    switch (priv->job.status.status) {
9119d9
-    case QEMU_MONITOR_MIGRATION_STATUS_INACTIVE:
9119d9
-        priv->job.info.type = VIR_DOMAIN_JOB_NONE;
9119d9
-        virReportError(VIR_ERR_OPERATION_FAILED,
9119d9
-                       _("%s: %s"), job, _("is not active"));
9119d9
-        break;
9119d9
-
9119d9
+    jobInfo = priv->job.current;
9119d9
+    switch (status.status) {
9119d9
+    case QEMU_MONITOR_MIGRATION_STATUS_COMPLETED:
9119d9
+        jobInfo->type = VIR_DOMAIN_JOB_COMPLETED;
9119d9
+        /* fall through */
9119d9
     case QEMU_MONITOR_MIGRATION_STATUS_SETUP:
9119d9
-        ret = 0;
9119d9
-        break;
9119d9
-
9119d9
     case QEMU_MONITOR_MIGRATION_STATUS_ACTIVE:
9119d9
-        priv->job.info.fileTotal = priv->job.status.disk_total;
9119d9
-        priv->job.info.fileRemaining = priv->job.status.disk_remaining;
9119d9
-        priv->job.info.fileProcessed = priv->job.status.disk_transferred;
9119d9
-
9119d9
-        priv->job.info.memTotal = priv->job.status.ram_total;
9119d9
-        priv->job.info.memRemaining = priv->job.status.ram_remaining;
9119d9
-        priv->job.info.memProcessed = priv->job.status.ram_transferred;
9119d9
-
9119d9
-        priv->job.info.dataTotal =
9119d9
-            priv->job.status.ram_total + priv->job.status.disk_total;
9119d9
-        priv->job.info.dataRemaining =
9119d9
-            priv->job.status.ram_remaining + priv->job.status.disk_remaining;
9119d9
-        priv->job.info.dataProcessed =
9119d9
-            priv->job.status.ram_transferred +
9119d9
-            priv->job.status.disk_transferred;
9119d9
-
9119d9
         ret = 0;
9119d9
         break;
9119d9
 
9119d9
-    case QEMU_MONITOR_MIGRATION_STATUS_COMPLETED:
9119d9
-        priv->job.info.type = VIR_DOMAIN_JOB_COMPLETED;
9119d9
-        ret = 0;
9119d9
+    case QEMU_MONITOR_MIGRATION_STATUS_INACTIVE:
9119d9
+        jobInfo->type = VIR_DOMAIN_JOB_NONE;
9119d9
+        virReportError(VIR_ERR_OPERATION_FAILED,
9119d9
+                       _("%s: %s"), job, _("is not active"));
9119d9
         break;
9119d9
 
9119d9
     case QEMU_MONITOR_MIGRATION_STATUS_ERROR:
9119d9
-        priv->job.info.type = VIR_DOMAIN_JOB_FAILED;
9119d9
+        jobInfo->type = VIR_DOMAIN_JOB_FAILED;
9119d9
         virReportError(VIR_ERR_OPERATION_FAILED,
9119d9
                        _("%s: %s"), job, _("unexpectedly failed"));
9119d9
         break;
9119d9
 
9119d9
     case QEMU_MONITOR_MIGRATION_STATUS_CANCELLED:
9119d9
-        priv->job.info.type = VIR_DOMAIN_JOB_CANCELLED;
9119d9
+        jobInfo->type = VIR_DOMAIN_JOB_CANCELLED;
9119d9
         virReportError(VIR_ERR_OPERATION_ABORTED,
9119d9
                        _("%s: %s"), job, _("canceled by client"));
9119d9
         break;
9119d9
     }
9119d9
+    jobInfo->status = status;
9119d9
 
9119d9
     return ret;
9119d9
 }
9119d9
@@ -1803,11 +1782,14 @@ qemuMigrationUpdateJobStatus(virQEMUDriverPtr driver,
9119d9
  * QEMU reports failed migration.
9119d9
  */
9119d9
 static int
9119d9
-qemuMigrationWaitForCompletion(virQEMUDriverPtr driver, virDomainObjPtr vm,
9119d9
+qemuMigrationWaitForCompletion(virQEMUDriverPtr driver,
9119d9
+                               virDomainObjPtr vm,
9119d9
                                qemuDomainAsyncJob asyncJob,
9119d9
-                               virConnectPtr dconn, bool abort_on_error)
9119d9
+                               virConnectPtr dconn,
9119d9
+                               bool abort_on_error)
9119d9
 {
9119d9
     qemuDomainObjPrivatePtr priv = vm->privateData;
9119d9
+    qemuDomainJobInfoPtr jobInfo = priv->job.current;
9119d9
     const char *job;
9119d9
     int pauseReason;
9119d9
 
9119d9
@@ -1825,9 +1807,9 @@ qemuMigrationWaitForCompletion(virQEMUDriverPtr driver, virDomainObjPtr vm,
9119d9
         job = _("job");
9119d9
     }
9119d9
 
9119d9
-    priv->job.info.type = VIR_DOMAIN_JOB_UNBOUNDED;
9119d9
+    jobInfo->type = VIR_DOMAIN_JOB_UNBOUNDED;
9119d9
 
9119d9
-    while (priv->job.info.type == VIR_DOMAIN_JOB_UNBOUNDED) {
9119d9
+    while (jobInfo->type == VIR_DOMAIN_JOB_UNBOUNDED) {
9119d9
         /* Poll every 50ms for progress & to allow cancellation */
9119d9
         struct timespec ts = { .tv_sec = 0, .tv_nsec = 50 * 1000 * 1000ull };
9119d9
 
9119d9
@@ -1856,13 +1838,13 @@ qemuMigrationWaitForCompletion(virQEMUDriverPtr driver, virDomainObjPtr vm,
9119d9
         virObjectLock(vm);
9119d9
     }
9119d9
 
9119d9
-    if (priv->job.info.type == VIR_DOMAIN_JOB_COMPLETED) {
9119d9
+    if (jobInfo->type == VIR_DOMAIN_JOB_COMPLETED) {
9119d9
         return 0;
9119d9
-    } else if (priv->job.info.type == VIR_DOMAIN_JOB_UNBOUNDED) {
9119d9
+    } else if (jobInfo->type == VIR_DOMAIN_JOB_UNBOUNDED) {
9119d9
         /* The migration was aborted by us rather than QEMU itself so let's
9119d9
          * update the job type and notify the caller to send migrate_cancel.
9119d9
          */
9119d9
-        priv->job.info.type = VIR_DOMAIN_JOB_FAILED;
9119d9
+        jobInfo->type = VIR_DOMAIN_JOB_FAILED;
9119d9
         return -2;
9119d9
     } else {
9119d9
         return -1;
9119d9
@@ -4914,7 +4896,7 @@ qemuMigrationJobStart(virQEMUDriverPtr driver,
9119d9
                                           JOB_MASK(QEMU_JOB_MIGRATION_OP)));
9119d9
     }
9119d9
 
9119d9
-    priv->job.info.type = VIR_DOMAIN_JOB_UNBOUNDED;
9119d9
+    priv->job.current->type = VIR_DOMAIN_JOB_UNBOUNDED;
9119d9
 
9119d9
     return 0;
9119d9
 }
9119d9
-- 
9119d9
2.1.0
9119d9