| From 2544eb52961510e97b6bda33f9d9e71e01e5143d Mon Sep 17 00:00:00 2001 |
| From: Kevin Wolf <kwolf@redhat.com> |
| Date: Tue, 26 Jun 2018 09:47:53 +0200 |
| Subject: [PATCH 085/268] blockjob: Move RateLimit to BlockJob |
| |
| RH-Author: Kevin Wolf <kwolf@redhat.com> |
| Message-id: <20180626094856.6924-11-kwolf@redhat.com> |
| Patchwork-id: 81088 |
| O-Subject: [RHV-7.6 qemu-kvm-rhev PATCH v2 10/73] blockjob: Move RateLimit to BlockJob |
| Bugzilla: 1513543 |
| RH-Acked-by: Jeffrey Cody <jcody@redhat.com> |
| RH-Acked-by: Max Reitz <mreitz@redhat.com> |
| RH-Acked-by: Fam Zheng <famz@redhat.com> |
| |
| 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> |
| (cherry picked from commit f05fee508f538ca262d2ab19bcd8772196efe848) |
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> |
| Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com> |
| |
| block/backup.c | 5 ++--- |
| block/commit.c | 5 ++--- |
| block/mirror.c | 6 +++--- |
| block/stream.c | 5 ++--- |
| include/block/blockjob.h | 4 ++++ |
| 5 files changed, 13 insertions(+), 12 deletions(-) |
| |
| diff --git a/block/backup.c b/block/backup.c |
| index 5d95805..7585c43 100644 |
| |
| |
| @@ -35,7 +35,6 @@ typedef struct BackupBlockJob { |
| /* bitmap for sync=incremental */ |
| BdrvDirtyBitmap *sync_bitmap; |
| MirrorSyncMode sync_mode; |
| - RateLimit limit; |
| BlockdevOnError on_source_error; |
| BlockdevOnError on_target_error; |
| 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"); |
| 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) |
| @@ -346,7 +345,7 @@ static bool coroutine_fn yield_and_check(BackupBlockJob *job) |
| * (without, VM does not reboot) |
| */ |
| 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 = 0; |
| block_job_sleep_ns(&job->common, delay_ns); |
| diff --git a/block/commit.c b/block/commit.c |
| index 50b191c..beec5d0 100644 |
| |
| |
| @@ -35,7 +35,6 @@ enum { |
| |
| typedef struct CommitBlockJob { |
| BlockJob common; |
| - RateLimit limit; |
| BlockDriverState *commit_top_bs; |
| BlockBackend *top; |
| BlockBackend *base; |
| @@ -201,7 +200,7 @@ static void coroutine_fn commit_run(void *opaque) |
| block_job_progress_update(&s->common, n); |
| |
| if (copy && s->common.speed) { |
| - delay_ns = ratelimit_calculate_delay(&s->limit, n); |
| + delay_ns = ratelimit_calculate_delay(&s->common.limit, n); |
| } else { |
| 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"); |
| return; |
| } |
| - ratelimit_set_speed(&s->limit, speed, SLICE_TIME); |
| + ratelimit_set_speed(&s->common.limit, speed, SLICE_TIME); |
| } |
| |
| static const BlockJobDriver commit_job_driver = { |
| diff --git a/block/mirror.c b/block/mirror.c |
| index ed711b5..a515ec1 100644 |
| |
| |
| @@ -36,7 +36,6 @@ typedef struct MirrorBuffer { |
| |
| typedef struct MirrorBlockJob { |
| BlockJob common; |
| - RateLimit limit; |
| BlockBackend *target; |
| BlockDriverState *mirror_top_bs; |
| BlockDriverState *source; |
| @@ -450,7 +449,8 @@ static uint64_t coroutine_fn mirror_iteration(MirrorBlockJob *s) |
| offset += io_bytes; |
| nb_chunks -= DIV_ROUND_UP(io_bytes, s->granularity); |
| 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; |
| @@ -916,7 +916,7 @@ static void mirror_set_speed(BlockJob *job, int64_t speed, Error **errp) |
| error_setg(errp, QERR_INVALID_PARAMETER, "speed"); |
| 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) |
| diff --git a/block/stream.c b/block/stream.c |
| index 8369852..a1d4768 100644 |
| |
| |
| @@ -33,7 +33,6 @@ enum { |
| |
| typedef struct StreamBlockJob { |
| BlockJob common; |
| - RateLimit limit; |
| BlockDriverState *base; |
| BlockdevOnError on_error; |
| char *backing_file_str; |
| @@ -189,7 +188,7 @@ static void coroutine_fn stream_run(void *opaque) |
| /* Publish progress */ |
| block_job_progress_update(&s->common, n); |
| if (copy && s->common.speed) { |
| - delay_ns = ratelimit_calculate_delay(&s->limit, n); |
| + delay_ns = ratelimit_calculate_delay(&s->common.limit, n); |
| } else { |
| 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"); |
| return; |
| } |
| - ratelimit_set_speed(&s->limit, speed, SLICE_TIME); |
| + ratelimit_set_speed(&s->common.limit, speed, SLICE_TIME); |
| } |
| |
| static const BlockJobDriver stream_job_driver = { |
| diff --git a/include/block/blockjob.h b/include/block/blockjob.h |
| index a2cc522..22bf418 100644 |
| |
| |
| @@ -27,6 +27,7 @@ |
| #define BLOCKJOB_H |
| |
| #include "block/block.h" |
| +#include "qemu/ratelimit.h" |
| |
| typedef struct BlockJobDriver BlockJobDriver; |
| typedef struct BlockJobTxn BlockJobTxn; |
| @@ -118,6 +119,9 @@ typedef struct BlockJob { |
| /** Speed that was set with @block_job_set_speed. */ |
| int64_t speed; |
| |
| + /** Rate limiting data structure for implementing @speed. */ |
| + RateLimit limit; |
| + |
| /** The completion function that will be called when the job completes. */ |
| BlockCompletionFunc *cb; |
| |
| -- |
| 1.8.3.1 |
| |