[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PULL 11/12] blockjob: use deferred_to_main_loop to indicat
From: |
Jeff Cody |
Subject: |
[Qemu-block] [PULL 11/12] blockjob: use deferred_to_main_loop to indicate the coroutine has ended |
Date: |
Fri, 26 May 2017 15:24:03 -0400 |
From: Paolo Bonzini <address@hidden>
All block jobs are using block_job_defer_to_main_loop as the final
step just before the coroutine terminates. At this point,
block_job_enter should do nothing, but currently it restarts
the freed coroutine.
Now, the job->co states should probably be changed to an enum
(e.g. BEFORE_START, STARTED, YIELDED, COMPLETED) subsuming
block_job_started, job->deferred_to_main_loop and job->busy.
For now, this patch eliminates the problematic reenter by
removing the reset of job->deferred_to_main_loop (which served
no purpose, as far as I could see) and checking the flag in
block_job_enter.
Reviewed-by: Stefan Hajnoczi <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
Message-id: address@hidden
Signed-off-by: Jeff Cody <address@hidden>
---
blockjob.c | 10 ++++++++--
include/block/blockjob_int.h | 3 ++-
2 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/blockjob.c b/blockjob.c
index 9a97c73..a0d7e29 100644
--- a/blockjob.c
+++ b/blockjob.c
@@ -771,7 +771,14 @@ void block_job_resume_all(void)
void block_job_enter(BlockJob *job)
{
- if (job->co && !job->busy) {
+ if (!block_job_started(job)) {
+ return;
+ }
+ if (job->deferred_to_main_loop) {
+ return;
+ }
+
+ if (!job->busy) {
bdrv_coroutine_enter(blk_bs(job->blk), job->co);
}
}
@@ -899,7 +906,6 @@ static void block_job_defer_to_main_loop_bh(void *opaque)
aio_context_acquire(aio_context);
}
- data->job->deferred_to_main_loop = false;
data->fn(data->job, data->opaque);
if (aio_context != data->aio_context) {
diff --git a/include/block/blockjob_int.h b/include/block/blockjob_int.h
index 4f2d2ac..f13ad05 100644
--- a/include/block/blockjob_int.h
+++ b/include/block/blockjob_int.h
@@ -241,7 +241,8 @@ typedef void BlockJobDeferToMainLoopFn(BlockJob *job, void
*opaque);
* @fn: The function to run in the main loop
* @opaque: The opaque value that is passed to @fn
*
- * Execute a given function in the main loop with the BlockDriverState
+ * This function must be called by the main job coroutine just before it
+ * returns. @fn is executed in the main loop with the BlockDriverState
* AioContext acquired. Block jobs must call bdrv_unref(), bdrv_close(), and
* anything that uses bdrv_drain_all() in the main loop.
*
--
2.9.3
- [Qemu-block] [PULL 01/12] blockjob: remove unnecessary check, (continued)
- [Qemu-block] [PULL 01/12] blockjob: remove unnecessary check, Jeff Cody, 2017/05/26
- [Qemu-block] [PULL 02/12] blockjob: remove iostatus_reset callback, Jeff Cody, 2017/05/26
- [Qemu-block] [PULL 03/12] blockjob: introduce block_job_early_fail, Jeff Cody, 2017/05/26
- [Qemu-block] [PULL 05/12] blockjob: separate monitor and blockjob APIs, Jeff Cody, 2017/05/26
- [Qemu-block] [PULL 04/12] blockjob: introduce block_job_pause/resume_all, Jeff Cody, 2017/05/26
- [Qemu-block] [PULL 08/12] blockjob: group BlockJob transaction functions together, Jeff Cody, 2017/05/26
- [Qemu-block] [PULL 07/12] blockjob: introduce block_job_cancel_async, check iostatus invariants, Jeff Cody, 2017/05/26
- [Qemu-block] [PULL 06/12] blockjob: move iostatus reset inside block_job_user_resume, Jeff Cody, 2017/05/26
- [Qemu-block] [PULL 09/12] blockjob: strengthen a bit test-blockjob-txn, Jeff Cody, 2017/05/26
- [Qemu-block] [PULL 10/12] blockjob: reorganize block_job_completed_txn_abort, Jeff Cody, 2017/05/26
- [Qemu-block] [PULL 11/12] blockjob: use deferred_to_main_loop to indicate the coroutine has ended,
Jeff Cody <=
- [Qemu-block] [PULL 12/12] block/gluster: glfs_lseek() workaround, Jeff Cody, 2017/05/26
- Re: [Qemu-block] [PULL 00/12] Block patches, Stefan Hajnoczi, 2017/05/30