Revision 7403b14e dma-helpers.c
b/dma-helpers.c | ||
---|---|---|
70 | 70 |
qemu_bh_schedule(dbs->bh); |
71 | 71 |
} |
72 | 72 |
|
73 |
static void dma_bdrv_cb(void *opaque, int ret)
|
|
73 |
static void dma_bdrv_unmap(DMAAIOCB *dbs)
|
|
74 | 74 |
{ |
75 |
DMAAIOCB *dbs = (DMAAIOCB *)opaque; |
|
76 |
target_phys_addr_t cur_addr, cur_len; |
|
77 |
void *mem; |
|
78 | 75 |
int i; |
79 | 76 |
|
80 |
dbs->acb = NULL; |
|
81 |
dbs->sector_num += dbs->iov.size / 512; |
|
82 | 77 |
for (i = 0; i < dbs->iov.niov; ++i) { |
83 | 78 |
cpu_physical_memory_unmap(dbs->iov.iov[i].iov_base, |
84 | 79 |
dbs->iov.iov[i].iov_len, !dbs->is_write, |
85 | 80 |
dbs->iov.iov[i].iov_len); |
86 | 81 |
} |
82 |
} |
|
83 |
|
|
84 |
void dma_bdrv_cb(void *opaque, int ret) |
|
85 |
{ |
|
86 |
DMAAIOCB *dbs = (DMAAIOCB *)opaque; |
|
87 |
target_phys_addr_t cur_addr, cur_len; |
|
88 |
void *mem; |
|
89 |
|
|
90 |
dbs->acb = NULL; |
|
91 |
dbs->sector_num += dbs->iov.size / 512; |
|
92 |
dma_bdrv_unmap(dbs); |
|
87 | 93 |
qemu_iovec_reset(&dbs->iov); |
88 | 94 |
|
89 | 95 |
if (dbs->sg_cur_index == dbs->sg->nsg || ret < 0) { |
... | ... | |
119 | 125 |
dbs->acb = bdrv_aio_readv(dbs->bs, dbs->sector_num, &dbs->iov, |
120 | 126 |
dbs->iov.size / 512, dma_bdrv_cb, dbs); |
121 | 127 |
} |
128 |
if (!dbs->acb) { |
|
129 |
dma_bdrv_unmap(dbs); |
|
130 |
qemu_iovec_destroy(&dbs->iov); |
|
131 |
return; |
|
132 |
} |
|
122 | 133 |
} |
123 | 134 |
|
124 | 135 |
static BlockDriverAIOCB *dma_bdrv_io( |
... | ... | |
138 | 149 |
dbs->bh = NULL; |
139 | 150 |
qemu_iovec_init(&dbs->iov, sg->nsg); |
140 | 151 |
dma_bdrv_cb(dbs, 0); |
152 |
if (!dbs->acb) { |
|
153 |
qemu_aio_release(dbs); |
|
154 |
return NULL; |
|
155 |
} |
|
141 | 156 |
return &dbs->common; |
142 | 157 |
} |
143 | 158 |
|
Also available in: Unified diff