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 20/29] block: Add bdrv_co_readv/writev
Date: Wed,  3 Aug 2011 16:14:15 +0200	[thread overview]
Message-ID: <1312380864-15605-21-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1312380864-15605-1-git-send-email-kwolf@redhat.com>

Add new block driver callbacks bdrv_co_readv/writev, which work on a
QEMUIOVector like bdrv_aio_*, but don't need a callback. The function may only
be called inside a coroutine, so a block driver implementing this interface can
yield instead of blocking during I/O.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 Makefile.objs |    2 +-
 block.c       |   45 +++++++++++++++++++++++++++++++++++++++++++++
 block.h       |    5 +++++
 block_int.h   |    6 ++++++
 trace-events  |    2 ++
 5 files changed, 59 insertions(+), 1 deletions(-)

diff --git a/Makefile.objs b/Makefile.objs
index 5679e1f..9549e2a 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -25,6 +25,7 @@ coroutine-obj-$(CONFIG_WIN32) += coroutine-win32.o
 
 block-obj-y = cutils.o cache-utils.o qemu-malloc.o qemu-option.o module.o async.o
 block-obj-y += nbd.o block.o aio.o aes.o qemu-config.o qemu-progress.o qemu-sockets.o
+block-obj-y += $(coroutine-obj-y)
 block-obj-$(CONFIG_POSIX) += posix-aio-compat.o
 block-obj-$(CONFIG_LINUX_AIO) += linux-aio.o
 
@@ -79,7 +80,6 @@ common-obj-y += readline.o console.o cursor.o qemu-error.o
 common-obj-y += $(oslib-obj-y)
 common-obj-$(CONFIG_WIN32) += os-win32.o
 common-obj-$(CONFIG_POSIX) += os-posix.o
-common-obj-y += $(coroutine-obj-y)
 
 common-obj-y += tcg-runtime.o host-utils.o
 common-obj-y += irq.o ioport.o input.o
diff --git a/block.c b/block.c
index 4c66b2c..1329299 100644
--- a/block.c
+++ b/block.c
@@ -1110,6 +1110,51 @@ int bdrv_pwrite_sync(BlockDriverState *bs, int64_t offset,
     return 0;
 }
 
+int coroutine_fn bdrv_co_readv(BlockDriverState *bs, int64_t sector_num,
+    int nb_sectors, QEMUIOVector *qiov)
+{
+    BlockDriver *drv = bs->drv;
+
+    trace_bdrv_co_readv(bs, sector_num, nb_sectors);
+
+    if (!drv) {
+        return -ENOMEDIUM;
+    }
+    if (bdrv_check_request(bs, sector_num, nb_sectors)) {
+        return -EIO;
+    }
+
+    return drv->bdrv_co_readv(bs, sector_num, nb_sectors, qiov);
+}
+
+int coroutine_fn bdrv_co_writev(BlockDriverState *bs, int64_t sector_num,
+    int nb_sectors, QEMUIOVector *qiov)
+{
+    BlockDriver *drv = bs->drv;
+
+    trace_bdrv_co_writev(bs, sector_num, nb_sectors);
+
+    if (!bs->drv) {
+        return -ENOMEDIUM;
+    }
+    if (bs->read_only) {
+        return -EACCES;
+    }
+    if (bdrv_check_request(bs, sector_num, nb_sectors)) {
+        return -EIO;
+    }
+
+    if (bs->dirty_bitmap) {
+        set_dirty_bitmap(bs, sector_num, nb_sectors, 1);
+    }
+
+    if (bs->wr_highest_sector < sector_num + nb_sectors - 1) {
+        bs->wr_highest_sector = sector_num + nb_sectors - 1;
+    }
+
+    return drv->bdrv_co_writev(bs, sector_num, nb_sectors, qiov);
+}
+
 /**
  * Truncate file to 'offset' bytes (needed only for file protocols)
  */
diff --git a/block.h b/block.h
index e672bc6..a3bfaaf 100644
--- a/block.h
+++ b/block.h
@@ -4,6 +4,7 @@
 #include "qemu-aio.h"
 #include "qemu-common.h"
 #include "qemu-option.h"
+#include "qemu-coroutine.h"
 #include "qobject.h"
 
 /* block.c */
@@ -85,6 +86,10 @@ int bdrv_pwrite(BlockDriverState *bs, int64_t offset,
                 const void *buf, int count);
 int bdrv_pwrite_sync(BlockDriverState *bs, int64_t offset,
     const void *buf, int count);
+int coroutine_fn bdrv_co_readv(BlockDriverState *bs, int64_t sector_num,
+    int nb_sectors, QEMUIOVector *qiov);
+int coroutine_fn bdrv_co_writev(BlockDriverState *bs, int64_t sector_num,
+    int nb_sectors, QEMUIOVector *qiov);
 int bdrv_truncate(BlockDriverState *bs, int64_t offset);
 int64_t bdrv_getlength(BlockDriverState *bs);
 int64_t bdrv_get_allocated_file_size(BlockDriverState *bs);
diff --git a/block_int.h b/block_int.h
index efefbee..f6d02b3 100644
--- a/block_int.h
+++ b/block_int.h
@@ -27,6 +27,7 @@
 #include "block.h"
 #include "qemu-option.h"
 #include "qemu-queue.h"
+#include "qemu-coroutine.h"
 
 #define BLOCK_FLAG_ENCRYPT	1
 #define BLOCK_FLAG_COMPAT6	4
@@ -77,6 +78,11 @@ struct BlockDriver {
     int (*bdrv_discard)(BlockDriverState *bs, int64_t sector_num,
                         int nb_sectors);
 
+    int coroutine_fn (*bdrv_co_readv)(BlockDriverState *bs,
+        int64_t sector_num, int nb_sectors, QEMUIOVector *qiov);
+    int coroutine_fn (*bdrv_co_writev)(BlockDriverState *bs,
+        int64_t sector_num, int nb_sectors, QEMUIOVector *qiov);
+
     int (*bdrv_aio_multiwrite)(BlockDriverState *bs, BlockRequest *reqs,
         int num_reqs);
     int (*bdrv_merge_requests)(BlockDriverState *bs, BlockRequest* a,
diff --git a/trace-events b/trace-events
index 136f775..46bceca 100644
--- a/trace-events
+++ b/trace-events
@@ -66,6 +66,8 @@ disable bdrv_aio_flush(void *bs, void *opaque) "bs %p opaque %p"
 disable bdrv_aio_readv(void *bs, int64_t sector_num, int nb_sectors, void *opaque) "bs %p sector_num %"PRId64" nb_sectors %d opaque %p"
 disable bdrv_aio_writev(void *bs, int64_t sector_num, int nb_sectors, void *opaque) "bs %p sector_num %"PRId64" nb_sectors %d opaque %p"
 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"
 
 # 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 ` Kevin Wolf [this message]
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 ` [Qemu-devel] [PATCH 22/29] block: Add bdrv_co_readv/writev emulation Kevin Wolf
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-21-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).