224 lines
8.6 KiB
Diff
224 lines
8.6 KiB
Diff
|
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||
|
Date: Wed, 11 Mar 2020 13:29:56 +0300
|
||
|
Subject: job: refactor progress to separate object
|
||
|
|
||
|
Git-commit: 01fe1ca945345d3dc420d70c69488143dc0451b1
|
||
|
|
||
|
We need it in separate to pass to the block-copy object in the next
|
||
|
commit.
|
||
|
|
||
|
Cc: qemu-stable@nongnu.org
|
||
|
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||
|
Reviewed-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
|
||
|
Reviewed-by: Max Reitz <mreitz@redhat.com>
|
||
|
Message-Id: <20200311103004.7649-2-vsementsov@virtuozzo.com>
|
||
|
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||
|
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||
|
---
|
||
|
blockjob.c | 16 +++++-----
|
||
|
include/qemu/job.h | 11 ++-----
|
||
|
include/qemu/progress_meter.h | 58 +++++++++++++++++++++++++++++++++++
|
||
|
job-qmp.c | 4 +--
|
||
|
job.c | 6 ++--
|
||
|
qemu-img.c | 6 ++--
|
||
|
6 files changed, 76 insertions(+), 25 deletions(-)
|
||
|
|
||
|
diff --git a/blockjob.c b/blockjob.c
|
||
|
index c6e20e2fcde53c82146cb45efd87..701bd2588d5ca58826bad00e498d 100644
|
||
|
--- a/blockjob.c
|
||
|
+++ b/blockjob.c
|
||
|
@@ -298,8 +298,8 @@ BlockJobInfo *block_job_query(BlockJob *job, Error **errp)
|
||
|
info->device = g_strdup(job->job.id);
|
||
|
info->busy = atomic_read(&job->job.busy);
|
||
|
info->paused = job->job.pause_count > 0;
|
||
|
- info->offset = job->job.progress_current;
|
||
|
- info->len = job->job.progress_total;
|
||
|
+ info->offset = job->job.progress.current;
|
||
|
+ info->len = job->job.progress.total;
|
||
|
info->speed = job->speed;
|
||
|
info->io_status = job->iostatus;
|
||
|
info->ready = job_is_ready(&job->job),
|
||
|
@@ -329,8 +329,8 @@ static void block_job_event_cancelled(Notifier *n, void *opaque)
|
||
|
|
||
|
qapi_event_send_block_job_cancelled(job_type(&job->job),
|
||
|
job->job.id,
|
||
|
- job->job.progress_total,
|
||
|
- job->job.progress_current,
|
||
|
+ job->job.progress.total,
|
||
|
+ job->job.progress.current,
|
||
|
job->speed);
|
||
|
}
|
||
|
|
||
|
@@ -349,8 +349,8 @@ static void block_job_event_completed(Notifier *n, void *opaque)
|
||
|
|
||
|
qapi_event_send_block_job_completed(job_type(&job->job),
|
||
|
job->job.id,
|
||
|
- job->job.progress_total,
|
||
|
- job->job.progress_current,
|
||
|
+ job->job.progress.total,
|
||
|
+ job->job.progress.current,
|
||
|
job->speed,
|
||
|
!!msg,
|
||
|
msg);
|
||
|
@@ -378,8 +378,8 @@ static void block_job_event_ready(Notifier *n, void *opaque)
|
||
|
|
||
|
qapi_event_send_block_job_ready(job_type(&job->job),
|
||
|
job->job.id,
|
||
|
- job->job.progress_total,
|
||
|
- job->job.progress_current,
|
||
|
+ job->job.progress.total,
|
||
|
+ job->job.progress.current,
|
||
|
job->speed);
|
||
|
}
|
||
|
|
||
|
diff --git a/include/qemu/job.h b/include/qemu/job.h
|
||
|
index bd59cd8944de41304d8f78dce94c..32aabb1c60009825ca4a921b7864 100644
|
||
|
--- a/include/qemu/job.h
|
||
|
+++ b/include/qemu/job.h
|
||
|
@@ -28,6 +28,7 @@
|
||
|
|
||
|
#include "qapi/qapi-types-job.h"
|
||
|
#include "qemu/queue.h"
|
||
|
+#include "qemu/progress_meter.h"
|
||
|
#include "qemu/coroutine.h"
|
||
|
#include "block/aio.h"
|
||
|
|
||
|
@@ -117,15 +118,7 @@ typedef struct Job {
|
||
|
/** True if this job should automatically dismiss itself */
|
||
|
bool auto_dismiss;
|
||
|
|
||
|
- /**
|
||
|
- * Current progress. The unit is arbitrary as long as the ratio between
|
||
|
- * progress_current and progress_total represents the estimated percentage
|
||
|
- * of work already done.
|
||
|
- */
|
||
|
- int64_t progress_current;
|
||
|
-
|
||
|
- /** Estimated progress_current value at the completion of the job */
|
||
|
- int64_t progress_total;
|
||
|
+ ProgressMeter progress;
|
||
|
|
||
|
/**
|
||
|
* Return code from @run and/or @prepare callback(s).
|
||
|
diff --git a/include/qemu/progress_meter.h b/include/qemu/progress_meter.h
|
||
|
new file mode 100644
|
||
|
index 0000000000000000000000000000000000000000..9a23ff071c4c327c099eb5b4ec3e9d6505b298ef
|
||
|
--- /dev/null
|
||
|
+++ b/include/qemu/progress_meter.h
|
||
|
@@ -0,0 +1,58 @@
|
||
|
+/*
|
||
|
+ * Helper functionality for some process progress tracking.
|
||
|
+ *
|
||
|
+ * Copyright (c) 2011 IBM Corp.
|
||
|
+ * Copyright (c) 2012, 2018 Red Hat, Inc.
|
||
|
+ * Copyright (c) 2020 Virtuozzo International GmbH
|
||
|
+ *
|
||
|
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
|
||
|
+ * of this software and associated documentation files (the "Software"), to deal
|
||
|
+ * in the Software without restriction, including without limitation the rights
|
||
|
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||
|
+ * copies of the Software, and to permit persons to whom the Software is
|
||
|
+ * furnished to do so, subject to the following conditions:
|
||
|
+ *
|
||
|
+ * The above copyright notice and this permission notice shall be included in
|
||
|
+ * all copies or substantial portions of the Software.
|
||
|
+ *
|
||
|
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||
|
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||
|
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||
|
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||
|
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||
|
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||
|
+ * THE SOFTWARE.
|
||
|
+ */
|
||
|
+
|
||
|
+#ifndef QEMU_PROGRESS_METER_H
|
||
|
+#define QEMU_PROGRESS_METER_H
|
||
|
+
|
||
|
+typedef struct ProgressMeter {
|
||
|
+ /**
|
||
|
+ * Current progress. The unit is arbitrary as long as the ratio between
|
||
|
+ * current and total represents the estimated percentage
|
||
|
+ * of work already done.
|
||
|
+ */
|
||
|
+ uint64_t current;
|
||
|
+
|
||
|
+ /** Estimated current value at the completion of the process */
|
||
|
+ uint64_t total;
|
||
|
+} ProgressMeter;
|
||
|
+
|
||
|
+static inline void progress_work_done(ProgressMeter *pm, uint64_t done)
|
||
|
+{
|
||
|
+ pm->current += done;
|
||
|
+}
|
||
|
+
|
||
|
+static inline void progress_set_remaining(ProgressMeter *pm, uint64_t remaining)
|
||
|
+{
|
||
|
+ pm->total = pm->current + remaining;
|
||
|
+}
|
||
|
+
|
||
|
+static inline void progress_increase_remaining(ProgressMeter *pm,
|
||
|
+ uint64_t delta)
|
||
|
+{
|
||
|
+ pm->total += delta;
|
||
|
+}
|
||
|
+
|
||
|
+#endif /* QEMU_PROGRESS_METER_H */
|
||
|
diff --git a/job-qmp.c b/job-qmp.c
|
||
|
index fbfed25a00067c5035bfde3d7b89..fecc939ebd951aa3bb863400b71c 100644
|
||
|
--- a/job-qmp.c
|
||
|
+++ b/job-qmp.c
|
||
|
@@ -143,8 +143,8 @@ static JobInfo *job_query_single(Job *job, Error **errp)
|
||
|
.id = g_strdup(job->id),
|
||
|
.type = job_type(job),
|
||
|
.status = job->status,
|
||
|
- .current_progress = job->progress_current,
|
||
|
- .total_progress = job->progress_total,
|
||
|
+ .current_progress = job->progress.current,
|
||
|
+ .total_progress = job->progress.total,
|
||
|
.has_error = !!job->err,
|
||
|
.error = job->err ? \
|
||
|
g_strdup(error_get_pretty(job->err)) : NULL,
|
||
|
diff --git a/job.c b/job.c
|
||
|
index 04409b40aab3545798414bda1a87..134a07b92e5ef05a52bee7e21a96 100644
|
||
|
--- a/job.c
|
||
|
+++ b/job.c
|
||
|
@@ -369,17 +369,17 @@ void job_unref(Job *job)
|
||
|
|
||
|
void job_progress_update(Job *job, uint64_t done)
|
||
|
{
|
||
|
- job->progress_current += done;
|
||
|
+ progress_work_done(&job->progress, done);
|
||
|
}
|
||
|
|
||
|
void job_progress_set_remaining(Job *job, uint64_t remaining)
|
||
|
{
|
||
|
- job->progress_total = job->progress_current + remaining;
|
||
|
+ progress_set_remaining(&job->progress, remaining);
|
||
|
}
|
||
|
|
||
|
void job_progress_increase_remaining(Job *job, uint64_t delta)
|
||
|
{
|
||
|
- job->progress_total += delta;
|
||
|
+ progress_increase_remaining(&job->progress, delta);
|
||
|
}
|
||
|
|
||
|
void job_event_cancelled(Job *job)
|
||
|
diff --git a/qemu-img.c b/qemu-img.c
|
||
|
index 95a24b9762b0b00ef13f68cd4251..9ae07bbc80bd1fa0e6e20a04ec73 100644
|
||
|
--- a/qemu-img.c
|
||
|
+++ b/qemu-img.c
|
||
|
@@ -881,9 +881,9 @@ static void run_block_job(BlockJob *job, Error **errp)
|
||
|
do {
|
||
|
float progress = 0.0f;
|
||
|
aio_poll(aio_context, true);
|
||
|
- if (job->job.progress_total) {
|
||
|
- progress = (float)job->job.progress_current /
|
||
|
- job->job.progress_total * 100.f;
|
||
|
+ if (job->job.progress.total) {
|
||
|
+ progress = (float)job->job.progress.current /
|
||
|
+ job->job.progress.total * 100.f;
|
||
|
}
|
||
|
qemu_progress_print(progress, 0);
|
||
|
} while (!job_is_ready(&job->job) && !job_is_completed(&job->job));
|