block/block-copy: add max_chunk and max_workers parameters

They will be used for backup.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Message-Id: <20210116214705.822267-5-vsementsov@virtuozzo.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
Vladimir Sementsov-Ogievskiy 2021-01-17 00:46:46 +03:00 committed by Max Reitz
parent de4641b46b
commit 26be9d62dd
2 changed files with 15 additions and 2 deletions

View File

@ -34,6 +34,8 @@ typedef struct BlockCopyCallState {
BlockCopyState *s; BlockCopyState *s;
int64_t offset; int64_t offset;
int64_t bytes; int64_t bytes;
int max_workers;
int64_t max_chunk;
BlockCopyAsyncCallbackFunc cb; BlockCopyAsyncCallbackFunc cb;
void *cb_opaque; void *cb_opaque;
@ -148,10 +150,11 @@ static BlockCopyTask *block_copy_task_create(BlockCopyState *s,
int64_t offset, int64_t bytes) int64_t offset, int64_t bytes)
{ {
BlockCopyTask *task; BlockCopyTask *task;
int64_t max_chunk = MIN_NON_ZERO(s->copy_size, call_state->max_chunk);
if (!bdrv_dirty_bitmap_next_dirty_area(s->copy_bitmap, if (!bdrv_dirty_bitmap_next_dirty_area(s->copy_bitmap,
offset, offset + bytes, offset, offset + bytes,
s->copy_size, &offset, &bytes)) max_chunk, &offset, &bytes))
{ {
return NULL; return NULL;
} }
@ -623,7 +626,7 @@ block_copy_dirty_clusters(BlockCopyCallState *call_state)
bytes = end - offset; bytes = end - offset;
if (!aio && bytes) { if (!aio && bytes) {
aio = aio_task_pool_new(BLOCK_COPY_MAX_WORKERS); aio = aio_task_pool_new(call_state->max_workers);
} }
ret = block_copy_task_run(aio, task); ret = block_copy_task_run(aio, task);
@ -701,6 +704,7 @@ int coroutine_fn block_copy(BlockCopyState *s, int64_t start, int64_t bytes,
.s = s, .s = s,
.offset = start, .offset = start,
.bytes = bytes, .bytes = bytes,
.max_workers = BLOCK_COPY_MAX_WORKERS,
}; };
int ret = block_copy_common(&call_state); int ret = block_copy_common(&call_state);
@ -719,6 +723,7 @@ static void coroutine_fn block_copy_async_co_entry(void *opaque)
BlockCopyCallState *block_copy_async(BlockCopyState *s, BlockCopyCallState *block_copy_async(BlockCopyState *s,
int64_t offset, int64_t bytes, int64_t offset, int64_t bytes,
int max_workers, int64_t max_chunk,
BlockCopyAsyncCallbackFunc cb, BlockCopyAsyncCallbackFunc cb,
void *cb_opaque) void *cb_opaque)
{ {
@ -728,6 +733,8 @@ BlockCopyCallState *block_copy_async(BlockCopyState *s,
.s = s, .s = s,
.offset = offset, .offset = offset,
.bytes = bytes, .bytes = bytes,
.max_workers = max_workers,
.max_chunk = max_chunk,
.cb = cb, .cb = cb,
.cb_opaque = cb_opaque, .cb_opaque = cb_opaque,

View File

@ -49,9 +49,15 @@ int coroutine_fn block_copy(BlockCopyState *s, int64_t offset, int64_t bytes,
* *
* Caller is responsible to call block_copy_call_free() to free * Caller is responsible to call block_copy_call_free() to free
* BlockCopyCallState object. * BlockCopyCallState object.
*
* @max_workers means maximum of parallel coroutines to execute sub-requests,
* must be > 0.
*
* @max_chunk means maximum length for one IO operation. Zero means unlimited.
*/ */
BlockCopyCallState *block_copy_async(BlockCopyState *s, BlockCopyCallState *block_copy_async(BlockCopyState *s,
int64_t offset, int64_t bytes, int64_t offset, int64_t bytes,
int max_workers, int64_t max_chunk,
BlockCopyAsyncCallbackFunc cb, BlockCopyAsyncCallbackFunc cb,
void *cb_opaque); void *cb_opaque);