block: drop aio functions that operate on the main AioContext
The main AioContext should be accessed explicitly via qemu_get_aio_context(). Most of the time, using it is not the right thing to do. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
b47ec2c456
commit
87f68d3182
@ -125,7 +125,7 @@ static bool aio_dispatch(AioContext *ctx)
|
|||||||
bool progress = false;
|
bool progress = false;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We have to walk very carefully in case qemu_aio_set_fd_handler is
|
* We have to walk very carefully in case aio_set_fd_handler is
|
||||||
* called while we're walking.
|
* called while we're walking.
|
||||||
*/
|
*/
|
||||||
node = QLIST_FIRST(&ctx->aio_handlers);
|
node = QLIST_FIRST(&ctx->aio_handlers);
|
||||||
@ -183,7 +183,7 @@ bool aio_poll(AioContext *ctx, bool blocking)
|
|||||||
/*
|
/*
|
||||||
* If there are callbacks left that have been queued, we need to call them.
|
* If there are callbacks left that have been queued, we need to call them.
|
||||||
* Do not call select in this case, because it is possible that the caller
|
* Do not call select in this case, because it is possible that the caller
|
||||||
* does not need a complete flush (as is the case for qemu_aio_wait loops).
|
* does not need a complete flush (as is the case for aio_poll loops).
|
||||||
*/
|
*/
|
||||||
if (aio_bh_poll(ctx)) {
|
if (aio_bh_poll(ctx)) {
|
||||||
blocking = false;
|
blocking = false;
|
||||||
|
@ -102,7 +102,7 @@ bool aio_poll(AioContext *ctx, bool blocking)
|
|||||||
/*
|
/*
|
||||||
* If there are callbacks left that have been queued, we need to call then.
|
* If there are callbacks left that have been queued, we need to call then.
|
||||||
* Do not call select in this case, because it is possible that the caller
|
* Do not call select in this case, because it is possible that the caller
|
||||||
* does not need a complete flush (as is the case for qemu_aio_wait loops).
|
* does not need a complete flush (as is the case for aio_poll loops).
|
||||||
*/
|
*/
|
||||||
if (aio_bh_poll(ctx)) {
|
if (aio_bh_poll(ctx)) {
|
||||||
blocking = false;
|
blocking = false;
|
||||||
@ -115,7 +115,7 @@ bool aio_poll(AioContext *ctx, bool blocking)
|
|||||||
/*
|
/*
|
||||||
* Then dispatch any pending callbacks from the GSource.
|
* Then dispatch any pending callbacks from the GSource.
|
||||||
*
|
*
|
||||||
* We have to walk very carefully in case qemu_aio_set_fd_handler is
|
* We have to walk very carefully in case aio_set_fd_handler is
|
||||||
* called while we're walking.
|
* called while we're walking.
|
||||||
*/
|
*/
|
||||||
node = QLIST_FIRST(&ctx->aio_handlers);
|
node = QLIST_FIRST(&ctx->aio_handlers);
|
||||||
@ -177,7 +177,7 @@ bool aio_poll(AioContext *ctx, bool blocking)
|
|||||||
blocking = false;
|
blocking = false;
|
||||||
|
|
||||||
/* we have to walk very carefully in case
|
/* we have to walk very carefully in case
|
||||||
* qemu_aio_set_fd_handler is called while we're walking */
|
* aio_set_fd_handler is called while we're walking */
|
||||||
node = QLIST_FIRST(&ctx->aio_handlers);
|
node = QLIST_FIRST(&ctx->aio_handlers);
|
||||||
while (node) {
|
while (node) {
|
||||||
AioHandler *tmp;
|
AioHandler *tmp;
|
||||||
|
@ -220,7 +220,7 @@ bool aio_poll(AioContext *ctx, bool blocking);
|
|||||||
#ifdef CONFIG_POSIX
|
#ifdef CONFIG_POSIX
|
||||||
/* Register a file descriptor and associated callbacks. Behaves very similarly
|
/* Register a file descriptor and associated callbacks. Behaves very similarly
|
||||||
* to qemu_set_fd_handler2. Unlike qemu_set_fd_handler2, these callbacks will
|
* to qemu_set_fd_handler2. Unlike qemu_set_fd_handler2, these callbacks will
|
||||||
* be invoked when using qemu_aio_wait().
|
* be invoked when using aio_poll().
|
||||||
*
|
*
|
||||||
* Code that invokes AIO completion functions should rely on this function
|
* Code that invokes AIO completion functions should rely on this function
|
||||||
* instead of qemu_set_fd_handler[2].
|
* instead of qemu_set_fd_handler[2].
|
||||||
@ -234,7 +234,7 @@ void aio_set_fd_handler(AioContext *ctx,
|
|||||||
|
|
||||||
/* Register an event notifier and associated callbacks. Behaves very similarly
|
/* Register an event notifier and associated callbacks. Behaves very similarly
|
||||||
* to event_notifier_set_handler. Unlike event_notifier_set_handler, these callbacks
|
* to event_notifier_set_handler. Unlike event_notifier_set_handler, these callbacks
|
||||||
* will be invoked when using qemu_aio_wait().
|
* will be invoked when using aio_poll().
|
||||||
*
|
*
|
||||||
* Code that invokes AIO completion functions should rely on this function
|
* Code that invokes AIO completion functions should rely on this function
|
||||||
* instead of event_notifier_set_handler.
|
* instead of event_notifier_set_handler.
|
||||||
@ -251,19 +251,6 @@ GSource *aio_get_g_source(AioContext *ctx);
|
|||||||
/* Return the ThreadPool bound to this AioContext */
|
/* Return the ThreadPool bound to this AioContext */
|
||||||
struct ThreadPool *aio_get_thread_pool(AioContext *ctx);
|
struct ThreadPool *aio_get_thread_pool(AioContext *ctx);
|
||||||
|
|
||||||
/* Functions to operate on the main QEMU AioContext. */
|
|
||||||
|
|
||||||
bool qemu_aio_wait(void);
|
|
||||||
void qemu_aio_set_event_notifier(EventNotifier *notifier,
|
|
||||||
EventNotifierHandler *io_read);
|
|
||||||
|
|
||||||
#ifdef CONFIG_POSIX
|
|
||||||
void qemu_aio_set_fd_handler(int fd,
|
|
||||||
IOHandler *io_read,
|
|
||||||
IOHandler *io_write,
|
|
||||||
void *opaque);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* aio_timer_new:
|
* aio_timer_new:
|
||||||
* @ctx: the aio context
|
* @ctx: the aio context
|
||||||
|
@ -74,7 +74,7 @@ struct BlockJob {
|
|||||||
* Set to true if the job should cancel itself. The flag must
|
* Set to true if the job should cancel itself. The flag must
|
||||||
* always be tested just before toggling the busy flag from false
|
* always be tested just before toggling the busy flag from false
|
||||||
* to true. After a job has been cancelled, it should only yield
|
* to true. After a job has been cancelled, it should only yield
|
||||||
* if #qemu_aio_wait will ("sooner or later") reenter the coroutine.
|
* if #aio_poll will ("sooner or later") reenter the coroutine.
|
||||||
*/
|
*/
|
||||||
bool cancelled;
|
bool cancelled;
|
||||||
|
|
||||||
@ -87,7 +87,7 @@ struct BlockJob {
|
|||||||
/**
|
/**
|
||||||
* Set to false by the job while it is in a quiescent state, where
|
* Set to false by the job while it is in a quiescent state, where
|
||||||
* no I/O is pending and the job has yielded on any condition
|
* no I/O is pending and the job has yielded on any condition
|
||||||
* that is not detected by #qemu_aio_wait, such as a timer.
|
* that is not detected by #aio_poll, such as a timer.
|
||||||
*/
|
*/
|
||||||
bool busy;
|
bool busy;
|
||||||
|
|
||||||
|
@ -212,7 +212,7 @@ void coroutine_fn co_sleep_ns(QEMUClockType type, int64_t ns);
|
|||||||
* Yield the coroutine for a given duration
|
* Yield the coroutine for a given duration
|
||||||
*
|
*
|
||||||
* Behaves similarly to co_sleep_ns(), but the sleeping coroutine will be
|
* Behaves similarly to co_sleep_ns(), but the sleeping coroutine will be
|
||||||
* resumed when using qemu_aio_wait().
|
* resumed when using aio_poll().
|
||||||
*/
|
*/
|
||||||
void coroutine_fn co_aio_sleep_ns(AioContext *ctx, QEMUClockType type,
|
void coroutine_fn co_aio_sleep_ns(AioContext *ctx, QEMUClockType type,
|
||||||
int64_t ns);
|
int64_t ns);
|
||||||
|
21
main-loop.c
21
main-loop.c
@ -498,24 +498,3 @@ QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque)
|
|||||||
{
|
{
|
||||||
return aio_bh_new(qemu_aio_context, cb, opaque);
|
return aio_bh_new(qemu_aio_context, cb, opaque);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool qemu_aio_wait(void)
|
|
||||||
{
|
|
||||||
return aio_poll(qemu_aio_context, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_POSIX
|
|
||||||
void qemu_aio_set_fd_handler(int fd,
|
|
||||||
IOHandler *io_read,
|
|
||||||
IOHandler *io_write,
|
|
||||||
void *opaque)
|
|
||||||
{
|
|
||||||
aio_set_fd_handler(qemu_aio_context, fd, io_read, io_write, opaque);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void qemu_aio_set_event_notifier(EventNotifier *notifier,
|
|
||||||
EventNotifierHandler *io_read)
|
|
||||||
{
|
|
||||||
aio_set_event_notifier(qemu_aio_context, notifier, io_read);
|
|
||||||
}
|
|
||||||
|
@ -83,7 +83,7 @@ static void co_test_cb(void *opaque)
|
|||||||
data->ret = 0;
|
data->ret = 0;
|
||||||
active--;
|
active--;
|
||||||
|
|
||||||
/* The test continues in test_submit_co, after qemu_aio_wait_all... */
|
/* The test continues in test_submit_co, after aio_poll... */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_submit_co(void)
|
static void test_submit_co(void)
|
||||||
@ -98,7 +98,7 @@ static void test_submit_co(void)
|
|||||||
g_assert_cmpint(active, ==, 1);
|
g_assert_cmpint(active, ==, 1);
|
||||||
g_assert_cmpint(data.ret, ==, -EINPROGRESS);
|
g_assert_cmpint(data.ret, ==, -EINPROGRESS);
|
||||||
|
|
||||||
/* qemu_aio_wait_all will execute the rest of the coroutine. */
|
/* aio_poll will execute the rest of the coroutine. */
|
||||||
|
|
||||||
while (data.ret == -EINPROGRESS) {
|
while (data.ret == -EINPROGRESS) {
|
||||||
aio_poll(ctx, true);
|
aio_poll(ctx, true);
|
||||||
|
Loading…
Reference in New Issue
Block a user