[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH for 2.9 v3 05/10] async: Introduce aio_co_enter and
From: |
Fam Zheng |
Subject: |
[Qemu-block] [PATCH for 2.9 v3 05/10] async: Introduce aio_co_enter and aio_co_enter_if_inactive |
Date: |
Mon, 10 Apr 2017 23:05:37 +0800 |
They start the coroutine on the specified context.
Signed-off-by: Fam Zheng <address@hidden>
---
include/block/aio.h | 18 ++++++++++++++++++
util/async.c | 14 +++++++++++++-
2 files changed, 31 insertions(+), 1 deletion(-)
diff --git a/include/block/aio.h b/include/block/aio.h
index 677b6ff..b0a6bb3 100644
--- a/include/block/aio.h
+++ b/include/block/aio.h
@@ -511,6 +511,24 @@ void aio_co_schedule(AioContext *ctx, struct Coroutine
*co);
void aio_co_wake(struct Coroutine *co);
/**
+ * aio_co_enter:
+ * @ctx: the context to run the coroutine
+ * @co: the coroutine to run
+ *
+ * Enter a coroutine in the specified AioContext.
+ */
+void aio_co_enter(AioContext *ctx, struct Coroutine *co);
+
+/**
+ * aio_co_enter_if_inactive:
+ * @ctx: the context to run the coroutine
+ * @co: the coroutine to run
+ *
+ * Enter a coroutine in the specified AioContext, if it's not already entered.
+ */
+void aio_co_enter_if_inactive(AioContext *ctx, struct Coroutine *co);
+
+/**
* Return the AioContext whose event loop runs in the current thread.
*
* If called from an IOThread this will be the IOThread's AioContext. If
diff --git a/util/async.c b/util/async.c
index 663e297..507671a 100644
--- a/util/async.c
+++ b/util/async.c
@@ -453,6 +453,11 @@ void aio_co_wake(struct Coroutine *co)
smp_read_barrier_depends();
ctx = atomic_read(&co->ctx);
+ aio_co_enter(ctx, co);
+}
+
+void aio_co_enter(AioContext *ctx, struct Coroutine *co)
+{
if (ctx != qemu_get_current_aio_context()) {
aio_co_schedule(ctx, co);
return;
@@ -464,11 +469,18 @@ void aio_co_wake(struct Coroutine *co)
QSIMPLEQ_INSERT_TAIL(&self->co_queue_wakeup, co, co_queue_next);
} else {
aio_context_acquire(ctx);
- qemu_coroutine_enter(co);
+ qemu_aio_coroutine_enter(ctx, co);
aio_context_release(ctx);
}
}
+void aio_co_enter_if_inactive(AioContext *ctx, struct Coroutine *co)
+{
+ if (!qemu_coroutine_entered(co)) {
+ aio_co_enter(ctx, co);
+ }
+}
+
void aio_context_ref(AioContext *ctx)
{
g_source_ref(&ctx->source);
--
2.9.3
- [Qemu-block] [PATCH for 2.9 v3 00/10] block: Fixes regarding dataplane and management operations, Fam Zheng, 2017/04/10
- [Qemu-block] [PATCH for 2.9 v3 02/10] block: Quiesce old aio context during bdrv_set_aio_context, Fam Zheng, 2017/04/10
- [Qemu-block] [PATCH for 2.9 v3 01/10] block: Make bdrv_parent_drained_begin/end public, Fam Zheng, 2017/04/10
- [Qemu-block] [PATCH for 2.9 v3 03/10] tests/block-job-txn: Don't start block job before adding to txn, Fam Zheng, 2017/04/10
- [Qemu-block] [PATCH for 2.9 v3 04/10] coroutine: Extract qemu_aio_coroutine_enter, Fam Zheng, 2017/04/10
- [Qemu-block] [PATCH for 2.9 v3 05/10] async: Introduce aio_co_enter and aio_co_enter_if_inactive,
Fam Zheng <=
- [Qemu-block] [PATCH for 2.9 v3 06/10] block: Introduce bdrv_coroutine_enter and *_if_inactive, Fam Zheng, 2017/04/10
- [Qemu-block] [PATCH for 2.9 v3 07/10] blockjob: Use bdrv_coroutine_enter to start coroutine, Fam Zheng, 2017/04/10
- [Qemu-block] [PATCH for 2.9 v3 08/10] qemu-io-cmds: Use bdrv_coroutine_enter, Fam Zheng, 2017/04/10
- [Qemu-block] [PATCH for 2.9 v3 09/10] block: Use bdrv_coroutine_enter to start I/O coroutines, Fam Zheng, 2017/04/10