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

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