linux-aio: poll ring for completions
The Linux AIO userspace ABI includes a ring that is shared with the kernel. This allows userspace programs to process completions without system calls. Add an AioContext poll handler to check for completions in the ring. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Message-id: 20161201192652.9509-6-stefanha@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
0062ea0fd6
commit
ee68697551
|
@ -255,6 +255,20 @@ static void qemu_laio_completion_cb(EventNotifier *e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool qemu_laio_poll_cb(void *opaque)
|
||||||
|
{
|
||||||
|
EventNotifier *e = opaque;
|
||||||
|
LinuxAioState *s = container_of(e, LinuxAioState, e);
|
||||||
|
struct io_event *events;
|
||||||
|
|
||||||
|
if (!io_getevents_peek(s->ctx, &events)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
qemu_laio_process_completions_and_submit(s);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static void laio_cancel(BlockAIOCB *blockacb)
|
static void laio_cancel(BlockAIOCB *blockacb)
|
||||||
{
|
{
|
||||||
struct qemu_laiocb *laiocb = (struct qemu_laiocb *)blockacb;
|
struct qemu_laiocb *laiocb = (struct qemu_laiocb *)blockacb;
|
||||||
|
@ -448,7 +462,8 @@ void laio_attach_aio_context(LinuxAioState *s, AioContext *new_context)
|
||||||
s->aio_context = new_context;
|
s->aio_context = new_context;
|
||||||
s->completion_bh = aio_bh_new(new_context, qemu_laio_completion_bh, s);
|
s->completion_bh = aio_bh_new(new_context, qemu_laio_completion_bh, s);
|
||||||
aio_set_event_notifier(new_context, &s->e, false,
|
aio_set_event_notifier(new_context, &s->e, false,
|
||||||
qemu_laio_completion_cb, NULL);
|
qemu_laio_completion_cb,
|
||||||
|
qemu_laio_poll_cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
LinuxAioState *laio_init(void)
|
LinuxAioState *laio_init(void)
|
||||||
|
|
Loading…
Reference in a new issue