Commit dee81d51 authored by Kevin Wolf's avatar Kevin Wolf
Browse files

blockjob: Introduce block_job_ratelimit_get_delay()



This gets us rid of more direct accesses to BlockJob fields from the
job drivers.

Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
Reviewed-by: default avatarEric Blake <eblake@redhat.com>
Reviewed-by: default avatarMax Reitz <mreitz@redhat.com>
Reviewed-by: default avatarJohn Snow <jsnow@redhat.com>
parent 18bb6928
Loading
Loading
Loading
Loading
+7 −11
Original line number Diff line number Diff line
@@ -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);
    /* 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);
    } else {
        block_job_sleep_ns(&job->common, 0);
    }

    if (block_job_is_cancelled(&job->common)) {
        return true;
+2 −2
Original line number Diff line number Diff line
@@ -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;
        }
+1 −4
Original line number Diff line number Diff line
@@ -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;
}
+2 −2
Original line number Diff line number Diff line
@@ -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;
        }
+9 −0
Original line number Diff line number Diff line
@@ -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 */
Loading