mirror of https://github.com/xemu-project/xemu.git
blockjob: Move RateLimit to BlockJob
Every block job has a RateLimit, and they all do the exact same thing with it, so it should be common infrastructure. Move the struct field for a start. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Reviewed-by: John Snow <jsnow@redhat.com>
This commit is contained in:
parent
05df8a6a2b
commit
f05fee508f
|
@ -35,7 +35,6 @@ typedef struct BackupBlockJob {
|
||||||
/* bitmap for sync=incremental */
|
/* bitmap for sync=incremental */
|
||||||
BdrvDirtyBitmap *sync_bitmap;
|
BdrvDirtyBitmap *sync_bitmap;
|
||||||
MirrorSyncMode sync_mode;
|
MirrorSyncMode sync_mode;
|
||||||
RateLimit limit;
|
|
||||||
BlockdevOnError on_source_error;
|
BlockdevOnError on_source_error;
|
||||||
BlockdevOnError on_target_error;
|
BlockdevOnError on_target_error;
|
||||||
CoRwlock flush_rwlock;
|
CoRwlock flush_rwlock;
|
||||||
|
@ -199,7 +198,7 @@ static void backup_set_speed(BlockJob *job, int64_t speed, Error **errp)
|
||||||
error_setg(errp, QERR_INVALID_PARAMETER, "speed");
|
error_setg(errp, QERR_INVALID_PARAMETER, "speed");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ratelimit_set_speed(&s->limit, speed, SLICE_TIME);
|
ratelimit_set_speed(&s->common.limit, speed, SLICE_TIME);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void backup_cleanup_sync_bitmap(BackupBlockJob *job, int ret)
|
static void backup_cleanup_sync_bitmap(BackupBlockJob *job, int ret)
|
||||||
|
@ -346,7 +345,7 @@ static bool coroutine_fn yield_and_check(BackupBlockJob *job)
|
||||||
* (without, VM does not reboot)
|
* (without, VM does not reboot)
|
||||||
*/
|
*/
|
||||||
if (job->common.speed) {
|
if (job->common.speed) {
|
||||||
uint64_t delay_ns = ratelimit_calculate_delay(&job->limit,
|
uint64_t delay_ns = ratelimit_calculate_delay(&job->common.limit,
|
||||||
job->bytes_read);
|
job->bytes_read);
|
||||||
job->bytes_read = 0;
|
job->bytes_read = 0;
|
||||||
block_job_sleep_ns(&job->common, delay_ns);
|
block_job_sleep_ns(&job->common, delay_ns);
|
||||||
|
|
|
@ -35,7 +35,6 @@ enum {
|
||||||
|
|
||||||
typedef struct CommitBlockJob {
|
typedef struct CommitBlockJob {
|
||||||
BlockJob common;
|
BlockJob common;
|
||||||
RateLimit limit;
|
|
||||||
BlockDriverState *commit_top_bs;
|
BlockDriverState *commit_top_bs;
|
||||||
BlockBackend *top;
|
BlockBackend *top;
|
||||||
BlockBackend *base;
|
BlockBackend *base;
|
||||||
|
@ -201,7 +200,7 @@ static void coroutine_fn commit_run(void *opaque)
|
||||||
block_job_progress_update(&s->common, n);
|
block_job_progress_update(&s->common, n);
|
||||||
|
|
||||||
if (copy && s->common.speed) {
|
if (copy && s->common.speed) {
|
||||||
delay_ns = ratelimit_calculate_delay(&s->limit, n);
|
delay_ns = ratelimit_calculate_delay(&s->common.limit, n);
|
||||||
} else {
|
} else {
|
||||||
delay_ns = 0;
|
delay_ns = 0;
|
||||||
}
|
}
|
||||||
|
@ -225,7 +224,7 @@ static void commit_set_speed(BlockJob *job, int64_t speed, Error **errp)
|
||||||
error_setg(errp, QERR_INVALID_PARAMETER, "speed");
|
error_setg(errp, QERR_INVALID_PARAMETER, "speed");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ratelimit_set_speed(&s->limit, speed, SLICE_TIME);
|
ratelimit_set_speed(&s->common.limit, speed, SLICE_TIME);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const BlockJobDriver commit_job_driver = {
|
static const BlockJobDriver commit_job_driver = {
|
||||||
|
|
|
@ -36,7 +36,6 @@ typedef struct MirrorBuffer {
|
||||||
|
|
||||||
typedef struct MirrorBlockJob {
|
typedef struct MirrorBlockJob {
|
||||||
BlockJob common;
|
BlockJob common;
|
||||||
RateLimit limit;
|
|
||||||
BlockBackend *target;
|
BlockBackend *target;
|
||||||
BlockDriverState *mirror_top_bs;
|
BlockDriverState *mirror_top_bs;
|
||||||
BlockDriverState *source;
|
BlockDriverState *source;
|
||||||
|
@ -450,7 +449,8 @@ static uint64_t coroutine_fn mirror_iteration(MirrorBlockJob *s)
|
||||||
offset += io_bytes;
|
offset += io_bytes;
|
||||||
nb_chunks -= DIV_ROUND_UP(io_bytes, s->granularity);
|
nb_chunks -= DIV_ROUND_UP(io_bytes, s->granularity);
|
||||||
if (s->common.speed) {
|
if (s->common.speed) {
|
||||||
delay_ns = ratelimit_calculate_delay(&s->limit, io_bytes_acct);
|
delay_ns = ratelimit_calculate_delay(&s->common.limit,
|
||||||
|
io_bytes_acct);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return delay_ns;
|
return delay_ns;
|
||||||
|
@ -916,7 +916,7 @@ static void mirror_set_speed(BlockJob *job, int64_t speed, Error **errp)
|
||||||
error_setg(errp, QERR_INVALID_PARAMETER, "speed");
|
error_setg(errp, QERR_INVALID_PARAMETER, "speed");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ratelimit_set_speed(&s->limit, speed, SLICE_TIME);
|
ratelimit_set_speed(&s->common.limit, speed, SLICE_TIME);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mirror_complete(BlockJob *job, Error **errp)
|
static void mirror_complete(BlockJob *job, Error **errp)
|
||||||
|
|
|
@ -33,7 +33,6 @@ enum {
|
||||||
|
|
||||||
typedef struct StreamBlockJob {
|
typedef struct StreamBlockJob {
|
||||||
BlockJob common;
|
BlockJob common;
|
||||||
RateLimit limit;
|
|
||||||
BlockDriverState *base;
|
BlockDriverState *base;
|
||||||
BlockdevOnError on_error;
|
BlockdevOnError on_error;
|
||||||
char *backing_file_str;
|
char *backing_file_str;
|
||||||
|
@ -189,7 +188,7 @@ static void coroutine_fn stream_run(void *opaque)
|
||||||
/* Publish progress */
|
/* Publish progress */
|
||||||
block_job_progress_update(&s->common, n);
|
block_job_progress_update(&s->common, n);
|
||||||
if (copy && s->common.speed) {
|
if (copy && s->common.speed) {
|
||||||
delay_ns = ratelimit_calculate_delay(&s->limit, n);
|
delay_ns = ratelimit_calculate_delay(&s->common.limit, n);
|
||||||
} else {
|
} else {
|
||||||
delay_ns = 0;
|
delay_ns = 0;
|
||||||
}
|
}
|
||||||
|
@ -219,7 +218,7 @@ static void stream_set_speed(BlockJob *job, int64_t speed, Error **errp)
|
||||||
error_setg(errp, QERR_INVALID_PARAMETER, "speed");
|
error_setg(errp, QERR_INVALID_PARAMETER, "speed");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ratelimit_set_speed(&s->limit, speed, SLICE_TIME);
|
ratelimit_set_speed(&s->common.limit, speed, SLICE_TIME);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const BlockJobDriver stream_job_driver = {
|
static const BlockJobDriver stream_job_driver = {
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#define BLOCKJOB_H
|
#define BLOCKJOB_H
|
||||||
|
|
||||||
#include "block/block.h"
|
#include "block/block.h"
|
||||||
|
#include "qemu/ratelimit.h"
|
||||||
|
|
||||||
typedef struct BlockJobDriver BlockJobDriver;
|
typedef struct BlockJobDriver BlockJobDriver;
|
||||||
typedef struct BlockJobTxn BlockJobTxn;
|
typedef struct BlockJobTxn BlockJobTxn;
|
||||||
|
@ -118,6 +119,9 @@ typedef struct BlockJob {
|
||||||
/** Speed that was set with @block_job_set_speed. */
|
/** Speed that was set with @block_job_set_speed. */
|
||||||
int64_t speed;
|
int64_t speed;
|
||||||
|
|
||||||
|
/** Rate limiting data structure for implementing @speed. */
|
||||||
|
RateLimit limit;
|
||||||
|
|
||||||
/** The completion function that will be called when the job completes. */
|
/** The completion function that will be called when the job completes. */
|
||||||
BlockCompletionFunc *cb;
|
BlockCompletionFunc *cb;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue