Skip to content

Commit

Permalink
job: Move coroutine and related code to Job
Browse files Browse the repository at this point in the history
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: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: John Snow <jsnow@redhat.com>
  • Loading branch information
kevmw committed May 23, 2018
1 parent 1908a55 commit da01ff7
Show file tree
Hide file tree
Showing 14 changed files with 305 additions and 299 deletions.
2 changes: 1 addition & 1 deletion block/backup.c
Expand Up @@ -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,
},
.start = backup_run,
.commit = backup_commit,
.abort = backup_abort,
.clean = backup_clean,
Expand Down
4 changes: 2 additions & 2 deletions block/commit.c
Expand Up @@ -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,
},
.start = commit_run,
};

static int coroutine_fn bdrv_commit_top_preadv(BlockDriverState *bs,
Expand Down Expand Up @@ -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:
Expand Down
22 changes: 11 additions & 11 deletions block/mirror.c
Expand Up @@ -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);
}
}

Expand Down Expand Up @@ -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. */
Expand Down Expand Up @@ -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);
}
}

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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,
.pause = mirror_pause,
},
.start = mirror_run,
.complete = mirror_complete,
.pause = mirror_pause,
.attached_aio_context = mirror_attached_aio_context,
.drain = mirror_drain,
};
Expand All @@ -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,
.pause = mirror_pause,
},
.start = mirror_run,
.complete = mirror_complete,
.pause = mirror_pause,
.attached_aio_context = mirror_attached_aio_context,
.drain = mirror_drain,
};
Expand Down Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion block/replication.c
Expand Up @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions block/stream.c
Expand Up @@ -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,
},
.start = stream_run,
};

void stream_start(const char *job_id, BlockDriverState *bs,
Expand Down Expand Up @@ -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:
Expand Down
8 changes: 4 additions & 4 deletions blockdev.c
Expand Up @@ -1910,7 +1910,7 @@ static void drive_backup_commit(BlkActionState *common)
aio_context_acquire(aio_context);

assert(state->job);
block_job_start(state->job);
job_start(&state->job->job);

aio_context_release(aio_context);
}
Expand Down Expand Up @@ -2008,7 +2008,7 @@ static void blockdev_backup_commit(BlkActionState *common)
aio_context_acquire(aio_context);

assert(state->job);
block_job_start(state->job);
job_start(&state->job->job);

aio_context_release(aio_context);
}
Expand Down Expand Up @@ -3425,7 +3425,7 @@ void qmp_drive_backup(DriveBackup *arg, Error **errp)
BlockJob *job;
job = do_drive_backup(arg, NULL, errp);
if (job) {
block_job_start(job);
job_start(&job->job);
}
}

Expand Down Expand Up @@ -3513,7 +3513,7 @@ void qmp_blockdev_backup(BlockdevBackup *arg, Error **errp)
BlockJob *job;
job = do_blockdev_backup(arg, NULL, errp);
if (job) {
block_job_start(job);
job_start(&job->job);
}
}

Expand Down

0 comments on commit da01ff7

Please sign in to comment.