[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.