qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: anthony@codemonkey.ws
Cc: kwolf@redhat.com, qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH 22/29] block: Add bdrv_co_readv/writev emulation
Date: Wed,  3 Aug 2011 16:14:17 +0200	[thread overview]
Message-ID: <1312380864-15605-23-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1312380864-15605-1-git-send-email-kwolf@redhat.com>

In order to be able to call bdrv_co_readv/writev for drivers that don't
implement the functions natively, add an emulation that uses the AIO functions
to implement them.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 block.c      |   83 ++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 trace-events |    1 +
 2 files changed, 76 insertions(+), 8 deletions(-)

diff --git a/block.c b/block.c
index 0d973e6..e6abea8 100644
--- a/block.c
+++ b/block.c
@@ -64,6 +64,12 @@ static BlockDriverAIOCB *bdrv_co_aio_readv_em(BlockDriverState *bs,
 static BlockDriverAIOCB *bdrv_co_aio_writev_em(BlockDriverState *bs,
         int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
         BlockDriverCompletionFunc *cb, void *opaque);
+static int coroutine_fn bdrv_co_readv_em(BlockDriverState *bs,
+                                         int64_t sector_num, int nb_sectors,
+                                         QEMUIOVector *iov);
+static int coroutine_fn bdrv_co_writev_em(BlockDriverState *bs,
+                                         int64_t sector_num, int nb_sectors,
+                                         QEMUIOVector *iov);
 
 static QTAILQ_HEAD(, BlockDriverState) bdrv_states =
     QTAILQ_HEAD_INITIALIZER(bdrv_states);
@@ -182,14 +188,19 @@ void bdrv_register(BlockDriver *bdrv)
         bdrv->bdrv_aio_writev = bdrv_co_aio_writev_em;
         bdrv->bdrv_read = bdrv_read_em;
         bdrv->bdrv_write = bdrv_write_em;
-     } else if (!bdrv->bdrv_aio_readv) {
-        /* add AIO emulation layer */
-        bdrv->bdrv_aio_readv = bdrv_aio_readv_em;
-        bdrv->bdrv_aio_writev = bdrv_aio_writev_em;
-    } else if (!bdrv->bdrv_read) {
-        /* add synchronous IO emulation layer */
-        bdrv->bdrv_read = bdrv_read_em;
-        bdrv->bdrv_write = bdrv_write_em;
+     } else {
+        bdrv->bdrv_co_readv = bdrv_co_readv_em;
+        bdrv->bdrv_co_writev = bdrv_co_writev_em;
+
+        if (!bdrv->bdrv_aio_readv) {
+            /* add AIO emulation layer */
+            bdrv->bdrv_aio_readv = bdrv_aio_readv_em;
+            bdrv->bdrv_aio_writev = bdrv_aio_writev_em;
+        } else if (!bdrv->bdrv_read) {
+            /* add synchronous IO emulation layer */
+            bdrv->bdrv_read = bdrv_read_em;
+            bdrv->bdrv_write = bdrv_write_em;
+        }
     }
 
     if (!bdrv->bdrv_aio_flush)
@@ -2856,6 +2867,62 @@ void qemu_aio_release(void *p)
 }
 
 /**************************************************************/
+/* Coroutine block device emulation */
+
+typedef struct CoroutineIOCompletion {
+    Coroutine *coroutine;
+    int ret;
+} CoroutineIOCompletion;
+
+static void bdrv_co_io_em_complete(void *opaque, int ret)
+{
+    CoroutineIOCompletion *co = opaque;
+
+    co->ret = ret;
+    qemu_coroutine_enter(co->coroutine, NULL);
+}
+
+static int coroutine_fn bdrv_co_io_em(BlockDriverState *bs, int64_t sector_num,
+                                      int nb_sectors, QEMUIOVector *iov,
+                                      bool is_write)
+{
+    CoroutineIOCompletion co = {
+        .coroutine = qemu_coroutine_self(),
+    };
+    BlockDriverAIOCB *acb;
+
+    if (is_write) {
+        acb = bdrv_aio_writev(bs, sector_num, iov, nb_sectors,
+                              bdrv_co_io_em_complete, &co);
+    } else {
+        acb = bdrv_aio_readv(bs, sector_num, iov, nb_sectors,
+                             bdrv_co_io_em_complete, &co);
+    }
+
+    trace_bdrv_co_io(is_write, acb);
+    if (!acb) {
+        return -EIO;
+    }
+    qemu_coroutine_yield();
+
+    return co.ret;
+}
+
+static int coroutine_fn bdrv_co_readv_em(BlockDriverState *bs,
+                                         int64_t sector_num, int nb_sectors,
+                                         QEMUIOVector *iov)
+{
+    return bdrv_co_io_em(bs, sector_num, nb_sectors, iov, false);
+}
+
+static int coroutine_fn bdrv_co_writev_em(BlockDriverState *bs,
+                                         int64_t sector_num, int nb_sectors,
+                                         QEMUIOVector *iov)
+{
+    return bdrv_co_io_em(bs, sector_num, nb_sectors, iov, true);
+}
+
+/**************************************************************/
 /* removable device support */
 
 /**
diff --git a/trace-events b/trace-events
index 46bceca..bc9be30 100644
--- a/trace-events
+++ b/trace-events
@@ -68,6 +68,7 @@ disable bdrv_aio_writev(void *bs, int64_t sector_num, int nb_sectors, void *opaq
 disable bdrv_set_locked(void *bs, int locked) "bs %p locked %d"
 disable bdrv_co_readv(void *bs, int64_t sector_num, int nb_sector) "bs %p sector_num %"PRId64" nb_sectors %d"
 disable bdrv_co_writev(void *bs, int64_t sector_num, int nb_sector) "bs %p sector_num %"PRId64" nb_sectors %d"
+disable bdrv_co_io(int is_write, void *acb) "is_write %d acb %p"
 
 # hw/virtio-blk.c
 disable virtio_blk_req_complete(void *req, int status) "req %p status %d"
-- 
1.7.6

  parent reply	other threads:[~2011-08-03 14:12 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-08-03 14:13 [Qemu-devel] [PULL 00/29] Block patches Kevin Wolf
2011-08-03 14:13 ` [Qemu-devel] [PATCH 01/29] blockdev: Make eject fail for non-removable drives even with -f Kevin Wolf
2011-08-03 14:13 ` [Qemu-devel] [PATCH 02/29] block: Reset device model callbacks on detach Kevin Wolf
2011-08-03 14:13 ` [Qemu-devel] [PATCH 03/29] block/raw-win32: Drop disabled code for removable host devices Kevin Wolf
2011-08-03 14:13 ` [Qemu-devel] [PATCH 04/29] block: Make BlockDriver method bdrv_set_locked() return void Kevin Wolf
2011-08-03 14:14 ` [Qemu-devel] [PATCH 05/29] block: Make BlockDriver method bdrv_eject() " Kevin Wolf
2011-08-03 14:14 ` [Qemu-devel] [PATCH 06/29] block: Don't let locked flag prevent medium load Kevin Wolf
2011-08-03 14:14 ` [Qemu-devel] [PATCH 07/29] block/vpc.c: Detect too-large vpc file Kevin Wolf
2011-08-03 14:14 ` [Qemu-devel] [PATCH 08/29] scsi-disk: Codingstyle fixes Kevin Wolf
2011-08-03 14:14 ` [Qemu-devel] [PATCH 09/29] scsi: Remove references to SET_WINDOW Kevin Wolf
2011-08-03 14:14 ` [Qemu-devel] [PATCH 10/29] scsi: Remove REZERO_UNIT emulation Kevin Wolf
2011-08-03 14:14 ` [Qemu-devel] [PATCH 11/29] scsi: Sanitize command definitions Kevin Wolf
2011-08-03 14:14 ` [Qemu-devel] [PATCH 12/29] scsi-disk: Remove 'drive_kind' Kevin Wolf
2011-08-03 14:14 ` [Qemu-devel] [PATCH 13/29] block: Removed unused function bdrv_write_sync Kevin Wolf
2011-08-03 14:14 ` [Qemu-devel] [PATCH 14/29] raw-posix: Typo fix Kevin Wolf
2011-08-03 14:14 ` [Qemu-devel] [PATCH 15/29] raw-posix: Always check paio_init result Kevin Wolf
2011-08-03 14:14 ` [Qemu-devel] [PATCH 16/29] coroutine: introduce coroutines Kevin Wolf
2011-08-03 14:14 ` [Qemu-devel] [PATCH 17/29] coroutine: implement coroutines using gthread Kevin Wolf
2011-08-03 14:14 ` [Qemu-devel] [PATCH 18/29] coroutine: add test-coroutine automated tests Kevin Wolf
2011-08-03 14:14 ` [Qemu-devel] [PATCH 19/29] coroutine: add test-coroutine --benchmark-lifecycle Kevin Wolf
2011-08-03 14:14 ` [Qemu-devel] [PATCH 20/29] block: Add bdrv_co_readv/writev Kevin Wolf
2011-08-03 14:14 ` [Qemu-devel] [PATCH 21/29] block: Emulate AIO functions with bdrv_co_readv/writev Kevin Wolf
2011-08-03 14:14 ` Kevin Wolf [this message]
2011-08-03 14:14 ` [Qemu-devel] [PATCH 23/29] coroutines: Locks Kevin Wolf
2011-08-03 14:14 ` [Qemu-devel] [PATCH 24/29] qcow2: Use coroutines Kevin Wolf
2011-08-03 14:14 ` [Qemu-devel] [PATCH 25/29] qcow: " Kevin Wolf
2011-08-03 14:14 ` [Qemu-devel] [PATCH 26/29] async: Remove AsyncContext Kevin Wolf
2011-08-03 14:14 ` [Qemu-devel] [PATCH 27/29] coroutines: Use one global bottom half for CoQueue Kevin Wolf
2011-08-03 14:14 ` [Qemu-devel] [PATCH 28/29] posix-aio-compat: Allow read after EOF Kevin Wolf
2011-08-03 14:14 ` [Qemu-devel] [PATCH 29/29] block: Use bdrv_co_* instead of synchronous versions in coroutines Kevin Wolf
2011-08-04 22:07 ` [Qemu-devel] [PULL 00/29] Block patches Anthony Liguori

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1312380864-15605-23-git-send-email-kwolf@redhat.com \
    --to=kwolf@redhat.com \
    --cc=anthony@codemonkey.ws \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).