Blame SOURCES/kvm-blockjob-Wrappers-for-progress-counter-access.patch

357786
From c8cf3cfff0a6fd9e059190a97d38b0d1a3223e8e Mon Sep 17 00:00:00 2001
357786
From: Kevin Wolf <kwolf@redhat.com>
357786
Date: Tue, 26 Jun 2018 09:47:52 +0200
357786
Subject: [PATCH 23/89] blockjob: Wrappers for progress counter access
357786
357786
RH-Author: Kevin Wolf <kwolf@redhat.com>
357786
Message-id: <20180626094856.6924-10-kwolf@redhat.com>
357786
Patchwork-id: 81078
357786
O-Subject: [RHV-7.6 qemu-kvm-rhev PATCH v2 09/73] blockjob: Wrappers for progress counter access
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
Block job drivers are not expected to mess with the internals of the
357786
BlockJob object, so provide wrapper functions for one of the cases where
357786
they still do it: Updating the progress counter.
357786
357786
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
357786
Reviewed-by: Eric Blake <eblake@redhat.com>
357786
Reviewed-by: Max Reitz <mreitz@redhat.com>
357786
Reviewed-by: John Snow <jsnow@redhat.com>
357786
(cherry picked from commit 05df8a6a2b4e36e8d69de2130e616d5ac28e8837)
357786
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
357786
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
357786
---
357786
 block/backup.c           | 22 +++++++++++++---------
357786
 block/commit.c           | 16 ++++++++--------
357786
 block/mirror.c           | 11 +++++------
357786
 block/stream.c           | 14 ++++++++------
357786
 blockjob.c               | 10 ++++++++++
357786
 include/block/blockjob.h | 19 +++++++++++++++++++
357786
 6 files changed, 63 insertions(+), 29 deletions(-)
357786
357786
diff --git a/block/backup.c b/block/backup.c
357786
index 453cd62..5d95805 100644
357786
--- a/block/backup.c
357786
+++ b/block/backup.c
357786
@@ -39,6 +39,7 @@ typedef struct BackupBlockJob {
357786
     BlockdevOnError on_source_error;
357786
     BlockdevOnError on_target_error;
357786
     CoRwlock flush_rwlock;
357786
+    uint64_t len;
357786
     uint64_t bytes_read;
357786
     int64_t cluster_size;
357786
     bool compress;
357786
@@ -118,7 +119,7 @@ static int coroutine_fn backup_do_cow(BackupBlockJob *job,
357786
 
357786
         trace_backup_do_cow_process(job, start);
357786
 
357786
-        n = MIN(job->cluster_size, job->common.len - start);
357786
+        n = MIN(job->cluster_size, job->len - start);
357786
 
357786
         if (!bounce_buffer) {
357786
             bounce_buffer = blk_blockalign(blk, job->cluster_size);
357786
@@ -159,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
-        job->common.offset += n;
357786
+        block_job_progress_update(&job->common, n);
357786
     }
357786
 
357786
 out:
357786
@@ -261,7 +262,7 @@ void backup_do_checkpoint(BlockJob *job, Error **errp)
357786
         return;
357786
     }
357786
 
357786
-    len = DIV_ROUND_UP(backup_job->common.len, backup_job->cluster_size);
357786
+    len = DIV_ROUND_UP(backup_job->len, backup_job->cluster_size);
357786
     hbitmap_set(backup_job->copy_bitmap, 0, len);
357786
 }
357786
 
357786
@@ -420,8 +421,9 @@ static void backup_incremental_init_copy_bitmap(BackupBlockJob *job)
357786
         bdrv_set_dirty_iter(dbi, next_cluster * job->cluster_size);
357786
     }
357786
 
357786
-    job->common.offset = job->common.len -
357786
-                         hbitmap_count(job->copy_bitmap) * job->cluster_size;
357786
+    /* TODO block_job_progress_set_remaining() would make more sense */
357786
+    block_job_progress_update(&job->common,
357786
+        job->len - hbitmap_count(job->copy_bitmap) * job->cluster_size);
357786
 
357786
     bdrv_dirty_iter_free(dbi);
357786
 }
357786
@@ -437,7 +439,9 @@ static void coroutine_fn backup_run(void *opaque)
357786
     QLIST_INIT(&job->inflight_reqs);
357786
     qemu_co_rwlock_init(&job->flush_rwlock);
357786
 
357786
-    nb_clusters = DIV_ROUND_UP(job->common.len, job->cluster_size);
357786
+    nb_clusters = DIV_ROUND_UP(job->len, job->cluster_size);
357786
+    block_job_progress_set_remaining(&job->common, job->len);
357786
+
357786
     job->copy_bitmap = hbitmap_alloc(nb_clusters, 0);
357786
     if (job->sync_mode == MIRROR_SYNC_MODE_INCREMENTAL) {
357786
         backup_incremental_init_copy_bitmap(job);
357786
@@ -461,7 +465,7 @@ static void coroutine_fn backup_run(void *opaque)
357786
         ret = backup_run_incremental(job);
357786
     } else {
357786
         /* Both FULL and TOP SYNC_MODE's require copying.. */
357786
-        for (offset = 0; offset < job->common.len;
357786
+        for (offset = 0; offset < job->len;
357786
              offset += job->cluster_size) {
357786
             bool error_is_read;
357786
             int alloced = 0;
357786
@@ -620,7 +624,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
357786
         goto error;
357786
     }
357786
 
357786
-    /* job->common.len is fixed, so we can't allow resize */
357786
+    /* job->len is fixed, so we can't allow resize */
357786
     job = block_job_create(job_id, &backup_job_driver, txn, bs,
357786
                            BLK_PERM_CONSISTENT_READ,
357786
                            BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE |
357786
@@ -676,7 +680,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
357786
     /* Required permissions are already taken with target's blk_new() */
357786
     block_job_add_bdrv(&job->common, "target", target, 0, BLK_PERM_ALL,
357786
                        &error_abort);
357786
-    job->common.len = len;
357786
+    job->len = len;
357786
 
357786
     return &job->common;
357786
 
357786
diff --git a/block/commit.c b/block/commit.c
357786
index 1432bae..50b191c 100644
357786
--- a/block/commit.c
357786
+++ b/block/commit.c
357786
@@ -146,21 +146,21 @@ static void coroutine_fn commit_run(void *opaque)
357786
     int64_t n = 0; /* bytes */
357786
     void *buf = NULL;
357786
     int bytes_written = 0;
357786
-    int64_t base_len;
357786
+    int64_t len, base_len;
357786
 
357786
-    ret = s->common.len = blk_getlength(s->top);
357786
-
357786
-    if (s->common.len < 0) {
357786
+    ret = len = blk_getlength(s->top);
357786
+    if (len < 0) {
357786
         goto out;
357786
     }
357786
+    block_job_progress_set_remaining(&s->common, len);
357786
 
357786
     ret = base_len = blk_getlength(s->base);
357786
     if (base_len < 0) {
357786
         goto out;
357786
     }
357786
 
357786
-    if (base_len < s->common.len) {
357786
-        ret = blk_truncate(s->base, s->common.len, PREALLOC_MODE_OFF, NULL);
357786
+    if (base_len < len) {
357786
+        ret = blk_truncate(s->base, len, PREALLOC_MODE_OFF, NULL);
357786
         if (ret) {
357786
             goto out;
357786
         }
357786
@@ -168,7 +168,7 @@ static void coroutine_fn commit_run(void *opaque)
357786
 
357786
     buf = blk_blockalign(s->top, COMMIT_BUFFER_SIZE);
357786
 
357786
-    for (offset = 0; offset < s->common.len; offset += n) {
357786
+    for (offset = 0; offset < len; offset += n) {
357786
         bool copy;
357786
 
357786
         /* Note that even when no rate limit is applied we need to yield
357786
@@ -198,7 +198,7 @@ static void coroutine_fn commit_run(void *opaque)
357786
             }
357786
         }
357786
         /* Publish progress */
357786
-        s->common.offset += n;
357786
+        block_job_progress_update(&s->common, n);
357786
 
357786
         if (copy && s->common.speed) {
357786
             delay_ns = ratelimit_calculate_delay(&s->limit, n);
357786
diff --git a/block/mirror.c b/block/mirror.c
357786
index 003f957..ed711b5 100644
357786
--- a/block/mirror.c
357786
+++ b/block/mirror.c
357786
@@ -121,7 +121,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
-            s->common.offset += op->bytes;
357786
+            block_job_progress_update(&s->common, op->bytes);
357786
         }
357786
     }
357786
     qemu_iovec_destroy(&op->qiov);
357786
@@ -792,11 +792,10 @@ static void coroutine_fn mirror_run(void *opaque)
357786
         block_job_pause_point(&s->common);
357786
 
357786
         cnt = bdrv_get_dirty_count(s->dirty_bitmap);
357786
-        /* s->common.offset contains the number of bytes already processed so
357786
-         * far, cnt is the number of dirty bytes remaining and
357786
-         * s->bytes_in_flight is the number of bytes currently being
357786
-         * processed; together those are the current total operation length */
357786
-        s->common.len = s->common.offset + s->bytes_in_flight + cnt;
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
 
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 1a85708..8369852 100644
357786
--- a/block/stream.c
357786
+++ b/block/stream.c
357786
@@ -107,6 +107,7 @@ static void coroutine_fn stream_run(void *opaque)
357786
     BlockBackend *blk = s->common.blk;
357786
     BlockDriverState *bs = blk_bs(blk);
357786
     BlockDriverState *base = s->base;
357786
+    int64_t len;
357786
     int64_t offset = 0;
357786
     uint64_t delay_ns = 0;
357786
     int error = 0;
357786
@@ -118,11 +119,12 @@ static void coroutine_fn stream_run(void *opaque)
357786
         goto out;
357786
     }
357786
 
357786
-    s->common.len = bdrv_getlength(bs);
357786
-    if (s->common.len < 0) {
357786
-        ret = s->common.len;
357786
+    len = bdrv_getlength(bs);
357786
+    if (len < 0) {
357786
+        ret = len;
357786
         goto out;
357786
     }
357786
+    block_job_progress_set_remaining(&s->common, len);
357786
 
357786
     buf = qemu_blockalign(bs, STREAM_BUFFER_SIZE);
357786
 
357786
@@ -135,7 +137,7 @@ static void coroutine_fn stream_run(void *opaque)
357786
         bdrv_enable_copy_on_read(bs);
357786
     }
357786
 
357786
-    for ( ; offset < s->common.len; offset += n) {
357786
+    for ( ; offset < len; offset += n) {
357786
         bool copy;
357786
 
357786
         /* Note that even when no rate limit is applied we need to yield
357786
@@ -159,7 +161,7 @@ static void coroutine_fn stream_run(void *opaque)
357786
 
357786
             /* Finish early if end of backing file has been reached */
357786
             if (ret == 0 && n == 0) {
357786
-                n = s->common.len - offset;
357786
+                n = len - offset;
357786
             }
357786
 
357786
             copy = (ret == 1);
357786
@@ -185,7 +187,7 @@ static void coroutine_fn stream_run(void *opaque)
357786
         ret = 0;
357786
 
357786
         /* Publish progress */
357786
-        s->common.offset += n;
357786
+        block_job_progress_update(&s->common, n);
357786
         if (copy && s->common.speed) {
357786
             delay_ns = ratelimit_calculate_delay(&s->limit, n);
357786
         } else {
357786
diff --git a/blockjob.c b/blockjob.c
357786
index 0033b96..d0a2ac5 100644
357786
--- a/blockjob.c
357786
+++ b/blockjob.c
357786
@@ -818,6 +818,16 @@ int block_job_complete_sync(BlockJob *job, Error **errp)
357786
     return block_job_finish_sync(job, &block_job_complete, errp);
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
diff --git a/include/block/blockjob.h b/include/block/blockjob.h
357786
index fc645da..a2cc522 100644
357786
--- a/include/block/blockjob.h
357786
+++ b/include/block/blockjob.h
357786
@@ -278,6 +278,25 @@ void block_job_finalize(BlockJob *job, Error **errp);
357786
 void block_job_dismiss(BlockJob **job, 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
-- 
357786
1.8.3.1
357786