diff mbox

[2/2] aio: use Linux AIO even if nocache is not specified

Message ID 1311791126-11383-3-git-send-email-freddy77@gmail.com
State New
Headers show

Commit Message

Frediano Ziglio July 27, 2011, 6:25 p.m. UTC
Currently Linux AIO are used only if nocache is specified.
Linux AIO works in all cases. The only problem is that currently Linux AIO
does not align data so I add a test that use POSIX AIO in this case.

Signed-off-by: Frediano Ziglio <freddy77@gmail.com>
---
 block/raw-posix.c |   23 ++++++++++-------------
 1 files changed, 10 insertions(+), 13 deletions(-)

Comments

Christoph Hellwig July 27, 2011, 6:32 p.m. UTC | #1
On Wed, Jul 27, 2011 at 08:25:26PM +0200, Frediano Ziglio wrote:
> Currently Linux AIO are used only if nocache is specified.
> Linux AIO works in all cases. The only problem is that currently Linux AIO
> does not align data so I add a test that use POSIX AIO in this case.

The kernel will accept buffered I/O requests, and even handle them 100%
correctly.  The only thing it won't do is to handle them asynchronously,
so with your patch you're back to executing I/O synchronously in guest
context.
diff mbox

Patch

diff --git a/block/raw-posix.c b/block/raw-posix.c
index 27ae81e..078a256 100644
--- a/block/raw-posix.c
+++ b/block/raw-posix.c
@@ -236,21 +236,16 @@  static int raw_open_common(BlockDriverState *bs, const char *filename,
     }
 
 #ifdef CONFIG_LINUX_AIO
-    if ((bdrv_flags & (BDRV_O_NOCACHE|BDRV_O_NATIVE_AIO)) ==
-                      (BDRV_O_NOCACHE|BDRV_O_NATIVE_AIO)) {
+    s->use_aio = 0;
+    if ((bdrv_flags & BDRV_O_NATIVE_AIO)) {
 
         s->aio_ctx = laio_init();
         if (!s->aio_ctx) {
             goto out_free_buf;
         }
         s->use_aio = 1;
-    } else
-#endif
-    {
-#ifdef CONFIG_LINUX_AIO
-        s->use_aio = 0;
-#endif
     }
+#endif
 
 #ifdef CONFIG_XFS
     if (platform_test_xfs_fd(s->fd)) {
@@ -592,14 +587,16 @@  static BlockDriverAIOCB *raw_aio_submit(BlockDriverState *bs,
     if (s->aligned_buf) {
         if (!qiov_is_aligned(bs, qiov)) {
             type |= QEMU_AIO_MISALIGNED;
-#ifdef CONFIG_LINUX_AIO
-        } else if (s->use_aio) {
-            return laio_submit(bs, s->aio_ctx, s->fd, sector_num, qiov,
-                               nb_sectors, cb, opaque, type);
-#endif
         }
     }
 
+#ifdef CONFIG_LINUX_AIO
+    if (s->use_aio && !(type & QEMU_AIO_MISALIGNED)) {
+        return laio_submit(bs, s->aio_ctx, s->fd, sector_num, qiov,
+                           nb_sectors, cb, opaque, type);
+    }
+#endif
+
     return paio_submit(bs, s->fd, sector_num, qiov, nb_sectors,
                        cb, opaque, type);
 }