浏览代码

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
aliguori 16 年之前
父节点
当前提交
a95ad7bcbb
共有 1 个文件被更改,包括 14 次插入6 次删除
  1. 14 6
      block.c

+ 14 - 6
block.c

@@ -41,6 +41,8 @@
 #define SECTOR_BITS 9
 #define SECTOR_BITS 9
 #define SECTOR_SIZE (1 << SECTOR_BITS)
 #define SECTOR_SIZE (1 << SECTOR_BITS)
 
 
+static AIOPool vectored_aio_pool;
+
 typedef struct BlockDriverAIOCBSync {
 typedef struct BlockDriverAIOCBSync {
     BlockDriverAIOCB common;
     BlockDriverAIOCB common;
     QEMUBH *bh;
     QEMUBH *bh;
@@ -1333,6 +1335,13 @@ typedef struct VectorTranslationState {
     BlockDriverAIOCB *this_aiocb;
     BlockDriverAIOCB *this_aiocb;
 } VectorTranslationState;
 } 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)
 static void bdrv_aio_rw_vector_cb(void *opaque, int ret)
 {
 {
     VectorTranslationState *s = opaque;
     VectorTranslationState *s = opaque;
@@ -1355,7 +1364,8 @@ static BlockDriverAIOCB *bdrv_aio_rw_vector(BlockDriverState *bs,
 
 
 {
 {
     VectorTranslationState *s = qemu_mallocz(sizeof(*s));
     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->this_aiocb = aiocb;
     s->iov = iov;
     s->iov = iov;
@@ -1444,11 +1454,6 @@ BlockDriverAIOCB *bdrv_aio_write(BlockDriverState *bs, int64_t sector_num,
 
 
 void bdrv_aio_cancel(BlockDriverAIOCB *acb)
 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);
     acb->pool->cancel(acb);
 }
 }
 
 
@@ -1550,6 +1555,9 @@ static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num,
 
 
 void bdrv_init(void)
 void bdrv_init(void)
 {
 {
+    aio_pool_init(&vectored_aio_pool, sizeof(BlockDriverAIOCB),
+                  bdrv_aio_cancel_vector);
+
     bdrv_register(&bdrv_raw);
     bdrv_register(&bdrv_raw);
     bdrv_register(&bdrv_host_device);
     bdrv_register(&bdrv_host_device);
 #ifndef _WIN32
 #ifndef _WIN32