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

job: Move coroutine and related code to Job



This commit moves some core functions for dealing with the job coroutine
from BlockJob to Job. This includes primarily entering the coroutine
(both for the first and reentering) and yielding explicitly and at pause
points.

Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
Reviewed-by: default avatarJohn Snow <jsnow@redhat.com>
parent 1908a559
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -528,8 +528,8 @@ static const BlockJobDriver backup_job_driver = {
        .instance_size          = sizeof(BackupBlockJob),
        .job_type               = JOB_TYPE_BACKUP,
        .free                   = block_job_free,
    },
        .start                  = backup_run,
    },
    .commit                 = backup_commit,
    .abort                  = backup_abort,
    .clean                  = backup_clean,
+2 −2
Original line number Diff line number Diff line
@@ -220,8 +220,8 @@ static const BlockJobDriver commit_job_driver = {
        .instance_size = sizeof(CommitBlockJob),
        .job_type      = JOB_TYPE_COMMIT,
        .free          = block_job_free,
    },
        .start         = commit_run,
    },
};

static int coroutine_fn bdrv_commit_top_preadv(BlockDriverState *bs,
@@ -371,7 +371,7 @@ void commit_start(const char *job_id, BlockDriverState *bs,
    s->on_error = on_error;

    trace_commit_start(bs, base, top, s);
    block_job_start(&s->common);
    job_start(&s->common.job);
    return;

fail:
+11 −11
Original line number Diff line number Diff line
@@ -126,7 +126,7 @@ static void mirror_iteration_done(MirrorOp *op, int ret)
    g_free(op);

    if (s->waiting_for_io) {
        qemu_coroutine_enter(s->common.co);
        qemu_coroutine_enter(s->common.job.co);
    }
}

@@ -345,7 +345,7 @@ static uint64_t coroutine_fn mirror_iteration(MirrorBlockJob *s)
        mirror_wait_for_io(s);
    }

    block_job_pause_point(&s->common);
    job_pause_point(&s->common.job);

    /* Find the number of consective dirty chunks following the first dirty
     * one, and wait for in flight requests in them. */
@@ -597,7 +597,7 @@ static void mirror_throttle(MirrorBlockJob *s)
        s->last_pause_ns = now;
        block_job_sleep_ns(&s->common, 0);
    } else {
        block_job_pause_point(&s->common);
        job_pause_point(&s->common.job);
    }
}

@@ -786,7 +786,7 @@ static void coroutine_fn mirror_run(void *opaque)
            goto immediate_exit;
        }

        block_job_pause_point(&s->common);
        job_pause_point(&s->common.job);

        cnt = bdrv_get_dirty_count(s->dirty_bitmap);
        /* cnt is the number of dirty bytes remaining and s->bytes_in_flight is
@@ -957,9 +957,9 @@ static void mirror_complete(BlockJob *job, Error **errp)
    block_job_enter(&s->common);
}

static void mirror_pause(BlockJob *job)
static void mirror_pause(Job *job)
{
    MirrorBlockJob *s = container_of(job, MirrorBlockJob, common);
    MirrorBlockJob *s = container_of(job, MirrorBlockJob, common.job);

    mirror_wait_for_all_io(s);
}
@@ -991,10 +991,10 @@ static const BlockJobDriver mirror_job_driver = {
        .instance_size          = sizeof(MirrorBlockJob),
        .job_type               = JOB_TYPE_MIRROR,
        .free                   = block_job_free,
    },
        .start                  = mirror_run,
    .complete               = mirror_complete,
        .pause                  = mirror_pause,
    },
    .complete               = mirror_complete,
    .attached_aio_context   = mirror_attached_aio_context,
    .drain                  = mirror_drain,
};
@@ -1004,10 +1004,10 @@ static const BlockJobDriver commit_active_job_driver = {
        .instance_size          = sizeof(MirrorBlockJob),
        .job_type               = JOB_TYPE_COMMIT,
        .free                   = block_job_free,
    },
        .start                  = mirror_run,
    .complete               = mirror_complete,
        .pause                  = mirror_pause,
    },
    .complete               = mirror_complete,
    .attached_aio_context   = mirror_attached_aio_context,
    .drain                  = mirror_drain,
};
@@ -1244,7 +1244,7 @@ static void mirror_start_job(const char *job_id, BlockDriverState *bs,
    }

    trace_mirror_start(bs, s, opaque);
    block_job_start(&s->common);
    job_start(&s->common.job);
    return;

fail:
+1 −1
Original line number Diff line number Diff line
@@ -576,7 +576,7 @@ static void replication_start(ReplicationState *rs, ReplicationMode mode,
            aio_context_release(aio_context);
            return;
        }
        block_job_start(job);
        job_start(&job->job);
        break;
    default:
        aio_context_release(aio_context);
+2 −2
Original line number Diff line number Diff line
@@ -213,8 +213,8 @@ static const BlockJobDriver stream_job_driver = {
        .instance_size = sizeof(StreamBlockJob),
        .job_type      = JOB_TYPE_STREAM,
        .free          = block_job_free,
    },
        .start         = stream_run,
    },
};

void stream_start(const char *job_id, BlockDriverState *bs,
@@ -262,7 +262,7 @@ void stream_start(const char *job_id, BlockDriverState *bs,

    s->on_error = on_error;
    trace_stream_start(bs, base, s);
    block_job_start(&s->common);
    job_start(&s->common.job);
    return;

fail:
Loading