Commit 8865852e authored by Fam Zheng's avatar Fam Zheng
Browse files

async: Introduce aio_co_enter



They start the coroutine on the specified context.

Signed-off-by: default avatarFam Zheng <famz@redhat.com>
Acked-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: default avatarKevin Wolf <kwolf@redhat.com>
parent ba9e75ce
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -510,6 +510,15 @@ 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);

/**
 * Return the AioContext whose event loop runs in the current thread.
 *
+6 −1
Original line number Diff line number Diff line
@@ -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,7 +469,7 @@ 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);
    }
}