[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 05/20] block/block-copy: implement block_copy_async
From: |
Vladimir Sementsov-Ogievskiy |
Subject: |
[PATCH v2 05/20] block/block-copy: implement block_copy_async |
Date: |
Mon, 1 Jun 2020 21:11:03 +0300 |
We'll need async block-copy invocation to use in backup directly.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---
include/block/block-copy.h | 13 +++++++++++++
block/block-copy.c | 40 ++++++++++++++++++++++++++++++++++++++
2 files changed, 53 insertions(+)
diff --git a/include/block/block-copy.h b/include/block/block-copy.h
index 6397505f30..ada0d99566 100644
--- a/include/block/block-copy.h
+++ b/include/block/block-copy.h
@@ -19,7 +19,10 @@
#include "qemu/co-shared-resource.h"
typedef void (*ProgressBytesCallbackFunc)(int64_t bytes, void *opaque);
+typedef void (*BlockCopyAsyncCallbackFunc)(int ret, bool error_is_read,
+ void *opaque);
typedef struct BlockCopyState BlockCopyState;
+typedef struct BlockCopyCallState BlockCopyCallState;
BlockCopyState *block_copy_state_new(BdrvChild *source, BdrvChild *target,
int64_t cluster_size, bool use_copy_range,
@@ -41,6 +44,16 @@ int64_t block_copy_reset_unallocated(BlockCopyState *s,
int coroutine_fn block_copy(BlockCopyState *s, int64_t offset, int64_t bytes,
bool *error_is_read);
+/*
+ * Run block-copy in a coroutine, return state pointer. If finished early
+ * returns NULL (@cb is called anyway).
+ */
+BlockCopyCallState *block_copy_async(BlockCopyState *s,
+ int64_t offset, int64_t bytes,
+ bool ratelimit, int max_workers,
+ int64_t max_chunk,
+ BlockCopyAsyncCallbackFunc cb);
+
BdrvDirtyBitmap *block_copy_dirty_bitmap(BlockCopyState *s);
void block_copy_set_skip_unallocated(BlockCopyState *s, bool skip);
diff --git a/block/block-copy.c b/block/block-copy.c
index 75882a094c..a0477d90f3 100644
--- a/block/block-copy.c
+++ b/block/block-copy.c
@@ -34,9 +34,11 @@ typedef struct BlockCopyCallState {
BlockCopyState *s;
int64_t offset;
int64_t bytes;
+ BlockCopyAsyncCallbackFunc cb;
/* State */
bool failed;
+ bool finished;
/* OUT parameters */
bool error_is_read;
@@ -676,6 +678,13 @@ static int coroutine_fn
block_copy_common(BlockCopyCallState *call_state)
*/
} while (ret > 0);
+ if (call_state->cb) {
+ call_state->cb(ret, call_state->error_is_read,
+ call_state->s->progress_opaque);
+ }
+
+ call_state->finished = true;
+
return ret;
}
@@ -697,6 +706,37 @@ int coroutine_fn block_copy(BlockCopyState *s, int64_t
start, int64_t bytes,
return ret;
}
+static void coroutine_fn block_copy_async_co_entry(void *opaque)
+{
+ block_copy_common(opaque);
+}
+
+BlockCopyCallState *block_copy_async(BlockCopyState *s,
+ int64_t offset, int64_t bytes,
+ bool ratelimit, int max_workers,
+ int64_t max_chunk,
+ BlockCopyAsyncCallbackFunc cb)
+{
+ BlockCopyCallState *call_state = g_new(BlockCopyCallState, 1);
+ Coroutine *co = qemu_coroutine_create(block_copy_async_co_entry,
+ call_state);
+
+ *call_state = (BlockCopyCallState) {
+ .s = s,
+ .offset = offset,
+ .bytes = bytes,
+ .cb = cb,
+ };
+
+ qemu_coroutine_enter(co);
+
+ if (call_state->finished) {
+ g_free(call_state);
+ return NULL;
+ }
+
+ return call_state;
+}
BdrvDirtyBitmap *block_copy_dirty_bitmap(BlockCopyState *s)
{
return s->copy_bitmap;
--
2.21.0
- [PATCH v2 00/20] backup performance: block_status + async, Vladimir Sementsov-Ogievskiy, 2020/06/01
- [PATCH v2 01/20] block/block-copy: block_copy_dirty_clusters: fix failure check, Vladimir Sementsov-Ogievskiy, 2020/06/01
- [PATCH v2 02/20] iotests: 129 don't check backup "busy", Vladimir Sementsov-Ogievskiy, 2020/06/01
- [PATCH v2 04/20] block/block-copy: More explicit call_state, Vladimir Sementsov-Ogievskiy, 2020/06/01
- [PATCH v2 03/20] qapi: backup: add x-use-copy-range parameter, Vladimir Sementsov-Ogievskiy, 2020/06/01
- [PATCH v2 05/20] block/block-copy: implement block_copy_async,
Vladimir Sementsov-Ogievskiy <=
- [PATCH v2 07/20] block/block-copy: add ratelimit to block-copy, Vladimir Sementsov-Ogievskiy, 2020/06/01
- [PATCH v2 06/20] block/block-copy: add max_chunk and max_workers parameters, Vladimir Sementsov-Ogievskiy, 2020/06/01
- [PATCH v2 08/20] block/block-copy: add block_copy_cancel, Vladimir Sementsov-Ogievskiy, 2020/06/01
- [PATCH v2 09/20] blockjob: add set_speed to BlockJobDriver, Vladimir Sementsov-Ogievskiy, 2020/06/01
- [PATCH v2 11/20] qapi: backup: add x-max-chunk and x-max-workers parameters, Vladimir Sementsov-Ogievskiy, 2020/06/01
- [PATCH v2 10/20] job: call job_enter from job_user_pause, Vladimir Sementsov-Ogievskiy, 2020/06/01
- [PATCH v2 13/20] iotests: 129: prepare for backup over block-copy, Vladimir Sementsov-Ogievskiy, 2020/06/01
- [PATCH v2 12/20] iotests: 56: prepare for backup over block-copy, Vladimir Sementsov-Ogievskiy, 2020/06/01
- [PATCH v2 14/20] iotests: 185: prepare for backup over block-copy, Vladimir Sementsov-Ogievskiy, 2020/06/01