Revision cb144ccb dma-helpers.c
b/dma-helpers.c | ||
---|---|---|
47 | 47 |
target_phys_addr_t sg_cur_byte; |
48 | 48 |
QEMUIOVector iov; |
49 | 49 |
QEMUBH *bh; |
50 |
DMAIOFunc *io_func; |
|
50 | 51 |
} DMAAIOCB; |
51 | 52 |
|
52 | 53 |
static void dma_bdrv_cb(void *opaque, int ret); |
... | ... | |
116 | 117 |
return; |
117 | 118 |
} |
118 | 119 |
|
119 |
if (dbs->is_write) { |
|
120 |
dbs->acb = bdrv_aio_writev(dbs->bs, dbs->sector_num, &dbs->iov, |
|
121 |
dbs->iov.size / 512, dma_bdrv_cb, dbs); |
|
122 |
} else { |
|
123 |
dbs->acb = bdrv_aio_readv(dbs->bs, dbs->sector_num, &dbs->iov, |
|
124 |
dbs->iov.size / 512, dma_bdrv_cb, dbs); |
|
125 |
} |
|
120 |
dbs->acb = dbs->io_func(dbs->bs, dbs->sector_num, &dbs->iov, |
|
121 |
dbs->iov.size / 512, dma_bdrv_cb, dbs); |
|
126 | 122 |
if (!dbs->acb) { |
127 | 123 |
dma_bdrv_unmap(dbs); |
128 | 124 |
qemu_iovec_destroy(&dbs->iov); |
... | ... | |
144 | 140 |
.cancel = dma_aio_cancel, |
145 | 141 |
}; |
146 | 142 |
|
147 |
static BlockDriverAIOCB *dma_bdrv_io(
|
|
143 |
BlockDriverAIOCB *dma_bdrv_io( |
|
148 | 144 |
BlockDriverState *bs, QEMUSGList *sg, uint64_t sector_num, |
149 |
BlockDriverCompletionFunc *cb, void *opaque,
|
|
150 |
int is_write) |
|
145 |
DMAIOFunc *io_func, BlockDriverCompletionFunc *cb,
|
|
146 |
void *opaque, int is_write)
|
|
151 | 147 |
{ |
152 |
DMAAIOCB *dbs = qemu_aio_get(&dma_aio_pool, bs, cb, opaque);
|
|
148 |
DMAAIOCB *dbs = qemu_aio_get(&dma_aio_pool, bs, cb, opaque); |
|
153 | 149 |
|
154 | 150 |
dbs->acb = NULL; |
155 | 151 |
dbs->bs = bs; |
... | ... | |
158 | 154 |
dbs->sg_cur_index = 0; |
159 | 155 |
dbs->sg_cur_byte = 0; |
160 | 156 |
dbs->is_write = is_write; |
157 |
dbs->io_func = io_func; |
|
161 | 158 |
dbs->bh = NULL; |
162 | 159 |
qemu_iovec_init(&dbs->iov, sg->nsg); |
163 | 160 |
dma_bdrv_cb(dbs, 0); |
... | ... | |
173 | 170 |
QEMUSGList *sg, uint64_t sector, |
174 | 171 |
void (*cb)(void *opaque, int ret), void *opaque) |
175 | 172 |
{ |
176 |
return dma_bdrv_io(bs, sg, sector, cb, opaque, 0); |
|
173 |
return dma_bdrv_io(bs, sg, sector, bdrv_aio_readv, cb, opaque, 0);
|
|
177 | 174 |
} |
178 | 175 |
|
179 | 176 |
BlockDriverAIOCB *dma_bdrv_write(BlockDriverState *bs, |
180 | 177 |
QEMUSGList *sg, uint64_t sector, |
181 | 178 |
void (*cb)(void *opaque, int ret), void *opaque) |
182 | 179 |
{ |
183 |
return dma_bdrv_io(bs, sg, sector, cb, opaque, 1); |
|
180 |
return dma_bdrv_io(bs, sg, sector, bdrv_aio_writev, cb, opaque, 1);
|
|
184 | 181 |
} |
Also available in: Unified diff