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:
Kevin Wolf 2018-01-18 20:20:24 +01:00
parent 05df8a6a2b
commit f05fee508f
5 changed files with 13 additions and 12 deletions

View File

@ -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);

View File

@ -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 = {

View File

@ -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)

View File

@ -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 = {

View File

@ -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;