Skip to content

Commit

Permalink
blockjob: Introduce block_job_ratelimit_get_delay()
Browse files Browse the repository at this point in the history
This gets us rid of more direct accesses to BlockJob fields from the
job drivers.

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>
  • Loading branch information
kevmw committed May 15, 2018
1 parent 18bb692 commit dee81d5
Show file tree
Hide file tree
Showing 6 changed files with 29 additions and 19 deletions.
18 changes: 7 additions & 11 deletions block/backup.c
Original file line number Diff line number Diff line change
Expand Up @@ -325,21 +325,17 @@ static void backup_complete(BlockJob *job, void *opaque)

static bool coroutine_fn yield_and_check(BackupBlockJob *job)
{
uint64_t delay_ns;

if (block_job_is_cancelled(&job->common)) {
return true;
}

/* we need to yield so that bdrv_drain_all() returns.
* (without, VM does not reboot)
*/
if (job->common.speed) {
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);
} else {
block_job_sleep_ns(&job->common, 0);
}
/* We need to yield even for delay_ns = 0 so that bdrv_drain_all() can
* return. Without a yield, the VM would not reboot. */
delay_ns = block_job_ratelimit_get_delay(&job->common, job->bytes_read);
job->bytes_read = 0;
block_job_sleep_ns(&job->common, delay_ns);

if (block_job_is_cancelled(&job->common)) {
return true;
Expand Down
4 changes: 2 additions & 2 deletions block/commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -197,8 +197,8 @@ static void coroutine_fn commit_run(void *opaque)
/* Publish progress */
block_job_progress_update(&s->common, n);

if (copy && s->common.speed) {
delay_ns = ratelimit_calculate_delay(&s->common.limit, n);
if (copy) {
delay_ns = block_job_ratelimit_get_delay(&s->common, n);
} else {
delay_ns = 0;
}
Expand Down
5 changes: 1 addition & 4 deletions block/mirror.c
Original file line number Diff line number Diff line change
Expand Up @@ -447,10 +447,7 @@ static uint64_t coroutine_fn mirror_iteration(MirrorBlockJob *s)
assert(io_bytes);
offset += io_bytes;
nb_chunks -= DIV_ROUND_UP(io_bytes, s->granularity);
if (s->common.speed) {
delay_ns = ratelimit_calculate_delay(&s->common.limit,
io_bytes_acct);
}
delay_ns = block_job_ratelimit_get_delay(&s->common, io_bytes_acct);
}
return delay_ns;
}
Expand Down
4 changes: 2 additions & 2 deletions block/stream.c
Original file line number Diff line number Diff line change
Expand Up @@ -185,8 +185,8 @@ 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->common.limit, n);
if (copy) {
delay_ns = block_job_ratelimit_get_delay(&s->common, n);
} else {
delay_ns = 0;
}
Expand Down
9 changes: 9 additions & 0 deletions blockjob.c
Original file line number Diff line number Diff line change
Expand Up @@ -680,6 +680,15 @@ void block_job_set_speed(BlockJob *job, int64_t speed, Error **errp)
block_job_enter_cond(job, block_job_timer_pending);
}

int64_t block_job_ratelimit_get_delay(BlockJob *job, uint64_t n)
{
if (!job->speed) {
return 0;
}

return ratelimit_calculate_delay(&job->limit, n);
}

void block_job_complete(BlockJob *job, Error **errp)
{
/* Should not be reachable via external interface for internal jobs */
Expand Down
8 changes: 8 additions & 0 deletions include/block/blockjob_int.h
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,14 @@ void block_job_sleep_ns(BlockJob *job, int64_t ns);
*/
void block_job_yield(BlockJob *job);

/**
* block_job_ratelimit_get_delay:
*
* Calculate and return delay for the next request in ns. See the documentation
* of ratelimit_calculate_delay() for details.
*/
int64_t block_job_ratelimit_get_delay(BlockJob *job, uint64_t n);

/**
* block_job_early_fail:
* @bs: The block device.
Expand Down

0 comments on commit dee81d5

Please sign in to comment.