summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVladimir Sementsov-Ogievskiy2021-01-16 22:46:47 +0100
committerMax Reitz2021-01-26 14:36:37 +0100
commit2e099a9d29b2f8791ceaa4a54479e613f45180bd (patch)
tree28a2c79b770d784c679f2d73124f73148d1e5df6
parentblock/block-copy: add max_chunk and max_workers parameters (diff)
downloadqemu-2e099a9d29b2f8791ceaa4a54479e613f45180bd.tar.gz
qemu-2e099a9d29b2f8791ceaa4a54479e613f45180bd.tar.xz
qemu-2e099a9d29b2f8791ceaa4a54479e613f45180bd.zip
block/block-copy: add list of all call-states
It simplifies debugging. Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Message-Id: <20210116214705.822267-6-vsementsov@virtuozzo.com> Signed-off-by: Max Reitz <mreitz@redhat.com>
-rw-r--r--block/block-copy.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/block/block-copy.c b/block/block-copy.c
index 35213bd832..6bf1735b93 100644
--- a/block/block-copy.c
+++ b/block/block-copy.c
@@ -42,6 +42,9 @@ typedef struct BlockCopyCallState {
/* Coroutine where async block-copy is running */
Coroutine *co;
+ /* To reference all call states from BlockCopyState */
+ QLIST_ENTRY(BlockCopyCallState) list;
+
/* State */
int ret;
bool finished;
@@ -81,7 +84,8 @@ typedef struct BlockCopyState {
bool use_copy_range;
int64_t copy_size;
uint64_t len;
- QLIST_HEAD(, BlockCopyTask) tasks;
+ QLIST_HEAD(, BlockCopyTask) tasks; /* All tasks from all block-copy calls */
+ QLIST_HEAD(, BlockCopyCallState) calls;
BdrvRequestFlags write_flags;
@@ -282,6 +286,7 @@ BlockCopyState *block_copy_state_new(BdrvChild *source, BdrvChild *target,
}
QLIST_INIT(&s->tasks);
+ QLIST_INIT(&s->calls);
return s;
}
@@ -669,6 +674,8 @@ static int coroutine_fn block_copy_common(BlockCopyCallState *call_state)
{
int ret;
+ QLIST_INSERT_HEAD(&call_state->s->calls, call_state, list);
+
do {
ret = block_copy_dirty_clusters(call_state);
@@ -694,6 +701,8 @@ static int coroutine_fn block_copy_common(BlockCopyCallState *call_state)
call_state->cb(call_state->cb_opaque);
}
+ QLIST_REMOVE(call_state, list);
+
return ret;
}