提交 c16b5a2c 编写于 作者: C Christoph Hellwig 提交者: Anthony Liguori

fully split aio_pool from BlockDriver

Now that we have a separate aio pool structure we can remove those
aio pool details from BlockDriver.

Every driver supporting AIO now needs to declare a static AIOPool
with the aiocb size and the cancellation method.  This cleans up the
current code considerably and will make it cleaner and more obvious
to support two different aio implementations behind a single
BlockDriver.
Signed-off-by: NChristoph Hellwig <hch@lst.de>
Signed-off-by: NAnthony Liguori <aliguori@us.ibm.com>
上级 ad53089b
...@@ -48,23 +48,12 @@ ...@@ -48,23 +48,12 @@
#define SECTOR_BITS 9 #define SECTOR_BITS 9
#define SECTOR_SIZE (1 << SECTOR_BITS) #define SECTOR_SIZE (1 << SECTOR_BITS)
typedef struct BlockDriverAIOCBSync {
BlockDriverAIOCB common;
QEMUBH *bh;
int ret;
/* vector translation state */
QEMUIOVector *qiov;
uint8_t *bounce;
int is_write;
} BlockDriverAIOCBSync;
static BlockDriverAIOCB *bdrv_aio_readv_em(BlockDriverState *bs, static BlockDriverAIOCB *bdrv_aio_readv_em(BlockDriverState *bs,
int64_t sector_num, QEMUIOVector *qiov, int nb_sectors, int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
BlockDriverCompletionFunc *cb, void *opaque); BlockDriverCompletionFunc *cb, void *opaque);
static BlockDriverAIOCB *bdrv_aio_writev_em(BlockDriverState *bs, static BlockDriverAIOCB *bdrv_aio_writev_em(BlockDriverState *bs,
int64_t sector_num, QEMUIOVector *qiov, int nb_sectors, int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
BlockDriverCompletionFunc *cb, void *opaque); BlockDriverCompletionFunc *cb, void *opaque);
static void bdrv_aio_cancel_em(BlockDriverAIOCB *acb);
static int bdrv_read_em(BlockDriverState *bs, int64_t sector_num, static int bdrv_read_em(BlockDriverState *bs, int64_t sector_num,
uint8_t *buf, int nb_sectors); uint8_t *buf, int nb_sectors);
static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num, static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num,
...@@ -138,21 +127,17 @@ void path_combine(char *dest, int dest_size, ...@@ -138,21 +127,17 @@ void path_combine(char *dest, int dest_size,
} }
} }
void bdrv_register(BlockDriver *bdrv) void bdrv_register(BlockDriver *bdrv)
{ {
if (!bdrv->bdrv_aio_readv) { if (!bdrv->bdrv_aio_readv) {
/* add AIO emulation layer */ /* add AIO emulation layer */
bdrv->bdrv_aio_readv = bdrv_aio_readv_em; bdrv->bdrv_aio_readv = bdrv_aio_readv_em;
bdrv->bdrv_aio_writev = bdrv_aio_writev_em; bdrv->bdrv_aio_writev = bdrv_aio_writev_em;
bdrv->bdrv_aio_cancel = bdrv_aio_cancel_em;
bdrv->aiocb_size = sizeof(BlockDriverAIOCBSync);
} else if (!bdrv->bdrv_read) { } else if (!bdrv->bdrv_read) {
/* add synchronous IO emulation layer */ /* add synchronous IO emulation layer */
bdrv->bdrv_read = bdrv_read_em; bdrv->bdrv_read = bdrv_read_em;
bdrv->bdrv_write = bdrv_write_em; bdrv->bdrv_write = bdrv_write_em;
} }
aio_pool_init(&bdrv->aio_pool, bdrv->aiocb_size, bdrv->bdrv_aio_cancel);
bdrv->next = first_drv; bdrv->next = first_drv;
first_drv = bdrv; first_drv = bdrv;
} }
...@@ -1369,6 +1354,28 @@ void bdrv_aio_cancel(BlockDriverAIOCB *acb) ...@@ -1369,6 +1354,28 @@ void bdrv_aio_cancel(BlockDriverAIOCB *acb)
/**************************************************************/ /**************************************************************/
/* async block device emulation */ /* async block device emulation */
typedef struct BlockDriverAIOCBSync {
BlockDriverAIOCB common;
QEMUBH *bh;
int ret;
/* vector translation state */
QEMUIOVector *qiov;
uint8_t *bounce;
int is_write;
} BlockDriverAIOCBSync;
static void bdrv_aio_cancel_em(BlockDriverAIOCB *blockacb)
{
BlockDriverAIOCBSync *acb = (BlockDriverAIOCBSync *)blockacb;
qemu_bh_cancel(acb->bh);
qemu_aio_release(acb);
}
static AIOPool bdrv_em_aio_pool = {
.aiocb_size = sizeof(BlockDriverAIOCBSync),
.cancel = bdrv_aio_cancel_em,
};
static void bdrv_aio_bh_cb(void *opaque) static void bdrv_aio_bh_cb(void *opaque)
{ {
BlockDriverAIOCBSync *acb = opaque; BlockDriverAIOCBSync *acb = opaque;
...@@ -1392,7 +1399,7 @@ static BlockDriverAIOCB *bdrv_aio_rw_vector(BlockDriverState *bs, ...@@ -1392,7 +1399,7 @@ static BlockDriverAIOCB *bdrv_aio_rw_vector(BlockDriverState *bs,
{ {
BlockDriverAIOCBSync *acb; BlockDriverAIOCBSync *acb;
acb = qemu_aio_get(bs, cb, opaque); acb = qemu_aio_get(&bdrv_em_aio_pool, bs, cb, opaque);
acb->is_write = is_write; acb->is_write = is_write;
acb->qiov = qiov; acb->qiov = qiov;
acb->bounce = qemu_blockalign(bs, qiov->size); acb->bounce = qemu_blockalign(bs, qiov->size);
...@@ -1426,14 +1433,6 @@ static BlockDriverAIOCB *bdrv_aio_writev_em(BlockDriverState *bs, ...@@ -1426,14 +1433,6 @@ static BlockDriverAIOCB *bdrv_aio_writev_em(BlockDriverState *bs,
return bdrv_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 1); return bdrv_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 1);
} }
static void bdrv_aio_cancel_em(BlockDriverAIOCB *blockacb)
{
BlockDriverAIOCBSync *acb = (BlockDriverAIOCBSync *)blockacb;
qemu_bh_cancel(acb->bh);
qemu_aio_release(acb);
}
/**************************************************************/ /**************************************************************/
/* sync block device emulation */ /* sync block device emulation */
...@@ -1495,16 +1494,8 @@ void bdrv_init(void) ...@@ -1495,16 +1494,8 @@ void bdrv_init(void)
module_call_init(MODULE_INIT_BLOCK); module_call_init(MODULE_INIT_BLOCK);
} }
void aio_pool_init(AIOPool *pool, int aiocb_size, void *qemu_aio_get(AIOPool *pool, BlockDriverState *bs,
void (*cancel)(BlockDriverAIOCB *acb)) BlockDriverCompletionFunc *cb, void *opaque)
{
pool->aiocb_size = aiocb_size;
pool->cancel = cancel;
pool->free_aiocb = NULL;
}
void *qemu_aio_get_pool(AIOPool *pool, BlockDriverState *bs,
BlockDriverCompletionFunc *cb, void *opaque)
{ {
BlockDriverAIOCB *acb; BlockDriverAIOCB *acb;
...@@ -1521,12 +1512,6 @@ void *qemu_aio_get_pool(AIOPool *pool, BlockDriverState *bs, ...@@ -1521,12 +1512,6 @@ void *qemu_aio_get_pool(AIOPool *pool, BlockDriverState *bs,
return acb; return acb;
} }
void *qemu_aio_get(BlockDriverState *bs, BlockDriverCompletionFunc *cb,
void *opaque)
{
return qemu_aio_get_pool(&bs->drv->aio_pool, bs, cb, opaque);
}
void qemu_aio_release(void *p) void qemu_aio_release(void *p)
{ {
BlockDriverAIOCB *acb = (BlockDriverAIOCB *)p; BlockDriverAIOCB *acb = (BlockDriverAIOCB *)p;
......
...@@ -349,6 +349,16 @@ out_noclean: ...@@ -349,6 +349,16 @@ out_noclean:
return -EINVAL; return -EINVAL;
} }
static void curl_aio_cancel(BlockDriverAIOCB *blockacb)
{
// Do we have to implement canceling? Seems to work without...
}
static AIOPool curl_aio_pool = {
.aiocb_size = sizeof(CURLAIOCB),
.cancel = curl_aio_cancel,
};
static BlockDriverAIOCB *curl_aio_readv(BlockDriverState *bs, static BlockDriverAIOCB *curl_aio_readv(BlockDriverState *bs,
int64_t sector_num, QEMUIOVector *qiov, int nb_sectors, int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
BlockDriverCompletionFunc *cb, void *opaque) BlockDriverCompletionFunc *cb, void *opaque)
...@@ -359,7 +369,7 @@ static BlockDriverAIOCB *curl_aio_readv(BlockDriverState *bs, ...@@ -359,7 +369,7 @@ static BlockDriverAIOCB *curl_aio_readv(BlockDriverState *bs,
size_t end; size_t end;
CURLState *state; CURLState *state;
acb = qemu_aio_get(bs, cb, opaque); acb = qemu_aio_get(&curl_aio_pool, bs, cb, opaque);
if (!acb) if (!acb)
return NULL; return NULL;
...@@ -406,11 +416,6 @@ static BlockDriverAIOCB *curl_aio_readv(BlockDriverState *bs, ...@@ -406,11 +416,6 @@ static BlockDriverAIOCB *curl_aio_readv(BlockDriverState *bs,
return &acb->common; return &acb->common;
} }
static void curl_aio_cancel(BlockDriverAIOCB *blockacb)
{
// Do we have to implement canceling? Seems to work without...
}
static void curl_close(BlockDriverState *bs) static void curl_close(BlockDriverState *bs)
{ {
BDRVCURLState *s = bs->opaque; BDRVCURLState *s = bs->opaque;
...@@ -450,9 +455,7 @@ static BlockDriver bdrv_http = { ...@@ -450,9 +455,7 @@ static BlockDriver bdrv_http = {
.bdrv_close = curl_close, .bdrv_close = curl_close,
.bdrv_getlength = curl_getlength, .bdrv_getlength = curl_getlength,
.aiocb_size = sizeof(CURLAIOCB),
.bdrv_aio_readv = curl_aio_readv, .bdrv_aio_readv = curl_aio_readv,
.bdrv_aio_cancel = curl_aio_cancel,
}; };
static BlockDriver bdrv_https = { static BlockDriver bdrv_https = {
...@@ -464,9 +467,7 @@ static BlockDriver bdrv_https = { ...@@ -464,9 +467,7 @@ static BlockDriver bdrv_https = {
.bdrv_close = curl_close, .bdrv_close = curl_close,
.bdrv_getlength = curl_getlength, .bdrv_getlength = curl_getlength,
.aiocb_size = sizeof(CURLAIOCB),
.bdrv_aio_readv = curl_aio_readv, .bdrv_aio_readv = curl_aio_readv,
.bdrv_aio_cancel = curl_aio_cancel,
}; };
static BlockDriver bdrv_ftp = { static BlockDriver bdrv_ftp = {
...@@ -478,9 +479,7 @@ static BlockDriver bdrv_ftp = { ...@@ -478,9 +479,7 @@ static BlockDriver bdrv_ftp = {
.bdrv_close = curl_close, .bdrv_close = curl_close,
.bdrv_getlength = curl_getlength, .bdrv_getlength = curl_getlength,
.aiocb_size = sizeof(CURLAIOCB),
.bdrv_aio_readv = curl_aio_readv, .bdrv_aio_readv = curl_aio_readv,
.bdrv_aio_cancel = curl_aio_cancel,
}; };
static BlockDriver bdrv_ftps = { static BlockDriver bdrv_ftps = {
...@@ -492,9 +491,7 @@ static BlockDriver bdrv_ftps = { ...@@ -492,9 +491,7 @@ static BlockDriver bdrv_ftps = {
.bdrv_close = curl_close, .bdrv_close = curl_close,
.bdrv_getlength = curl_getlength, .bdrv_getlength = curl_getlength,
.aiocb_size = sizeof(CURLAIOCB),
.bdrv_aio_readv = curl_aio_readv, .bdrv_aio_readv = curl_aio_readv,
.bdrv_aio_cancel = curl_aio_cancel,
}; };
static BlockDriver bdrv_tftp = { static BlockDriver bdrv_tftp = {
...@@ -506,9 +503,7 @@ static BlockDriver bdrv_tftp = { ...@@ -506,9 +503,7 @@ static BlockDriver bdrv_tftp = {
.bdrv_close = curl_close, .bdrv_close = curl_close,
.bdrv_getlength = curl_getlength, .bdrv_getlength = curl_getlength,
.aiocb_size = sizeof(CURLAIOCB),
.bdrv_aio_readv = curl_aio_readv, .bdrv_aio_readv = curl_aio_readv,
.bdrv_aio_cancel = curl_aio_cancel,
}; };
static void curl_block_init(void) static void curl_block_init(void)
......
...@@ -503,6 +503,18 @@ typedef struct QCowAIOCB { ...@@ -503,6 +503,18 @@ typedef struct QCowAIOCB {
BlockDriverAIOCB *hd_aiocb; BlockDriverAIOCB *hd_aiocb;
} QCowAIOCB; } QCowAIOCB;
static void qcow_aio_cancel(BlockDriverAIOCB *blockacb)
{
QCowAIOCB *acb = (QCowAIOCB *)blockacb;
if (acb->hd_aiocb)
bdrv_aio_cancel(acb->hd_aiocb);
qemu_aio_release(acb);
}
static AIOPool qcow_aio_pool = {
.aiocb_size = sizeof(QCowAIOCB),
.cancel = qcow_aio_cancel,
};
static QCowAIOCB *qcow_aio_setup(BlockDriverState *bs, static QCowAIOCB *qcow_aio_setup(BlockDriverState *bs,
int64_t sector_num, QEMUIOVector *qiov, int nb_sectors, int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
...@@ -510,7 +522,7 @@ static QCowAIOCB *qcow_aio_setup(BlockDriverState *bs, ...@@ -510,7 +522,7 @@ static QCowAIOCB *qcow_aio_setup(BlockDriverState *bs,
{ {
QCowAIOCB *acb; QCowAIOCB *acb;
acb = qemu_aio_get(bs, cb, opaque); acb = qemu_aio_get(&qcow_aio_pool, bs, cb, opaque);
if (!acb) if (!acb)
return NULL; return NULL;
acb->hd_aiocb = NULL; acb->hd_aiocb = NULL;
...@@ -720,14 +732,6 @@ static BlockDriverAIOCB *qcow_aio_writev(BlockDriverState *bs, ...@@ -720,14 +732,6 @@ static BlockDriverAIOCB *qcow_aio_writev(BlockDriverState *bs,
return &acb->common; return &acb->common;
} }
static void qcow_aio_cancel(BlockDriverAIOCB *blockacb)
{
QCowAIOCB *acb = (QCowAIOCB *)blockacb;
if (acb->hd_aiocb)
bdrv_aio_cancel(acb->hd_aiocb);
qemu_aio_release(acb);
}
static void qcow_close(BlockDriverState *bs) static void qcow_close(BlockDriverState *bs)
{ {
BDRVQcowState *s = bs->opaque; BDRVQcowState *s = bs->opaque;
...@@ -924,8 +928,6 @@ static BlockDriver bdrv_qcow = { ...@@ -924,8 +928,6 @@ static BlockDriver bdrv_qcow = {
.bdrv_make_empty = qcow_make_empty, .bdrv_make_empty = qcow_make_empty,
.bdrv_aio_readv = qcow_aio_readv, .bdrv_aio_readv = qcow_aio_readv,
.bdrv_aio_writev = qcow_aio_writev, .bdrv_aio_writev = qcow_aio_writev,
.bdrv_aio_cancel = qcow_aio_cancel,
.aiocb_size = sizeof(QCowAIOCB),
.bdrv_write_compressed = qcow_write_compressed, .bdrv_write_compressed = qcow_write_compressed,
.bdrv_get_info = qcow_get_info, .bdrv_get_info = qcow_get_info,
......
...@@ -1246,6 +1246,19 @@ typedef struct QCowAIOCB { ...@@ -1246,6 +1246,19 @@ typedef struct QCowAIOCB {
QCowL2Meta l2meta; QCowL2Meta l2meta;
} QCowAIOCB; } QCowAIOCB;
static void qcow_aio_cancel(BlockDriverAIOCB *blockacb)
{
QCowAIOCB *acb = (QCowAIOCB *)blockacb;
if (acb->hd_aiocb)
bdrv_aio_cancel(acb->hd_aiocb);
qemu_aio_release(acb);
}
static AIOPool qcow_aio_pool = {
.aiocb_size = sizeof(QCowAIOCB),
.cancel = qcow_aio_cancel,
};
static void qcow_aio_read_cb(void *opaque, int ret); static void qcow_aio_read_cb(void *opaque, int ret);
static void qcow_aio_read_bh(void *opaque) static void qcow_aio_read_bh(void *opaque)
{ {
...@@ -1375,7 +1388,7 @@ static QCowAIOCB *qcow_aio_setup(BlockDriverState *bs, ...@@ -1375,7 +1388,7 @@ static QCowAIOCB *qcow_aio_setup(BlockDriverState *bs,
{ {
QCowAIOCB *acb; QCowAIOCB *acb;
acb = qemu_aio_get(bs, cb, opaque); acb = qemu_aio_get(&qcow_aio_pool, bs, cb, opaque);
if (!acb) if (!acb)
return NULL; return NULL;
acb->hd_aiocb = NULL; acb->hd_aiocb = NULL;
...@@ -1498,14 +1511,6 @@ static BlockDriverAIOCB *qcow_aio_writev(BlockDriverState *bs, ...@@ -1498,14 +1511,6 @@ static BlockDriverAIOCB *qcow_aio_writev(BlockDriverState *bs,
return &acb->common; return &acb->common;
} }
static void qcow_aio_cancel(BlockDriverAIOCB *blockacb)
{
QCowAIOCB *acb = (QCowAIOCB *)blockacb;
if (acb->hd_aiocb)
bdrv_aio_cancel(acb->hd_aiocb);
qemu_aio_release(acb);
}
static void qcow_close(BlockDriverState *bs) static void qcow_close(BlockDriverState *bs)
{ {
BDRVQcowState *s = bs->opaque; BDRVQcowState *s = bs->opaque;
...@@ -2998,8 +3003,6 @@ static BlockDriver bdrv_qcow2 = { ...@@ -2998,8 +3003,6 @@ static BlockDriver bdrv_qcow2 = {
.bdrv_aio_readv = qcow_aio_readv, .bdrv_aio_readv = qcow_aio_readv,
.bdrv_aio_writev = qcow_aio_writev, .bdrv_aio_writev = qcow_aio_writev,
.bdrv_aio_cancel = qcow_aio_cancel,
.aiocb_size = sizeof(QCowAIOCB),
.bdrv_write_compressed = qcow_write_compressed, .bdrv_write_compressed = qcow_write_compressed,
.bdrv_snapshot_create = qcow_snapshot_create, .bdrv_snapshot_create = qcow_snapshot_create,
......
...@@ -599,6 +599,45 @@ static int posix_aio_init(void) ...@@ -599,6 +599,45 @@ static int posix_aio_init(void)
return 0; return 0;
} }
static void raw_aio_remove(RawAIOCB *acb)
{
RawAIOCB **pacb;
/* remove the callback from the queue */
pacb = &posix_aio_state->first_aio;
for(;;) {
if (*pacb == NULL) {
fprintf(stderr, "raw_aio_remove: aio request not found!\n");
break;
} else if (*pacb == acb) {
*pacb = acb->next;
qemu_aio_release(acb);
break;
}
pacb = &(*pacb)->next;
}
}
static void raw_aio_cancel(BlockDriverAIOCB *blockacb)
{
int ret;
RawAIOCB *acb = (RawAIOCB *)blockacb;
ret = qemu_paio_cancel(acb->aiocb.aio_fildes, &acb->aiocb);
if (ret == QEMU_PAIO_NOTCANCELED) {
/* fail safe: if the aio could not be canceled, we wait for
it */
while (qemu_paio_error(&acb->aiocb) == EINPROGRESS);
}
raw_aio_remove(acb);
}
static AIOPool raw_aio_pool = {
.aiocb_size = sizeof(RawAIOCB),
.cancel = raw_aio_cancel,
};
static RawAIOCB *raw_aio_setup(BlockDriverState *bs, int64_t sector_num, static RawAIOCB *raw_aio_setup(BlockDriverState *bs, int64_t sector_num,
QEMUIOVector *qiov, int nb_sectors, QEMUIOVector *qiov, int nb_sectors,
BlockDriverCompletionFunc *cb, void *opaque) BlockDriverCompletionFunc *cb, void *opaque)
...@@ -609,7 +648,7 @@ static RawAIOCB *raw_aio_setup(BlockDriverState *bs, int64_t sector_num, ...@@ -609,7 +648,7 @@ static RawAIOCB *raw_aio_setup(BlockDriverState *bs, int64_t sector_num,
if (fd_open(bs) < 0) if (fd_open(bs) < 0)
return NULL; return NULL;
acb = qemu_aio_get(bs, cb, opaque); acb = qemu_aio_get(&raw_aio_pool, bs, cb, opaque);
if (!acb) if (!acb)
return NULL; return NULL;
acb->aiocb.aio_fildes = s->fd; acb->aiocb.aio_fildes = s->fd;
...@@ -633,25 +672,6 @@ static RawAIOCB *raw_aio_setup(BlockDriverState *bs, int64_t sector_num, ...@@ -633,25 +672,6 @@ static RawAIOCB *raw_aio_setup(BlockDriverState *bs, int64_t sector_num,
return acb; return acb;
} }
static void raw_aio_remove(RawAIOCB *acb)
{
RawAIOCB **pacb;
/* remove the callback from the queue */
pacb = &posix_aio_state->first_aio;
for(;;) {
if (*pacb == NULL) {
fprintf(stderr, "raw_aio_remove: aio request not found!\n");
break;
} else if (*pacb == acb) {
*pacb = acb->next;
qemu_aio_release(acb);
break;
}
pacb = &(*pacb)->next;
}
}
static BlockDriverAIOCB *raw_aio_readv(BlockDriverState *bs, static BlockDriverAIOCB *raw_aio_readv(BlockDriverState *bs,
int64_t sector_num, QEMUIOVector *qiov, int nb_sectors, int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
BlockDriverCompletionFunc *cb, void *opaque) BlockDriverCompletionFunc *cb, void *opaque)
...@@ -683,21 +703,6 @@ static BlockDriverAIOCB *raw_aio_writev(BlockDriverState *bs, ...@@ -683,21 +703,6 @@ static BlockDriverAIOCB *raw_aio_writev(BlockDriverState *bs,
} }
return &acb->common; return &acb->common;
} }
static void raw_aio_cancel(BlockDriverAIOCB *blockacb)
{
int ret;
RawAIOCB *acb = (RawAIOCB *)blockacb;
ret = qemu_paio_cancel(acb->aiocb.aio_fildes, &acb->aiocb);
if (ret == QEMU_PAIO_NOTCANCELED) {
/* fail safe: if the aio could not be canceled, we wait for
it */
while (qemu_paio_error(&acb->aiocb) == EINPROGRESS);
}
raw_aio_remove(acb);
}
#else /* CONFIG_AIO */ #else /* CONFIG_AIO */
static int posix_aio_init(void) static int posix_aio_init(void)
{ {
...@@ -871,8 +876,6 @@ static BlockDriver bdrv_raw = { ...@@ -871,8 +876,6 @@ static BlockDriver bdrv_raw = {
#ifdef CONFIG_AIO #ifdef CONFIG_AIO
.bdrv_aio_readv = raw_aio_readv, .bdrv_aio_readv = raw_aio_readv,
.bdrv_aio_writev = raw_aio_writev, .bdrv_aio_writev = raw_aio_writev,
.bdrv_aio_cancel = raw_aio_cancel,
.aiocb_size = sizeof(RawAIOCB),
#endif #endif
.bdrv_truncate = raw_truncate, .bdrv_truncate = raw_truncate,
...@@ -1205,7 +1208,7 @@ static BlockDriverAIOCB *raw_aio_ioctl(BlockDriverState *bs, ...@@ -1205,7 +1208,7 @@ static BlockDriverAIOCB *raw_aio_ioctl(BlockDriverState *bs,
if (fd_open(bs) < 0) if (fd_open(bs) < 0)
return NULL; return NULL;
acb = qemu_aio_get(bs, cb, opaque); acb = qemu_aio_get(&raw_aio_pool, bs, cb, opaque);
if (!acb) if (!acb)
return NULL; return NULL;
acb->aiocb.aio_fildes = s->fd; acb->aiocb.aio_fildes = s->fd;
...@@ -1417,8 +1420,6 @@ static BlockDriver bdrv_host_device = { ...@@ -1417,8 +1420,6 @@ static BlockDriver bdrv_host_device = {
#ifdef CONFIG_AIO #ifdef CONFIG_AIO
.bdrv_aio_readv = raw_aio_readv, .bdrv_aio_readv = raw_aio_readv,
.bdrv_aio_writev = raw_aio_writev, .bdrv_aio_writev = raw_aio_writev,
.bdrv_aio_cancel = raw_aio_cancel,
.aiocb_size = sizeof(RawAIOCB),
#endif #endif
.bdrv_read = raw_read, .bdrv_read = raw_read,
......
...@@ -67,8 +67,6 @@ struct BlockDriver { ...@@ -67,8 +67,6 @@ struct BlockDriver {
BlockDriverAIOCB *(*bdrv_aio_writev)(BlockDriverState *bs, BlockDriverAIOCB *(*bdrv_aio_writev)(BlockDriverState *bs,
int64_t sector_num, QEMUIOVector *qiov, int nb_sectors, int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
BlockDriverCompletionFunc *cb, void *opaque); BlockDriverCompletionFunc *cb, void *opaque);
void (*bdrv_aio_cancel)(BlockDriverAIOCB *acb);
int aiocb_size;
const char *protocol_name; const char *protocol_name;
int (*bdrv_truncate)(BlockDriverState *bs, int64_t offset); int (*bdrv_truncate)(BlockDriverState *bs, int64_t offset);
...@@ -102,8 +100,6 @@ struct BlockDriver { ...@@ -102,8 +100,6 @@ struct BlockDriver {
unsigned long int req, void *buf, unsigned long int req, void *buf,
BlockDriverCompletionFunc *cb, void *opaque); BlockDriverCompletionFunc *cb, void *opaque);
AIOPool aio_pool;
/* List of options for creating images, terminated by name == NULL */ /* List of options for creating images, terminated by name == NULL */
QEMUOptionParameter *create_options; QEMUOptionParameter *create_options;
...@@ -173,13 +169,8 @@ struct BlockDriverAIOCB { ...@@ -173,13 +169,8 @@ struct BlockDriverAIOCB {
void get_tmp_filename(char *filename, int size); void get_tmp_filename(char *filename, int size);
void aio_pool_init(AIOPool *pool, int aiocb_size, void *qemu_aio_get(AIOPool *pool, BlockDriverState *bs,
void (*cancel)(BlockDriverAIOCB *acb)); BlockDriverCompletionFunc *cb, void *opaque);
void *qemu_aio_get(BlockDriverState *bs, BlockDriverCompletionFunc *cb,
void *opaque);
void *qemu_aio_get_pool(AIOPool *pool, BlockDriverState *bs,
BlockDriverCompletionFunc *cb, void *opaque);
void qemu_aio_release(void *p); void qemu_aio_release(void *p);
void *qemu_blockalign(BlockDriverState *bs, size_t size); void *qemu_blockalign(BlockDriverState *bs, size_t size);
......
...@@ -10,8 +10,6 @@ ...@@ -10,8 +10,6 @@
#include "dma.h" #include "dma.h"
#include "block_int.h" #include "block_int.h"
static AIOPool dma_aio_pool;
void qemu_sglist_init(QEMUSGList *qsg, int alloc_hint) void qemu_sglist_init(QEMUSGList *qsg, int alloc_hint)
{ {
qsg->sg = qemu_malloc(alloc_hint * sizeof(ScatterGatherEntry)); qsg->sg = qemu_malloc(alloc_hint * sizeof(ScatterGatherEntry));
...@@ -132,12 +130,26 @@ static void dma_bdrv_cb(void *opaque, int ret) ...@@ -132,12 +130,26 @@ static void dma_bdrv_cb(void *opaque, int ret)
} }
} }
static void dma_aio_cancel(BlockDriverAIOCB *acb)
{
DMAAIOCB *dbs = container_of(acb, DMAAIOCB, common);
if (dbs->acb) {
bdrv_aio_cancel(dbs->acb);
}
}
static AIOPool dma_aio_pool = {
.aiocb_size = sizeof(DMAAIOCB),
.cancel = dma_aio_cancel,
};
static BlockDriverAIOCB *dma_bdrv_io( static BlockDriverAIOCB *dma_bdrv_io(
BlockDriverState *bs, QEMUSGList *sg, uint64_t sector_num, BlockDriverState *bs, QEMUSGList *sg, uint64_t sector_num,
BlockDriverCompletionFunc *cb, void *opaque, BlockDriverCompletionFunc *cb, void *opaque,
int is_write) int is_write)
{ {
DMAAIOCB *dbs = qemu_aio_get_pool(&dma_aio_pool, bs, cb, opaque); DMAAIOCB *dbs = qemu_aio_get(&dma_aio_pool, bs, cb, opaque);
dbs->acb = NULL; dbs->acb = NULL;
dbs->bs = bs; dbs->bs = bs;
...@@ -170,17 +182,3 @@ BlockDriverAIOCB *dma_bdrv_write(BlockDriverState *bs, ...@@ -170,17 +182,3 @@ BlockDriverAIOCB *dma_bdrv_write(BlockDriverState *bs,
{ {
return dma_bdrv_io(bs, sg, sector, cb, opaque, 1); return dma_bdrv_io(bs, sg, sector, cb, opaque, 1);
} }
static void dma_aio_cancel(BlockDriverAIOCB *acb)
{
DMAAIOCB *dbs = container_of(acb, DMAAIOCB, common);
if (dbs->acb) {
bdrv_aio_cancel(dbs->acb);
}
}
void dma_helper_init(void)
{
aio_pool_init(&dma_aio_pool, sizeof(DMAAIOCB), dma_aio_cancel);
}
...@@ -38,6 +38,4 @@ BlockDriverAIOCB *dma_bdrv_read(BlockDriverState *bs, ...@@ -38,6 +38,4 @@ BlockDriverAIOCB *dma_bdrv_read(BlockDriverState *bs,
BlockDriverAIOCB *dma_bdrv_write(BlockDriverState *bs, BlockDriverAIOCB *dma_bdrv_write(BlockDriverState *bs,
QEMUSGList *sg, uint64_t sector, QEMUSGList *sg, uint64_t sector,
BlockDriverCompletionFunc *cb, void *opaque); BlockDriverCompletionFunc *cb, void *opaque);
void dma_helper_init(void);
#endif #endif
...@@ -5753,7 +5753,6 @@ int main(int argc, char **argv, char **envp) ...@@ -5753,7 +5753,6 @@ int main(int argc, char **argv, char **envp)
cpu_exec_init_all(tb_size * 1024 * 1024); cpu_exec_init_all(tb_size * 1024 * 1024);
bdrv_init(); bdrv_init();
dma_helper_init();
/* we always create the cdrom drive, even if no disk is there */ /* we always create the cdrom drive, even if no disk is there */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册