[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH RFC 3/9] blockjob: Implement AioContext drain ops
From: |
Fam Zheng |
Subject: |
[Qemu-block] [PATCH RFC 3/9] blockjob: Implement AioContext drain ops |
Date: |
Wed, 29 Nov 2017 22:49:50 +0800 |
Signed-off-by: Fam Zheng <address@hidden>
---
blockjob.c | 47 ++++++++++++++++++++++++++++++-----------------
1 file changed, 30 insertions(+), 17 deletions(-)
diff --git a/blockjob.c b/blockjob.c
index ff9a614531..86d060c89c 100644
--- a/blockjob.c
+++ b/blockjob.c
@@ -148,6 +148,23 @@ static void block_job_attached_aio_context(AioContext
*new_context,
void *opaque);
static void block_job_detach_aio_context(void *opaque);
+static void block_job_drained_begin(void *opaque)
+{
+ BlockJob *job = opaque;
+ block_job_pause(job);
+}
+
+static void block_job_drained_end(void *opaque)
+{
+ BlockJob *job = opaque;
+ block_job_resume(job);
+}
+
+static const BlockDevOps block_job_dev_ops = {
+ .drained_begin = block_job_drained_begin,
+ .drained_end = block_job_drained_end,
+};
+
void block_job_unref(BlockJob *job)
{
if (--job->refcnt == 0) {
@@ -157,6 +174,10 @@ void block_job_unref(BlockJob *job)
blk_remove_aio_context_notifier(job->blk,
block_job_attached_aio_context,
block_job_detach_aio_context, job);
+ aio_context_del_drain_ops(blk_get_aio_context(job->blk),
+ block_job_drained_begin,
+ block_job_drained_end,
+ job);
blk_unref(job->blk);
error_free(job->blocker);
g_free(job->id);
@@ -170,6 +191,9 @@ static void block_job_attached_aio_context(AioContext
*new_context,
{
BlockJob *job = opaque;
+ aio_context_add_drain_ops(blk_get_aio_context(job->blk),
+ block_job_drained_begin, block_job_drained_end,
+ job);
if (job->driver->attached_aio_context) {
job->driver->attached_aio_context(job, new_context);
}
@@ -192,6 +216,9 @@ static void block_job_detach_aio_context(void *opaque)
{
BlockJob *job = opaque;
+ aio_context_del_drain_ops(blk_get_aio_context(job->blk),
+ block_job_drained_begin, block_job_drained_end,
+ job);
/* In case the job terminates during aio_poll()... */
block_job_ref(job);
@@ -217,23 +244,6 @@ static const BdrvChildRole child_job = {
.stay_at_node = true,
};
-static void block_job_drained_begin(void *opaque)
-{
- BlockJob *job = opaque;
- block_job_pause(job);
-}
-
-static void block_job_drained_end(void *opaque)
-{
- BlockJob *job = opaque;
- block_job_resume(job);
-}
-
-static const BlockDevOps block_job_dev_ops = {
- .drained_begin = block_job_drained_begin,
- .drained_end = block_job_drained_end,
-};
-
void block_job_remove_all_bdrv(BlockJob *job)
{
GSList *l;
@@ -671,6 +681,9 @@ void *block_job_create(const char *job_id, const
BlockJobDriver *driver,
bs->job = job;
blk_set_dev_ops(blk, &block_job_dev_ops, job);
+ aio_context_add_drain_ops(blk_get_aio_context(blk),
+ block_job_drained_begin, block_job_drained_end,
+ job);
bdrv_op_unblock(bs, BLOCK_OP_TYPE_DATAPLANE, job->blocker);
QLIST_INSERT_HEAD(&block_jobs, job, job_list);
--
2.14.3
- [Qemu-block] [PATCH RFC 0/9] block: Rewrite block drain begin/end, Fam Zheng, 2017/11/29
- [Qemu-block] [PATCH RFC 1/9] block: Remove unused bdrv_requests_pending, Fam Zheng, 2017/11/29
- [Qemu-block] [PATCH RFC 2/9] aio: Add drain begin/end API to AioContext, Fam Zheng, 2017/11/29
- [Qemu-block] [PATCH RFC 3/9] blockjob: Implement AioContext drain ops,
Fam Zheng <=
- [Qemu-block] [PATCH RFC 4/9] throttle: Implement AioContext drain ops, Fam Zheng, 2017/11/29
- [Qemu-block] [PATCH RFC 5/9] qed: Implement AioContext drain ops, Fam Zheng, 2017/11/29
- [Qemu-block] [PATCH RFC 6/9] block: Use aio_context_drained_begin in bdrv_set_aio_context, Fam Zheng, 2017/11/29
- [Qemu-block] [PATCH RFC 7/9] block: Switch to use AIO drained begin/end API, Fam Zheng, 2017/11/29
- [Qemu-block] [PATCH RFC 8/9] block: Drop old drained_{begin, end} callbacks, Fam Zheng, 2017/11/29
- [Qemu-block] [PATCH RFC 9/9] blockjob: Drop unused functions, Fam Zheng, 2017/11/29
- Re: [Qemu-block] [PATCH RFC 0/9] block: Rewrite block drain begin/end, Kevin Wolf, 2017/11/29