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,6 +39,7 @@ void qemu_sglist_destroy(QEMUSGList *qsg) | ||
| 39 | } | 39 | } |
| 40 | 40 | ||
| 41 | typedef struct { | 41 | typedef struct { |
| 42 | + BlockDriverAIOCB common; | ||
| 42 | BlockDriverState *bs; | 43 | BlockDriverState *bs; |
| 43 | BlockDriverAIOCB *acb; | 44 | BlockDriverAIOCB *acb; |
| 44 | QEMUSGList *sg; | 45 | QEMUSGList *sg; |
| @@ -48,13 +49,13 @@ typedef struct { | @@ -48,13 +49,13 @@ typedef struct { | ||
| 48 | target_phys_addr_t sg_cur_byte; | 49 | target_phys_addr_t sg_cur_byte; |
| 49 | QEMUIOVector iov; | 50 | QEMUIOVector iov; |
| 50 | QEMUBH *bh; | 51 | QEMUBH *bh; |
| 51 | -} DMABlockState; | 52 | +} DMAAIOCB; |
| 52 | 53 | ||
| 53 | static void dma_bdrv_cb(void *opaque, int ret); | 54 | static void dma_bdrv_cb(void *opaque, int ret); |
| 54 | 55 | ||
| 55 | static void reschedule_dma(void *opaque) | 56 | static void reschedule_dma(void *opaque) |
| 56 | { | 57 | { |
| 57 | - DMABlockState *dbs = (DMABlockState *)opaque; | 58 | + DMAAIOCB *dbs = (DMAAIOCB *)opaque; |
| 58 | 59 | ||
| 59 | qemu_bh_delete(dbs->bh); | 60 | qemu_bh_delete(dbs->bh); |
| 60 | dbs->bh = NULL; | 61 | dbs->bh = NULL; |
| @@ -63,7 +64,7 @@ static void reschedule_dma(void *opaque) | @@ -63,7 +64,7 @@ static void reschedule_dma(void *opaque) | ||
| 63 | 64 | ||
| 64 | static void continue_after_map_failure(void *opaque) | 65 | static void continue_after_map_failure(void *opaque) |
| 65 | { | 66 | { |
| 66 | - DMABlockState *dbs = (DMABlockState *)opaque; | 67 | + DMAAIOCB *dbs = (DMAAIOCB *)opaque; |
| 67 | 68 | ||
| 68 | dbs->bh = qemu_bh_new(reschedule_dma, dbs); | 69 | dbs->bh = qemu_bh_new(reschedule_dma, dbs); |
| 69 | qemu_bh_schedule(dbs->bh); | 70 | qemu_bh_schedule(dbs->bh); |
| @@ -71,11 +72,12 @@ static void continue_after_map_failure(void *opaque) | @@ -71,11 +72,12 @@ static void continue_after_map_failure(void *opaque) | ||
| 71 | 72 | ||
| 72 | static void dma_bdrv_cb(void *opaque, int ret) | 73 | static void dma_bdrv_cb(void *opaque, int ret) |
| 73 | { | 74 | { |
| 74 | - DMABlockState *dbs = (DMABlockState *)opaque; | 75 | + DMAAIOCB *dbs = (DMAAIOCB *)opaque; |
| 75 | target_phys_addr_t cur_addr, cur_len; | 76 | target_phys_addr_t cur_addr, cur_len; |
| 76 | void *mem; | 77 | void *mem; |
| 77 | int i; | 78 | int i; |
| 78 | 79 | ||
| 80 | + dbs->acb = NULL; | ||
| 79 | dbs->sector_num += dbs->iov.size / 512; | 81 | dbs->sector_num += dbs->iov.size / 512; |
| 80 | for (i = 0; i < dbs->iov.niov; ++i) { | 82 | for (i = 0; i < dbs->iov.niov; ++i) { |
| 81 | cpu_physical_memory_unmap(dbs->iov.iov[i].iov_base, | 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,10 +87,9 @@ static void dma_bdrv_cb(void *opaque, int ret) | ||
| 85 | qemu_iovec_reset(&dbs->iov); | 87 | qemu_iovec_reset(&dbs->iov); |
| 86 | 88 | ||
| 87 | if (dbs->sg_cur_index == dbs->sg->nsg || ret < 0) { | 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 | qemu_iovec_destroy(&dbs->iov); | 91 | qemu_iovec_destroy(&dbs->iov); |
| 90 | - qemu_aio_release(dbs->acb); | ||
| 91 | - qemu_free(dbs); | 92 | + qemu_aio_release(dbs); |
| 92 | return; | 93 | return; |
| 93 | } | 94 | } |
| 94 | 95 | ||
| @@ -112,11 +113,11 @@ static void dma_bdrv_cb(void *opaque, int ret) | @@ -112,11 +113,11 @@ static void dma_bdrv_cb(void *opaque, int ret) | ||
| 112 | } | 113 | } |
| 113 | 114 | ||
| 114 | if (dbs->is_write) { | 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 | } else { | 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,10 +126,10 @@ static BlockDriverAIOCB *dma_bdrv_io( | ||
| 125 | BlockDriverCompletionFunc *cb, void *opaque, | 126 | BlockDriverCompletionFunc *cb, void *opaque, |
| 126 | int is_write) | 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 | dbs->bs = bs; | 132 | dbs->bs = bs; |
| 131 | - dbs->acb = qemu_aio_get_pool(&dma_aio_pool, bs, cb, opaque); | ||
| 132 | dbs->sg = sg; | 133 | dbs->sg = sg; |
| 133 | dbs->sector_num = sector_num; | 134 | dbs->sector_num = sector_num; |
| 134 | dbs->sg_cur_index = 0; | 135 | dbs->sg_cur_index = 0; |
| @@ -137,7 +138,7 @@ static BlockDriverAIOCB *dma_bdrv_io( | @@ -137,7 +138,7 @@ static BlockDriverAIOCB *dma_bdrv_io( | ||
| 137 | dbs->bh = NULL; | 138 | dbs->bh = NULL; |
| 138 | qemu_iovec_init(&dbs->iov, sg->nsg); | 139 | qemu_iovec_init(&dbs->iov, sg->nsg); |
| 139 | dma_bdrv_cb(dbs, 0); | 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,12 +158,14 @@ BlockDriverAIOCB *dma_bdrv_write(BlockDriverState *bs, | ||
| 157 | 158 | ||
| 158 | static void dma_aio_cancel(BlockDriverAIOCB *acb) | 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 | void dma_helper_init(void) | 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 | } |