|
@@ -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
|