|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 02 of 21 RESEND] blktap3/drivers: Introduce I/O optimisation routines
This patch copies files io-optimize.[ch] from blktap2 (with changes coming from
blktap2.5). I haven't looked thoroughly into them, they seem to contain
functionality for optimising the processing of I/O requests, e.g. merging of
requests etc.
Signed-off-by: Thanos Makatos <thanos.makatos@xxxxxxxxxx>
diff --git a/tools/blktap2/drivers/io-optimize.c
b/tools/blktap3/drivers/io-optimize.c
copy from tools/blktap2/drivers/io-optimize.c
copy to tools/blktap3/drivers/io-optimize.c
--- a/tools/blktap2/drivers/io-optimize.c
+++ b/tools/blktap3/drivers/io-optimize.c
@@ -1,5 +1,7 @@
/*
- * Copyright (c) 2008, XenSource Inc.
+ * Copyright (c) 2007, XenSource Inc.
+ * Copyright (c) 2010, Citrix Systems, Inc.
+ *
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -44,11 +46,7 @@
#define DBG(ctx, f, a...) ((void)0)
#endif
-static void print_merged_iocbs(struct opioctx *ctx,
- struct iocb **iocbs, int num_iocbs);
-
-void
-opio_free(struct opioctx *ctx)
+void opio_free(struct opioctx *ctx)
{
free(ctx->opios);
ctx->opios = NULL;
@@ -214,12 +212,48 @@ merge(struct opioctx *ctx, struct iocb *
return merge_tail(ctx, head, io);
}
-int
-io_merge(struct opioctx *ctx, struct iocb **queue, int num)
+#if (defined(TEST) || defined(DEBUG))
+static void
+print_optimized_iocbs(struct opioctx *ctx, struct opio *op, int *cnt)
+{
+ char pref[10];
+
+ while (op) {
+ snprintf(pref, 10, " %d: ", (*cnt)++);
+ __print_iocb(ctx, op->iocb, pref);
+ op = op->next;
+ }
+}
+
+static void
+print_merged_iocbs(struct opioctx *ctx, struct iocb **iocbs, int num_iocbs)
+{
+ int i, cnt;
+ char pref[10];
+ struct iocb *io;
+ struct opio *op;
+
+ DBG(ctx, "merged iocbs:\n");
+ for (i = 0, cnt = 0; i < num_iocbs; i++) {
+ io = iocbs[i];
+ snprintf(pref, 10, "%d: ", cnt++);
+ __print_iocb(ctx, io, pref);
+
+ if (iocb_optimized(ctx, io)) {
+ op = (struct opio *) io->data;
+ print_optimized_iocbs(ctx, op->next, &cnt);
+ }
+ }
+}
+#else
+#define print_optimized_iocbs(...)
+#define print_merged_iocbs(...)
+#endif
+
+int io_merge(struct opioctx *ctx, struct iocb **queue, int num)
{
int i, on_queue;
struct iocb *io, **q;
- struct opio *ophead;
if (!num)
return 0;
@@ -234,9 +268,7 @@ io_merge(struct opioctx *ctx, struct ioc
queue[++on_queue] = io;
}
-#if (defined(TEST) || defined(DEBUG))
print_merged_iocbs(ctx, queue, on_queue + 1);
-#endif
return ++on_queue;
}
@@ -346,80 +378,20 @@ io_split(struct opioctx *ctx, struct io_
debug print functions
******************************************************************************/
static inline void
-__print_iocb(struct opioctx *ctx, struct iocb *io, char *prefix)
+__print_iocb(struct opioctx *ctx __attribute__((unused)),
+ struct iocb *io __attribute__((unused)),
+ char *prefix __attribute__((unused)))
{
- char *type;
-
- type = (io->aio_lio_opcode == IO_CMD_PREAD ? "read" : "write");
-
- DBG(ctx, "%soff: %08llx, nbytes: %04lx, buf: %p, type: %s, data: %08lx,"
+ DBG(ctx,
+ "%soff: %08llx, nbytes: %04lx, buf: %p, type: %s, data: %08lx,"
" optimized: %d\n", prefix, io->u.c.offset, io->u.c.nbytes,
- io->u.c.buf, type, (unsigned long)io->data,
- iocb_optimized(ctx, io));
+ io->u.c.buf,
+ (io->aio_lio_opcode == IO_CMD_PREAD ? "read" : "write"),
+ (unsigned long) io->data, iocb_optimized(ctx, io));
}
-static char *null_prefix = "";
-#define print_iocb(ctx, io) __print_iocb(ctx, io, null_prefix)
+#define print_iocb(ctx, io) __print_iocb(ctx, io, "")
-static void
-print_iocbs(struct opioctx *ctx, struct iocb **iocbs, int num_iocbs)
-{
- int i;
- char pref[10];
- struct iocb *io;
-
- DBG(ctx, "iocbs:\n");
- for (i = 0; i < num_iocbs; i++) {
- io = iocbs[i];
- snprintf(pref, 10, "%d: ", i);
- __print_iocb(ctx, io, pref);
- }
-}
-
-static void
-print_optimized_iocbs(struct opioctx *ctx, struct opio *op, int *cnt)
-{
- char pref[10];
-
- while (op) {
- snprintf(pref, 10, " %d: ", (*cnt)++);
- __print_iocb(ctx, op->iocb, pref);
- op = op->next;
- }
-}
-
-static void
-print_merged_iocbs(struct opioctx *ctx, struct iocb **iocbs, int num_iocbs)
-{
- int i, cnt;
- char pref[10];
- struct iocb *io;
- struct opio *op;
-
- DBG(ctx, "merged iocbs:\n");
- for (i = 0, cnt = 0; i < num_iocbs; i++) {
- io = iocbs[i];
- snprintf(pref, 10, "%d: ", cnt++);
- __print_iocb(ctx, io, pref);
-
- if (iocb_optimized(ctx, io)) {
- op = (struct opio *)io->data;
- print_optimized_iocbs(ctx, op->next, &cnt);
- }
- }
-}
-
-static void
-print_events(struct opioctx *ctx, struct io_event *events, int num_events)
-{
- int i;
- struct iocb *io;
-
- for (i = 0; i < num_events; i++) {
- io = events[i].obj;
- print_iocb(ctx, io);
- }
-}
/******************************************************************************
end debug print functions
******************************************************************************/
@@ -571,8 +543,34 @@ init_optest(struct iocb *iocb_list,
iocbs[i] = &iocb_list[i];
}
-int
-main(int argc, char **argv)
+static void
+print_iocbs(struct opioctx *ctx, struct iocb **iocbs, int num_iocbs)
+{
+ int i;
+ char pref[10];
+ struct iocb *io;
+
+ DBG(ctx, "iocbs:\n");
+ for (i = 0; i < num_iocbs; i++) {
+ io = iocbs[i];
+ snprintf(pref, 10, "%d: ", i);
+ __print_iocb(ctx, io, pref);
+ }
+}
+
+static void
+print_events(struct opioctx *ctx, struct io_event *events, int num_events)
+{
+ int i;
+ struct iocb *io;
+
+ for (i = 0; i < num_events; i++) {
+ io = events[i].obj;
+ print_iocb(ctx, io);
+ }
+}
+
+int main(int argc, char **argv)
{
uint64_t num_secs;
struct opioctx ctx;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |