summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162>2009-03-20 18:26:03 +0000
committerAnthony Liguori <aliguori@us.ibm.com>2009-05-01 11:06:04 -0500
commita95ad7bcbb66fcce022d010f8614905fd24f00a4 (patch)
tree0e2dbeb30b3c57f2694e0d53e75f902c54eb219e
parent3d2d1e3960489d472f6c0dbf7fbd00fdc8125139 (diff)
downloadqemu-a95ad7bcbb66fcce022d010f8614905fd24f00a4.tar.gz
Convert vectored aio emulation to use a dedicated pool (Avi Kivity)
This allows us to remove a hack in the vectored aio cancellation code. Signed-off-by: Avi Kivity <avi@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6871 c046a42c-6fe2-441c-8c8c-71466251a162
-rw-r--r--block.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/block.c b/block.c
index 1aa3de573b..465a09f9bd 100644
--- a/block.c
+++ b/block.c
@@ -41,6 +41,8 @@
#define SECTOR_BITS 9
#define SECTOR_SIZE (1 << SECTOR_BITS)
+static AIOPool vectored_aio_pool;
+
typedef struct BlockDriverAIOCBSync {
BlockDriverAIOCB common;
QEMUBH *bh;
@@ -1333,6 +1335,13 @@ typedef struct VectorTranslationState {
BlockDriverAIOCB *this_aiocb;
} VectorTranslationState;
+static void bdrv_aio_cancel_vector(BlockDriverAIOCB *acb)
+{
+ VectorTranslationState *s = acb->opaque;
+
+ bdrv_aio_cancel(s->aiocb);
+}
+
static void bdrv_aio_rw_vector_cb(void *opaque, int ret)
{
VectorTranslationState *s = opaque;
@@ -1355,7 +1364,8 @@ static BlockDriverAIOCB *bdrv_aio_rw_vector(BlockDriverState *bs,
{
VectorTranslationState *s = qemu_mallocz(sizeof(*s));
- BlockDriverAIOCB *aiocb = qemu_aio_get(bs, cb, opaque);
+ BlockDriverAIOCB *aiocb = qemu_aio_get_pool(&vectored_aio_pool, bs,
+ cb, opaque);
s->this_aiocb = aiocb;
s->iov = iov;
@@ -1444,11 +1454,6 @@ BlockDriverAIOCB *bdrv_aio_write(BlockDriverState *bs, int64_t sector_num,
void bdrv_aio_cancel(BlockDriverAIOCB *acb)
{
- if (acb->cb == bdrv_aio_rw_vector_cb) {
- VectorTranslationState *s = acb->opaque;
- acb = s->aiocb;
- }
-
acb->pool->cancel(acb);
}
@@ -1550,6 +1555,9 @@ static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num,
void bdrv_init(void)
{
+ aio_pool_init(&vectored_aio_pool, sizeof(BlockDriverAIOCB),
+ bdrv_aio_cancel_vector);
+
bdrv_register(&bdrv_raw);
bdrv_register(&bdrv_host_device);
#ifndef _WIN32