[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] blktap2: Sort out tapdisk AIO init.
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1264755262 0 # Node ID f2ef85551a09a34acd9931301646ce870bb70e9b # Parent 07f33d1240539effbbb7c1cff55aacff25dfcc50 blktap2: Sort out tapdisk AIO init. Move event callbacks registration into tapdisk-queue. This should also obsoletes the dummy pollfd pipe in the synchronous I/O case. Signed-off-by: Daniel Stodden <daniel.stodden@xxxxxxxxxx> --- tools/blktap2/drivers/io-optimize.c | 7 +++ tools/blktap2/drivers/qcow2raw.c | 6 -- tools/blktap2/drivers/tapdisk-queue.c | 67 +++++++++++++++++++++++---------- tools/blktap2/drivers/tapdisk-queue.h | 4 - tools/blktap2/drivers/tapdisk-server.c | 48 +++++------------------ tools/blktap2/drivers/tapdisk-server.h | 1 6 files changed, 67 insertions(+), 66 deletions(-) diff -r 07f33d124053 -r f2ef85551a09 tools/blktap2/drivers/io-optimize.c --- a/tools/blktap2/drivers/io-optimize.c Fri Jan 29 08:53:52 2010 +0000 +++ b/tools/blktap2/drivers/io-optimize.c Fri Jan 29 08:54:22 2010 +0000 @@ -51,9 +51,16 @@ opio_free(struct opioctx *ctx) opio_free(struct opioctx *ctx) { free(ctx->opios); + ctx->opios = NULL; + free(ctx->free_opios); + ctx->free_opios = NULL; + free(ctx->iocb_queue); + ctx->iocb_queue = NULL; + free(ctx->event_queue); + ctx->event_queue = NULL; } int diff -r 07f33d124053 -r f2ef85551a09 tools/blktap2/drivers/qcow2raw.c --- a/tools/blktap2/drivers/qcow2raw.c Fri Jan 29 08:53:52 2010 +0000 +++ b/tools/blktap2/drivers/qcow2raw.c Fri Jan 29 08:54:22 2010 +0000 @@ -99,12 +99,6 @@ static void print_bytes(void *ptr, int l } DFPRINTF("\n"); return; -} - -void -queue_event(event_id_t id, char mode, void *private) -{ - tapdisk_complete_tiocbs(&server.aio_queue); } static void debug_output(uint64_t progress, uint64_t size) diff -r 07f33d124053 -r f2ef85551a09 tools/blktap2/drivers/tapdisk-queue.c --- a/tools/blktap2/drivers/tapdisk-queue.c Fri Jan 29 08:53:52 2010 +0000 +++ b/tools/blktap2/drivers/tapdisk-queue.c Fri Jan 29 08:54:22 2010 +0000 @@ -35,6 +35,7 @@ #include "tapdisk-log.h" #include "tapdisk-queue.h" #include "tapdisk-filter.h" +#include "tapdisk-server.h" #include "atomicio.h" #define WARN(_f, _a...) tlog_write(TLOG_WARN, _f, ##_a) @@ -46,7 +47,7 @@ * so that we can concurrently poll on synchronous and async descriptors. * This is signalled by passing 1 as the io context to io_setup. */ -#define REQUEST_ASYNC_FD 1 +#define REQUEST_ASYNC_FD ((io_context_t)1) static inline void queue_tiocb(struct tqueue *queue, struct tiocb *tiocb) @@ -220,6 +221,8 @@ io_synchronous_rw(struct tqueue *queue) return split; } +static void tapdisk_tiocb_event(event_id_t id, char mode, void *private); + int tapdisk_init_queue(struct tqueue *queue, int size, int sync, struct tfilter *filter) @@ -232,18 +235,18 @@ tapdisk_init_queue(struct tqueue *queue, queue->sync = sync; queue->filter = filter; - if (sync) { - /* set up a pipe so we can return - * a poll fd that won't fire. */ - if (pipe(queue->dummy_pipe)) - return -errno; - queue->poll_fd = queue->dummy_pipe[0]; - } else { - queue->aio_ctx = (io_context_t)REQUEST_ASYNC_FD; + queue->event = -1; + queue->aio_ctx = NULL; + + if (!size) + return 0; + + if (!sync) { + queue->aio_ctx = REQUEST_ASYNC_FD; queue->poll_fd = io_setup(size, &queue->aio_ctx); - - if (queue->poll_fd < 0) { - if (queue->poll_fd == -EAGAIN) + err = queue->poll_fd; + if (err < 0) { + if (err == -EAGAIN) DPRINTF("Couldn't setup AIO context. If you " "are trying to concurrently use a " "large number of blktap-based disks, " @@ -256,8 +259,19 @@ tapdisk_init_queue(struct tqueue *queue, "support. This is probably because " "your kernel does not have the " "aio-poll patch applied.\n"); - return queue->poll_fd; + queue->aio_ctx = NULL; + goto fail; } + + queue->event = + tapdisk_server_register_event(SCHEDULER_POLL_READ_FD, + queue->poll_fd, 0, + tapdisk_tiocb_event, + queue); + err = queue->event; + if (err < 0) + goto fail; + } err = -ENOMEM; @@ -280,14 +294,22 @@ void void tapdisk_free_queue(struct tqueue *queue) { - if (queue->sync) { - close(queue->dummy_pipe[0]); - close(queue->dummy_pipe[1]); - } else + if (queue->event >= 0) { + tapdisk_server_unregister_event(queue->event); + queue->event = -1; + } + + if (queue->aio_ctx) { io_destroy(queue->aio_ctx); + queue->aio_ctx = NULL; + } free(queue->iocbs); + queue->iocbs = NULL; + free(queue->aio_events); + queue->aio_events = NULL; + opio_free(&queue->opioctx); } @@ -390,7 +412,7 @@ tapdisk_submit_all_tiocbs(struct tqueue return submitted; } -int +static void tapdisk_complete_tiocbs(struct tqueue *queue) { int i, ret, split; @@ -415,8 +437,13 @@ tapdisk_complete_tiocbs(struct tqueue *q } queue_deferred_tiocbs(queue); - - return split; +} + +static void +tapdisk_tiocb_event(event_id_t id, char mode, void *private) +{ + struct tqueue *queue = private; + tapdisk_complete_tiocbs(queue); } /* diff -r 07f33d124053 -r f2ef85551a09 tools/blktap2/drivers/tapdisk-queue.h --- a/tools/blktap2/drivers/tapdisk-queue.h Fri Jan 29 08:53:52 2010 +0000 +++ b/tools/blktap2/drivers/tapdisk-queue.h Fri Jan 29 08:54:22 2010 +0000 @@ -32,6 +32,7 @@ #include <libaio.h> #include "io-optimize.h" +#include "scheduler.h" struct tiocb; struct tfilter; @@ -57,9 +58,9 @@ struct tqueue { int sync; int poll_fd; + event_id_t event; io_context_t aio_ctx; struct opioctx opioctx; - int dummy_pipe[2]; int queued; struct iocb **iocbs; @@ -104,7 +105,6 @@ void tapdisk_queue_tiocb(struct tqueue * void tapdisk_queue_tiocb(struct tqueue *, struct tiocb *); int tapdisk_submit_tiocbs(struct tqueue *); int tapdisk_submit_all_tiocbs(struct tqueue *); -int tapdisk_complete_tiocbs(struct tqueue *); int tapdisk_cancel_tiocbs(struct tqueue *); int tapdisk_cancel_all_tiocbs(struct tqueue *); void tapdisk_prep_tiocb(struct tiocb *, int, int, char *, size_t, diff -r 07f33d124053 -r f2ef85551a09 tools/blktap2/drivers/tapdisk-server.c --- a/tools/blktap2/drivers/tapdisk-server.c Fri Jan 29 08:53:52 2010 +0000 +++ b/tools/blktap2/drivers/tapdisk-server.c Fri Jan 29 08:54:22 2010 +0000 @@ -221,19 +221,6 @@ tapdisk_server_send_error(const char *me tapdisk_ipc_write_error(&vbd->ipc, message); } -static void -tapdisk_server_aio_queue_event(event_id_t id, char mode, void *private) -{ - tapdisk_complete_tiocbs(&server.aio_queue); -} - -static void -tapdisk_server_free_aio_queue(void) -{ - tapdisk_server_unregister_event(server.aio_queue_event_id); - tapdisk_free_queue(&server.aio_queue); -} - static int tapdisk_server_init_ipc(const char *read, const char *write) { @@ -247,34 +234,21 @@ tapdisk_server_close_ipc(void) } static int -tapdisk_server_initialize_aio_queue(void) -{ - int err; - event_id_t id; - - err = tapdisk_init_queue(&server.aio_queue, - TAPDISK_TIOCBS, 0, NULL); - if (err) - return err; - - id = tapdisk_server_register_event(SCHEDULER_POLL_READ_FD, - server.aio_queue.poll_fd, 0, - tapdisk_server_aio_queue_event, - NULL); - if (id < 0) { - tapdisk_free_queue(&server.aio_queue); - return id; - } - - server.aio_queue_event_id = id; - - return 0; +tapdisk_server_init_aio(void) +{ + return tapdisk_init_queue(&server.aio_queue, TAPDISK_TIOCBS, 0, NULL); +} + +static void +tapdisk_server_close_aio(void) +{ + tapdisk_free_queue(&server.aio_queue); } static void tapdisk_server_close(void) { - tapdisk_server_free_aio_queue(); + tapdisk_server_close_aio(); tapdisk_server_close_ipc(); } @@ -341,7 +315,7 @@ tapdisk_server_initialize(const char *re if (err) goto fail; - err = tapdisk_server_initialize_aio_queue(); + err = tapdisk_server_init_aio(); if (err) goto fail; diff -r 07f33d124053 -r f2ef85551a09 tools/blktap2/drivers/tapdisk-server.h --- a/tools/blktap2/drivers/tapdisk-server.h Fri Jan 29 08:53:52 2010 +0000 +++ b/tools/blktap2/drivers/tapdisk-server.h Fri Jan 29 08:54:22 2010 +0000 @@ -58,7 +58,6 @@ typedef struct tapdisk_server { struct list_head vbds; scheduler_t scheduler; struct tqueue aio_queue; - event_id_t aio_queue_event_id; } tapdisk_server_t; #endif _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |