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:
parent
de4641b46b
commit
26be9d62dd
|
@ -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,
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue