Blame SOURCES/kvm-job-Move-progress-fields-to-Job.patch

1bdc94
From 1da3dfa844e67f9948eddd18188307acb7f9fe95 Mon Sep 17 00:00:00 2001
1bdc94
From: Kevin Wolf <kwolf@redhat.com>
1bdc94
Date: Tue, 26 Jun 2018 09:48:29 +0200
1bdc94
Subject: [PATCH 60/89] job: Move progress fields to Job
1bdc94
1bdc94
RH-Author: Kevin Wolf <kwolf@redhat.com>
1bdc94
Message-id: <20180626094856.6924-47-kwolf@redhat.com>
1bdc94
Patchwork-id: 81115
1bdc94
O-Subject: [RHV-7.6 qemu-kvm-rhev PATCH v2 46/73] job: Move progress fields to Job
1bdc94
Bugzilla: 1513543
1bdc94
RH-Acked-by: Jeffrey Cody <jcody@redhat.com>
1bdc94
RH-Acked-by: Max Reitz <mreitz@redhat.com>
1bdc94
RH-Acked-by: Fam Zheng <famz@redhat.com>
1bdc94
1bdc94
BlockJob has fields .offset and .len, which are actually misnomers today
1bdc94
because they are no longer tied to block device sizes, but just progress
1bdc94
counters. As such they make a lot of sense in generic Jobs.
1bdc94
1bdc94
This patch moves the fields to Job and renames them to .progress_current
1bdc94
and .progress_total to describe their function better.
1bdc94
1bdc94
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
1bdc94
Reviewed-by: Max Reitz <mreitz@redhat.com>
1bdc94
(cherry picked from commit 30a5c887bf4a7e00d0e0ecbb08509e8ba2902620)
1bdc94
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
1bdc94
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
1bdc94
---
1bdc94
 block/backup.c           |  8 ++++----
1bdc94
 block/commit.c           |  4 ++--
1bdc94
 block/mirror.c           |  4 ++--
1bdc94
 block/stream.c           |  4 ++--
1bdc94
 blockjob.c               | 26 ++++++++------------------
1bdc94
 include/block/blockjob.h | 25 -------------------------
1bdc94
 include/qemu/job.h       | 28 ++++++++++++++++++++++++++++
1bdc94
 job.c                    | 10 ++++++++++
1bdc94
 qemu-img.c               |  8 ++++++--
1bdc94
 9 files changed, 62 insertions(+), 55 deletions(-)
1bdc94
1bdc94
diff --git a/block/backup.c b/block/backup.c
1bdc94
index 6f4f3df..4e228e9 100644
1bdc94
--- a/block/backup.c
1bdc94
+++ b/block/backup.c
1bdc94
@@ -160,7 +160,7 @@ static int coroutine_fn backup_do_cow(BackupBlockJob *job,
1bdc94
          * offset field is an opaque progress value, it is not a disk offset.
1bdc94
          */
1bdc94
         job->bytes_read += n;
1bdc94
-        block_job_progress_update(&job->common, n);
1bdc94
+        job_progress_update(&job->common.job, n);
1bdc94
     }
1bdc94
 
1bdc94
 out:
1bdc94
@@ -406,8 +406,8 @@ static void backup_incremental_init_copy_bitmap(BackupBlockJob *job)
1bdc94
         bdrv_set_dirty_iter(dbi, next_cluster * job->cluster_size);
1bdc94
     }
1bdc94
 
1bdc94
-    /* TODO block_job_progress_set_remaining() would make more sense */
1bdc94
-    block_job_progress_update(&job->common,
1bdc94
+    /* TODO job_progress_set_remaining() would make more sense */
1bdc94
+    job_progress_update(&job->common.job,
1bdc94
         job->len - hbitmap_count(job->copy_bitmap) * job->cluster_size);
1bdc94
 
1bdc94
     bdrv_dirty_iter_free(dbi);
1bdc94
@@ -425,7 +425,7 @@ static void coroutine_fn backup_run(void *opaque)
1bdc94
     qemu_co_rwlock_init(&job->flush_rwlock);
1bdc94
 
1bdc94
     nb_clusters = DIV_ROUND_UP(job->len, job->cluster_size);
1bdc94
-    block_job_progress_set_remaining(&job->common, job->len);
1bdc94
+    job_progress_set_remaining(&job->common.job, job->len);
1bdc94
 
1bdc94
     job->copy_bitmap = hbitmap_alloc(nb_clusters, 0);
1bdc94
     if (job->sync_mode == MIRROR_SYNC_MODE_INCREMENTAL) {
1bdc94
diff --git a/block/commit.c b/block/commit.c
1bdc94
index b0a847e..6206661 100644
1bdc94
--- a/block/commit.c
1bdc94
+++ b/block/commit.c
1bdc94
@@ -150,7 +150,7 @@ static void coroutine_fn commit_run(void *opaque)
1bdc94
     if (len < 0) {
1bdc94
         goto out;
1bdc94
     }
1bdc94
-    block_job_progress_set_remaining(&s->common, len);
1bdc94
+    job_progress_set_remaining(&s->common.job, len);
1bdc94
 
1bdc94
     ret = base_len = blk_getlength(s->base);
1bdc94
     if (base_len < 0) {
1bdc94
@@ -196,7 +196,7 @@ static void coroutine_fn commit_run(void *opaque)
1bdc94
             }
1bdc94
         }
1bdc94
         /* Publish progress */
1bdc94
-        block_job_progress_update(&s->common, n);
1bdc94
+        job_progress_update(&s->common.job, n);
1bdc94
 
1bdc94
         if (copy) {
1bdc94
             delay_ns = block_job_ratelimit_get_delay(&s->common, n);
1bdc94
diff --git a/block/mirror.c b/block/mirror.c
1bdc94
index bdc1b5b..dcb66ec 100644
1bdc94
--- a/block/mirror.c
1bdc94
+++ b/block/mirror.c
1bdc94
@@ -119,7 +119,7 @@ static void mirror_iteration_done(MirrorOp *op, int ret)
1bdc94
             bitmap_set(s->cow_bitmap, chunk_num, nb_chunks);
1bdc94
         }
1bdc94
         if (!s->initial_zeroing_ongoing) {
1bdc94
-            block_job_progress_update(&s->common, op->bytes);
1bdc94
+            job_progress_update(&s->common.job, op->bytes);
1bdc94
         }
1bdc94
     }
1bdc94
     qemu_iovec_destroy(&op->qiov);
1bdc94
@@ -792,7 +792,7 @@ static void coroutine_fn mirror_run(void *opaque)
1bdc94
         /* cnt is the number of dirty bytes remaining and s->bytes_in_flight is
1bdc94
          * the number of bytes currently being processed; together those are
1bdc94
          * the current remaining operation length */
1bdc94
-        block_job_progress_set_remaining(&s->common, s->bytes_in_flight + cnt);
1bdc94
+        job_progress_set_remaining(&s->common.job, s->bytes_in_flight + cnt);
1bdc94
 
1bdc94
         /* Note that even when no rate limit is applied we need to yield
1bdc94
          * periodically with no pending I/O so that bdrv_drain_all() returns.
1bdc94
diff --git a/block/stream.c b/block/stream.c
1bdc94
index 8546c41..a5d6e0c 100644
1bdc94
--- a/block/stream.c
1bdc94
+++ b/block/stream.c
1bdc94
@@ -121,7 +121,7 @@ static void coroutine_fn stream_run(void *opaque)
1bdc94
         ret = len;
1bdc94
         goto out;
1bdc94
     }
1bdc94
-    block_job_progress_set_remaining(&s->common, len);
1bdc94
+    job_progress_set_remaining(&s->common.job, len);
1bdc94
 
1bdc94
     buf = qemu_blockalign(bs, STREAM_BUFFER_SIZE);
1bdc94
 
1bdc94
@@ -184,7 +184,7 @@ static void coroutine_fn stream_run(void *opaque)
1bdc94
         ret = 0;
1bdc94
 
1bdc94
         /* Publish progress */
1bdc94
-        block_job_progress_update(&s->common, n);
1bdc94
+        job_progress_update(&s->common.job, n);
1bdc94
         if (copy) {
1bdc94
             delay_ns = block_job_ratelimit_get_delay(&s->common, n);
1bdc94
         } else {
1bdc94
diff --git a/blockjob.c b/blockjob.c
1bdc94
index da11b3b..5c8ff6f 100644
1bdc94
--- a/blockjob.c
1bdc94
+++ b/blockjob.c
1bdc94
@@ -242,16 +242,6 @@ int64_t block_job_ratelimit_get_delay(BlockJob *job, uint64_t n)
1bdc94
     return ratelimit_calculate_delay(&job->limit, n);
1bdc94
 }
1bdc94
 
1bdc94
-void block_job_progress_update(BlockJob *job, uint64_t done)
1bdc94
-{
1bdc94
-    job->offset += done;
1bdc94
-}
1bdc94
-
1bdc94
-void block_job_progress_set_remaining(BlockJob *job, uint64_t remaining)
1bdc94
-{
1bdc94
-    job->len = job->offset + remaining;
1bdc94
-}
1bdc94
-
1bdc94
 BlockJobInfo *block_job_query(BlockJob *job, Error **errp)
1bdc94
 {
1bdc94
     BlockJobInfo *info;
1bdc94
@@ -263,10 +253,10 @@ BlockJobInfo *block_job_query(BlockJob *job, Error **errp)
1bdc94
     info = g_new0(BlockJobInfo, 1);
1bdc94
     info->type      = g_strdup(job_type_str(&job->job));
1bdc94
     info->device    = g_strdup(job->job.id);
1bdc94
-    info->len       = job->len;
1bdc94
     info->busy      = atomic_read(&job->job.busy);
1bdc94
     info->paused    = job->job.pause_count > 0;
1bdc94
-    info->offset    = job->offset;
1bdc94
+    info->offset    = job->job.progress_current;
1bdc94
+    info->len       = job->job.progress_total;
1bdc94
     info->speed     = job->speed;
1bdc94
     info->io_status = job->iostatus;
1bdc94
     info->ready     = job_is_ready(&job->job),
1bdc94
@@ -296,8 +286,8 @@ static void block_job_event_cancelled(Notifier *n, void *opaque)
1bdc94
 
1bdc94
     qapi_event_send_block_job_cancelled(job_type(&job->job),
1bdc94
                                         job->job.id,
1bdc94
-                                        job->len,
1bdc94
-                                        job->offset,
1bdc94
+                                        job->job.progress_total,
1bdc94
+                                        job->job.progress_current,
1bdc94
                                         job->speed,
1bdc94
                                         &error_abort);
1bdc94
 }
1bdc94
@@ -317,8 +307,8 @@ static void block_job_event_completed(Notifier *n, void *opaque)
1bdc94
 
1bdc94
     qapi_event_send_block_job_completed(job_type(&job->job),
1bdc94
                                         job->job.id,
1bdc94
-                                        job->len,
1bdc94
-                                        job->offset,
1bdc94
+                                        job->job.progress_total,
1bdc94
+                                        job->job.progress_current,
1bdc94
                                         job->speed,
1bdc94
                                         !!msg,
1bdc94
                                         msg,
1bdc94
@@ -348,8 +338,8 @@ static void block_job_event_ready(Notifier *n, void *opaque)
1bdc94
 
1bdc94
     qapi_event_send_block_job_ready(job_type(&job->job),
1bdc94
                                     job->job.id,
1bdc94
-                                    job->len,
1bdc94
-                                    job->offset,
1bdc94
+                                    job->job.progress_total,
1bdc94
+                                    job->job.progress_current,
1bdc94
                                     job->speed, &error_abort);
1bdc94
 }
1bdc94
 
1bdc94
diff --git a/include/block/blockjob.h b/include/block/blockjob.h
1bdc94
index 4fca45f..3021d11 100644
1bdc94
--- a/include/block/blockjob.h
1bdc94
+++ b/include/block/blockjob.h
1bdc94
@@ -52,12 +52,6 @@ typedef struct BlockJob {
1bdc94
     /** Status that is published by the query-block-jobs QMP API */
1bdc94
     BlockDeviceIoStatus iostatus;
1bdc94
 
1bdc94
-    /** Offset that is published by the query-block-jobs QMP API */
1bdc94
-    int64_t offset;
1bdc94
-
1bdc94
-    /** Length that is published by the query-block-jobs QMP API */
1bdc94
-    int64_t len;
1bdc94
-
1bdc94
     /** Speed that was set with @block_job_set_speed.  */
1bdc94
     int64_t speed;
1bdc94
 
1bdc94
@@ -139,25 +133,6 @@ void block_job_remove_all_bdrv(BlockJob *job);
1bdc94
 void block_job_set_speed(BlockJob *job, int64_t speed, Error **errp);
1bdc94
 
1bdc94
 /**
1bdc94
- * block_job_progress_update:
1bdc94
- * @job: The job that has made progress
1bdc94
- * @done: How much progress the job made
1bdc94
- *
1bdc94
- * Updates the progress counter of the job.
1bdc94
- */
1bdc94
-void block_job_progress_update(BlockJob *job, uint64_t done);
1bdc94
-
1bdc94
-/**
1bdc94
- * block_job_progress_set_remaining:
1bdc94
- * @job: The job whose expected progress end value is set
1bdc94
- * @remaining: Expected end value of the progress counter of the job
1bdc94
- *
1bdc94
- * Sets the expected end value of the progress counter of a job so that a
1bdc94
- * completion percentage can be calculated when the progress is updated.
1bdc94
- */
1bdc94
-void block_job_progress_set_remaining(BlockJob *job, uint64_t remaining);
1bdc94
-
1bdc94
-/**
1bdc94
  * block_job_query:
1bdc94
  * @job: The job to get information about.
1bdc94
  *
1bdc94
diff --git a/include/qemu/job.h b/include/qemu/job.h
1bdc94
index bfc2bc5..92d1d24 100644
1bdc94
--- a/include/qemu/job.h
1bdc94
+++ b/include/qemu/job.h
1bdc94
@@ -114,6 +114,16 @@ typedef struct Job {
1bdc94
     /** True if this job should automatically dismiss itself */
1bdc94
     bool auto_dismiss;
1bdc94
 
1bdc94
+    /**
1bdc94
+     * Current progress. The unit is arbitrary as long as the ratio between
1bdc94
+     * progress_current and progress_total represents the estimated percentage
1bdc94
+     * of work already done.
1bdc94
+     */
1bdc94
+    int64_t progress_current;
1bdc94
+
1bdc94
+    /** Estimated progress_current value at the completion of the job */
1bdc94
+    int64_t progress_total;
1bdc94
+
1bdc94
     /** ret code passed to job_completed. */
1bdc94
     int ret;
1bdc94
 
1bdc94
@@ -304,6 +314,24 @@ void job_ref(Job *job);
1bdc94
  */
1bdc94
 void job_unref(Job *job);
1bdc94
 
1bdc94
+/**
1bdc94
+ * @job: The job that has made progress
1bdc94
+ * @done: How much progress the job made since the last call
1bdc94
+ *
1bdc94
+ * Updates the progress counter of the job.
1bdc94
+ */
1bdc94
+void job_progress_update(Job *job, uint64_t done);
1bdc94
+
1bdc94
+/**
1bdc94
+ * @job: The job whose expected progress end value is set
1bdc94
+ * @remaining: Missing progress (on top of the current progress counter value)
1bdc94
+ *             until the new expected end value is reached
1bdc94
+ *
1bdc94
+ * Sets the expected end value of the progress counter of a job so that a
1bdc94
+ * completion percentage can be calculated when the progress is updated.
1bdc94
+ */
1bdc94
+void job_progress_set_remaining(Job *job, uint64_t remaining);
1bdc94
+
1bdc94
 /** To be called when a cancelled job is finalised. */
1bdc94
 void job_event_cancelled(Job *job);
1bdc94
 
1bdc94
diff --git a/job.c b/job.c
1bdc94
index b5bd51b..2046d2f 100644
1bdc94
--- a/job.c
1bdc94
+++ b/job.c
1bdc94
@@ -364,6 +364,16 @@ void job_unref(Job *job)
1bdc94
     }
1bdc94
 }
1bdc94
 
1bdc94
+void job_progress_update(Job *job, uint64_t done)
1bdc94
+{
1bdc94
+    job->progress_current += done;
1bdc94
+}
1bdc94
+
1bdc94
+void job_progress_set_remaining(Job *job, uint64_t remaining)
1bdc94
+{
1bdc94
+    job->progress_total = job->progress_current + remaining;
1bdc94
+}
1bdc94
+
1bdc94
 void job_event_cancelled(Job *job)
1bdc94
 {
1bdc94
     notifier_list_notify(&job->on_finalize_cancelled, job);
1bdc94
diff --git a/qemu-img.c b/qemu-img.c
1bdc94
index 3c449a2..9fc8e66 100644
1bdc94
--- a/qemu-img.c
1bdc94
+++ b/qemu-img.c
1bdc94
@@ -875,9 +875,13 @@ static void run_block_job(BlockJob *job, Error **errp)
1bdc94
     aio_context_acquire(aio_context);
1bdc94
     job_ref(&job->job);
1bdc94
     do {
1bdc94
+        float progress = 0.0f;
1bdc94
         aio_poll(aio_context, true);
1bdc94
-        qemu_progress_print(job->len ?
1bdc94
-                            ((float)job->offset / job->len * 100.f) : 0.0f, 0);
1bdc94
+        if (job->job.progress_total) {
1bdc94
+            progress = (float)job->job.progress_current /
1bdc94
+                       job->job.progress_total * 100.f;
1bdc94
+        }
1bdc94
+        qemu_progress_print(progress, 0);
1bdc94
     } while (!job_is_ready(&job->job) && !job_is_completed(&job->job));
1bdc94
 
1bdc94
     if (!job_is_completed(&job->job)) {
1bdc94
-- 
1bdc94
1.8.3.1
1bdc94