Commit 37b7842c2fb405c270efdce714425c17af3c78cd
1 parent
3fb94d56
Move block dma helpers aiocb to store dma state (Avi Kivity)
Use the dedicated dma aiocb to store intermediate state for dma block transactions. 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@6874 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
20 additions
and
17 deletions
dma-helpers.c
| ... | ... | @@ -39,6 +39,7 @@ void qemu_sglist_destroy(QEMUSGList *qsg) |
| 39 | 39 | } |
| 40 | 40 | |
| 41 | 41 | typedef struct { |
| 42 | + BlockDriverAIOCB common; | |
| 42 | 43 | BlockDriverState *bs; |
| 43 | 44 | BlockDriverAIOCB *acb; |
| 44 | 45 | QEMUSGList *sg; |
| ... | ... | @@ -48,13 +49,13 @@ typedef struct { |
| 48 | 49 | target_phys_addr_t sg_cur_byte; |
| 49 | 50 | QEMUIOVector iov; |
| 50 | 51 | QEMUBH *bh; |
| 51 | -} DMABlockState; | |
| 52 | +} DMAAIOCB; | |
| 52 | 53 | |
| 53 | 54 | static void dma_bdrv_cb(void *opaque, int ret); |
| 54 | 55 | |
| 55 | 56 | static void reschedule_dma(void *opaque) |
| 56 | 57 | { |
| 57 | - DMABlockState *dbs = (DMABlockState *)opaque; | |
| 58 | + DMAAIOCB *dbs = (DMAAIOCB *)opaque; | |
| 58 | 59 | |
| 59 | 60 | qemu_bh_delete(dbs->bh); |
| 60 | 61 | dbs->bh = NULL; |
| ... | ... | @@ -63,7 +64,7 @@ static void reschedule_dma(void *opaque) |
| 63 | 64 | |
| 64 | 65 | static void continue_after_map_failure(void *opaque) |
| 65 | 66 | { |
| 66 | - DMABlockState *dbs = (DMABlockState *)opaque; | |
| 67 | + DMAAIOCB *dbs = (DMAAIOCB *)opaque; | |
| 67 | 68 | |
| 68 | 69 | dbs->bh = qemu_bh_new(reschedule_dma, dbs); |
| 69 | 70 | qemu_bh_schedule(dbs->bh); |
| ... | ... | @@ -71,11 +72,12 @@ static void continue_after_map_failure(void *opaque) |
| 71 | 72 | |
| 72 | 73 | static void dma_bdrv_cb(void *opaque, int ret) |
| 73 | 74 | { |
| 74 | - DMABlockState *dbs = (DMABlockState *)opaque; | |
| 75 | + DMAAIOCB *dbs = (DMAAIOCB *)opaque; | |
| 75 | 76 | target_phys_addr_t cur_addr, cur_len; |
| 76 | 77 | void *mem; |
| 77 | 78 | int i; |
| 78 | 79 | |
| 80 | + dbs->acb = NULL; | |
| 79 | 81 | dbs->sector_num += dbs->iov.size / 512; |
| 80 | 82 | for (i = 0; i < dbs->iov.niov; ++i) { |
| 81 | 83 | cpu_physical_memory_unmap(dbs->iov.iov[i].iov_base, |
| ... | ... | @@ -85,10 +87,9 @@ static void dma_bdrv_cb(void *opaque, int ret) |
| 85 | 87 | qemu_iovec_reset(&dbs->iov); |
| 86 | 88 | |
| 87 | 89 | if (dbs->sg_cur_index == dbs->sg->nsg || ret < 0) { |
| 88 | - dbs->acb->cb(dbs->acb->opaque, ret); | |
| 90 | + dbs->common.cb(dbs->common.opaque, ret); | |
| 89 | 91 | qemu_iovec_destroy(&dbs->iov); |
| 90 | - qemu_aio_release(dbs->acb); | |
| 91 | - qemu_free(dbs); | |
| 92 | + qemu_aio_release(dbs); | |
| 92 | 93 | return; |
| 93 | 94 | } |
| 94 | 95 | |
| ... | ... | @@ -112,11 +113,11 @@ static void dma_bdrv_cb(void *opaque, int ret) |
| 112 | 113 | } |
| 113 | 114 | |
| 114 | 115 | if (dbs->is_write) { |
| 115 | - bdrv_aio_writev(dbs->bs, dbs->sector_num, &dbs->iov, | |
| 116 | - dbs->iov.size / 512, dma_bdrv_cb, dbs); | |
| 116 | + dbs->acb = bdrv_aio_writev(dbs->bs, dbs->sector_num, &dbs->iov, | |
| 117 | + dbs->iov.size / 512, dma_bdrv_cb, dbs); | |
| 117 | 118 | } else { |
| 118 | - bdrv_aio_readv(dbs->bs, dbs->sector_num, &dbs->iov, | |
| 119 | - dbs->iov.size / 512, dma_bdrv_cb, dbs); | |
| 119 | + dbs->acb = bdrv_aio_readv(dbs->bs, dbs->sector_num, &dbs->iov, | |
| 120 | + dbs->iov.size / 512, dma_bdrv_cb, dbs); | |
| 120 | 121 | } |
| 121 | 122 | } |
| 122 | 123 | |
| ... | ... | @@ -125,10 +126,10 @@ static BlockDriverAIOCB *dma_bdrv_io( |
| 125 | 126 | BlockDriverCompletionFunc *cb, void *opaque, |
| 126 | 127 | int is_write) |
| 127 | 128 | { |
| 128 | - DMABlockState *dbs = qemu_malloc(sizeof(*dbs)); | |
| 129 | + DMAAIOCB *dbs = qemu_aio_get_pool(&dma_aio_pool, bs, cb, opaque); | |
| 129 | 130 | |
| 131 | + dbs->acb = NULL; | |
| 130 | 132 | dbs->bs = bs; |
| 131 | - dbs->acb = qemu_aio_get_pool(&dma_aio_pool, bs, cb, opaque); | |
| 132 | 133 | dbs->sg = sg; |
| 133 | 134 | dbs->sector_num = sector_num; |
| 134 | 135 | dbs->sg_cur_index = 0; |
| ... | ... | @@ -137,7 +138,7 @@ static BlockDriverAIOCB *dma_bdrv_io( |
| 137 | 138 | dbs->bh = NULL; |
| 138 | 139 | qemu_iovec_init(&dbs->iov, sg->nsg); |
| 139 | 140 | dma_bdrv_cb(dbs, 0); |
| 140 | - return dbs->acb; | |
| 141 | + return &dbs->common; | |
| 141 | 142 | } |
| 142 | 143 | |
| 143 | 144 | |
| ... | ... | @@ -157,12 +158,14 @@ BlockDriverAIOCB *dma_bdrv_write(BlockDriverState *bs, |
| 157 | 158 | |
| 158 | 159 | static void dma_aio_cancel(BlockDriverAIOCB *acb) |
| 159 | 160 | { |
| 160 | - DMABlockState *dbs = (DMABlockState *)acb->opaque; | |
| 161 | + DMAAIOCB *dbs = container_of(acb, DMAAIOCB, common); | |
| 161 | 162 | |
| 162 | - bdrv_aio_cancel(dbs->acb); | |
| 163 | + if (dbs->acb) { | |
| 164 | + bdrv_aio_cancel(dbs->acb); | |
| 165 | + } | |
| 163 | 166 | } |
| 164 | 167 | |
| 165 | 168 | void dma_helper_init(void) |
| 166 | 169 | { |
| 167 | - aio_pool_init(&dma_aio_pool, sizeof(BlockDriverAIOCB), dma_aio_cancel); | |
| 170 | + aio_pool_init(&dma_aio_pool, sizeof(DMAAIOCB), dma_aio_cancel); | |
| 168 | 171 | } | ... | ... |