Commit c07a9008ac6985cd5a15909c2b9977d982defc12
1 parent
6bbff9a0
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
Showing
1 changed file
with
14 additions
and
6 deletions
block.c
@@ -47,6 +47,8 @@ | @@ -47,6 +47,8 @@ | ||
47 | #define SECTOR_BITS 9 | 47 | #define SECTOR_BITS 9 |
48 | #define SECTOR_SIZE (1 << SECTOR_BITS) | 48 | #define SECTOR_SIZE (1 << SECTOR_BITS) |
49 | 49 | ||
50 | +static AIOPool vectored_aio_pool; | ||
51 | + | ||
50 | typedef struct BlockDriverAIOCBSync { | 52 | typedef struct BlockDriverAIOCBSync { |
51 | BlockDriverAIOCB common; | 53 | BlockDriverAIOCB common; |
52 | QEMUBH *bh; | 54 | QEMUBH *bh; |
@@ -1261,6 +1263,13 @@ typedef struct VectorTranslationState { | @@ -1261,6 +1263,13 @@ typedef struct VectorTranslationState { | ||
1261 | BlockDriverAIOCB *this_aiocb; | 1263 | BlockDriverAIOCB *this_aiocb; |
1262 | } VectorTranslationState; | 1264 | } VectorTranslationState; |
1263 | 1265 | ||
1266 | +static void bdrv_aio_cancel_vector(BlockDriverAIOCB *acb) | ||
1267 | +{ | ||
1268 | + VectorTranslationState *s = acb->opaque; | ||
1269 | + | ||
1270 | + bdrv_aio_cancel(s->aiocb); | ||
1271 | +} | ||
1272 | + | ||
1264 | static void bdrv_aio_rw_vector_cb(void *opaque, int ret) | 1273 | static void bdrv_aio_rw_vector_cb(void *opaque, int ret) |
1265 | { | 1274 | { |
1266 | VectorTranslationState *s = opaque; | 1275 | VectorTranslationState *s = opaque; |
@@ -1283,7 +1292,8 @@ static BlockDriverAIOCB *bdrv_aio_rw_vector(BlockDriverState *bs, | @@ -1283,7 +1292,8 @@ static BlockDriverAIOCB *bdrv_aio_rw_vector(BlockDriverState *bs, | ||
1283 | 1292 | ||
1284 | { | 1293 | { |
1285 | VectorTranslationState *s = qemu_mallocz(sizeof(*s)); | 1294 | VectorTranslationState *s = qemu_mallocz(sizeof(*s)); |
1286 | - BlockDriverAIOCB *aiocb = qemu_aio_get(bs, cb, opaque); | 1295 | + BlockDriverAIOCB *aiocb = qemu_aio_get_pool(&vectored_aio_pool, bs, |
1296 | + cb, opaque); | ||
1287 | 1297 | ||
1288 | s->this_aiocb = aiocb; | 1298 | s->this_aiocb = aiocb; |
1289 | s->iov = iov; | 1299 | s->iov = iov; |
@@ -1372,11 +1382,6 @@ BlockDriverAIOCB *bdrv_aio_write(BlockDriverState *bs, int64_t sector_num, | @@ -1372,11 +1382,6 @@ BlockDriverAIOCB *bdrv_aio_write(BlockDriverState *bs, int64_t sector_num, | ||
1372 | 1382 | ||
1373 | void bdrv_aio_cancel(BlockDriverAIOCB *acb) | 1383 | void bdrv_aio_cancel(BlockDriverAIOCB *acb) |
1374 | { | 1384 | { |
1375 | - if (acb->cb == bdrv_aio_rw_vector_cb) { | ||
1376 | - VectorTranslationState *s = acb->opaque; | ||
1377 | - acb = s->aiocb; | ||
1378 | - } | ||
1379 | - | ||
1380 | acb->pool->cancel(acb); | 1385 | acb->pool->cancel(acb); |
1381 | } | 1386 | } |
1382 | 1387 | ||
@@ -1478,6 +1483,9 @@ static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num, | @@ -1478,6 +1483,9 @@ static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num, | ||
1478 | 1483 | ||
1479 | void bdrv_init(void) | 1484 | void bdrv_init(void) |
1480 | { | 1485 | { |
1486 | + aio_pool_init(&vectored_aio_pool, sizeof(BlockDriverAIOCB), | ||
1487 | + bdrv_aio_cancel_vector); | ||
1488 | + | ||
1481 | bdrv_register(&bdrv_raw); | 1489 | bdrv_register(&bdrv_raw); |
1482 | bdrv_register(&bdrv_host_device); | 1490 | bdrv_register(&bdrv_host_device); |
1483 | #ifndef _WIN32 | 1491 | #ifndef _WIN32 |