Commit 3fb94d56c6adc96ffc4a81b58c752cc4ccfae39c

Authored by aliguori
1 parent 6512a2a7

Use vectored aiocb storage to store vector translation state (Avi Kivity)

Now that we have a dedicated acb pool for vector translation acbs, we can
store the vector translation state in the acbs instead of in an external
structure.

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@6873 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 14 additions and 15 deletions
@@ -1255,31 +1255,32 @@ char *bdrv_snapshot_dump(char *buf, int buf_size, QEMUSnapshotInfo *sn) @@ -1255,31 +1255,32 @@ char *bdrv_snapshot_dump(char *buf, int buf_size, QEMUSnapshotInfo *sn)
1255 /**************************************************************/ 1255 /**************************************************************/
1256 /* async I/Os */ 1256 /* async I/Os */
1257 1257
1258 -typedef struct VectorTranslationState { 1258 +typedef struct VectorTranslationAIOCB {
  1259 + BlockDriverAIOCB common;
1259 QEMUIOVector *iov; 1260 QEMUIOVector *iov;
1260 uint8_t *bounce; 1261 uint8_t *bounce;
1261 int is_write; 1262 int is_write;
1262 BlockDriverAIOCB *aiocb; 1263 BlockDriverAIOCB *aiocb;
1263 - BlockDriverAIOCB *this_aiocb;  
1264 -} VectorTranslationState; 1264 +} VectorTranslationAIOCB;
1265 1265
1266 -static void bdrv_aio_cancel_vector(BlockDriverAIOCB *acb) 1266 +static void bdrv_aio_cancel_vector(BlockDriverAIOCB *_acb)
1267 { 1267 {
1268 - VectorTranslationState *s = acb->opaque; 1268 + VectorTranslationAIOCB *acb
  1269 + = container_of(_acb, VectorTranslationAIOCB, common);
1269 1270
1270 - bdrv_aio_cancel(s->aiocb); 1271 + bdrv_aio_cancel(acb->aiocb);
1271 } 1272 }
1272 1273
1273 static void bdrv_aio_rw_vector_cb(void *opaque, int ret) 1274 static void bdrv_aio_rw_vector_cb(void *opaque, int ret)
1274 { 1275 {
1275 - VectorTranslationState *s = opaque; 1276 + VectorTranslationAIOCB *s = (VectorTranslationAIOCB *)opaque;
1276 1277
1277 if (!s->is_write) { 1278 if (!s->is_write) {
1278 qemu_iovec_from_buffer(s->iov, s->bounce, s->iov->size); 1279 qemu_iovec_from_buffer(s->iov, s->bounce, s->iov->size);
1279 } 1280 }
1280 qemu_vfree(s->bounce); 1281 qemu_vfree(s->bounce);
1281 - s->this_aiocb->cb(s->this_aiocb->opaque, ret);  
1282 - qemu_aio_release(s->this_aiocb); 1282 + s->common.cb(s->common.opaque, ret);
  1283 + qemu_aio_release(s);
1283 } 1284 }
1284 1285
1285 static BlockDriverAIOCB *bdrv_aio_rw_vector(BlockDriverState *bs, 1286 static BlockDriverAIOCB *bdrv_aio_rw_vector(BlockDriverState *bs,
@@ -1291,11 +1292,9 @@ static BlockDriverAIOCB *bdrv_aio_rw_vector(BlockDriverState *bs, @@ -1291,11 +1292,9 @@ static BlockDriverAIOCB *bdrv_aio_rw_vector(BlockDriverState *bs,
1291 int is_write) 1292 int is_write)
1292 1293
1293 { 1294 {
1294 - VectorTranslationState *s = qemu_mallocz(sizeof(*s));  
1295 - BlockDriverAIOCB *aiocb = qemu_aio_get_pool(&vectored_aio_pool, bs,  
1296 - cb, opaque); 1295 + VectorTranslationAIOCB *s = qemu_aio_get_pool(&vectored_aio_pool, bs,
  1296 + cb, opaque);
1297 1297
1298 - s->this_aiocb = aiocb;  
1299 s->iov = iov; 1298 s->iov = iov;
1300 s->bounce = qemu_memalign(512, nb_sectors * 512); 1299 s->bounce = qemu_memalign(512, nb_sectors * 512);
1301 s->is_write = is_write; 1300 s->is_write = is_write;
@@ -1307,7 +1306,7 @@ static BlockDriverAIOCB *bdrv_aio_rw_vector(BlockDriverState *bs, @@ -1307,7 +1306,7 @@ static BlockDriverAIOCB *bdrv_aio_rw_vector(BlockDriverState *bs,
1307 s->aiocb = bdrv_aio_read(bs, sector_num, s->bounce, nb_sectors, 1306 s->aiocb = bdrv_aio_read(bs, sector_num, s->bounce, nb_sectors,
1308 bdrv_aio_rw_vector_cb, s); 1307 bdrv_aio_rw_vector_cb, s);
1309 } 1308 }
1310 - return aiocb; 1309 + return &s->common;
1311 } 1310 }
1312 1311
1313 BlockDriverAIOCB *bdrv_aio_readv(BlockDriverState *bs, int64_t sector_num, 1312 BlockDriverAIOCB *bdrv_aio_readv(BlockDriverState *bs, int64_t sector_num,
@@ -1483,7 +1482,7 @@ static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num, @@ -1483,7 +1482,7 @@ static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num,
1483 1482
1484 void bdrv_init(void) 1483 void bdrv_init(void)
1485 { 1484 {
1486 - aio_pool_init(&vectored_aio_pool, sizeof(BlockDriverAIOCB), 1485 + aio_pool_init(&vectored_aio_pool, sizeof(VectorTranslationAIOCB),
1487 bdrv_aio_cancel_vector); 1486 bdrv_aio_cancel_vector);
1488 1487
1489 bdrv_register(&bdrv_raw); 1488 bdrv_register(&bdrv_raw);