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 | 47 | #define SECTOR_BITS 9 |
| 48 | 48 | #define SECTOR_SIZE (1 << SECTOR_BITS) |
| 49 | 49 | |
| 50 | +static AIOPool vectored_aio_pool; | |
| 51 | + | |
| 50 | 52 | typedef struct BlockDriverAIOCBSync { |
| 51 | 53 | BlockDriverAIOCB common; |
| 52 | 54 | QEMUBH *bh; |
| ... | ... | @@ -1261,6 +1263,13 @@ typedef struct VectorTranslationState { |
| 1261 | 1263 | BlockDriverAIOCB *this_aiocb; |
| 1262 | 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 | 1273 | static void bdrv_aio_rw_vector_cb(void *opaque, int ret) |
| 1265 | 1274 | { |
| 1266 | 1275 | VectorTranslationState *s = opaque; |
| ... | ... | @@ -1283,7 +1292,8 @@ static BlockDriverAIOCB *bdrv_aio_rw_vector(BlockDriverState *bs, |
| 1283 | 1292 | |
| 1284 | 1293 | { |
| 1285 | 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 | 1298 | s->this_aiocb = aiocb; |
| 1289 | 1299 | s->iov = iov; |
| ... | ... | @@ -1372,11 +1382,6 @@ BlockDriverAIOCB *bdrv_aio_write(BlockDriverState *bs, int64_t sector_num, |
| 1372 | 1382 | |
| 1373 | 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 | 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 | 1483 | |
| 1479 | 1484 | void bdrv_init(void) |
| 1480 | 1485 | { |
| 1486 | + aio_pool_init(&vectored_aio_pool, sizeof(BlockDriverAIOCB), | |
| 1487 | + bdrv_aio_cancel_vector); | |
| 1488 | + | |
| 1481 | 1489 | bdrv_register(&bdrv_raw); |
| 1482 | 1490 | bdrv_register(&bdrv_host_device); |
| 1483 | 1491 | #ifndef _WIN32 | ... | ... |