Commit e4370165 authored by Paolo Bonzini's avatar Paolo Bonzini Committed by Fam Zheng
Browse files

aio: introduce qemu_get_current_aio_context



This will be used by BDRV_POLL_WHILE (and thus by bdrv_drain)
to choose how to wait for I/O completion.

Reviewed-by: default avatarFam Zheng <famz@redhat.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Message-Id: <1477565348-5458-12-git-send-email-pbonzini@redhat.com>
Signed-off-by: default avatarFam Zheng <famz@redhat.com>
parent f11672db
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -452,6 +452,24 @@ static inline bool aio_node_check(AioContext *ctx, bool is_external)
    return !is_external || !atomic_read(&ctx->external_disable_cnt);
}

/**
 * Return the AioContext whose event loop runs in the current thread.
 *
 * If called from an IOThread this will be the IOThread's AioContext.  If
 * called from another thread it will be the main loop AioContext.
 */
AioContext *qemu_get_current_aio_context(void);

/**
 * @ctx: the aio context
 *
 * Return whether we are running in the I/O thread that manages @ctx.
 */
static inline bool aio_context_in_iothread(AioContext *ctx)
{
    return ctx == qemu_get_current_aio_context();
}

/**
 * aio_context_setup:
 * @ctx: the aio context
+9 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include "qmp-commands.h"
#include "qemu/error-report.h"
#include "qemu/rcu.h"
#include "qemu/main-loop.h"

typedef ObjectClass IOThreadClass;

@@ -28,6 +29,13 @@ typedef ObjectClass IOThreadClass;
#define IOTHREAD_CLASS(klass) \
   OBJECT_CLASS_CHECK(IOThreadClass, klass, TYPE_IOTHREAD)

static __thread IOThread *my_iothread;

AioContext *qemu_get_current_aio_context(void)
{
    return my_iothread ? my_iothread->ctx : qemu_get_aio_context();
}

static void *iothread_run(void *opaque)
{
    IOThread *iothread = opaque;
@@ -35,6 +43,7 @@ static void *iothread_run(void *opaque)

    rcu_register_thread();

    my_iothread = iothread;
    qemu_mutex_lock(&iothread->init_done_lock);
    iothread->thread_id = qemu_get_thread_id();
    qemu_cond_signal(&iothread->init_done_cond);
+1 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@ stub-obj-y += gdbstub.o
stub-obj-y += get-fd.o
stub-obj-y += get-next-serial.o
stub-obj-y += get-vm-name.o
stub-obj-y += iothread.o
stub-obj-y += iothread-lock.o
stub-obj-y += is-daemonized.o
stub-obj-y += machine-init-done.o

stubs/iothread.c

0 → 100644
+8 −0
Original line number Diff line number Diff line
#include "qemu/osdep.h"
#include "block/aio.h"
#include "qemu/main-loop.h"

AioContext *qemu_get_current_aio_context(void)
{
    return qemu_get_aio_context();
}