Backport c07a9008ac6985cd5a15909c2b9977d982defc12 from qemu upstream:
Convert vectored aio emulation to use a dedicated pool (Avi Kivity)
---
diff -r 5a32ceb2bb1a block.c
--- a/block.c Fri Oct 02 13:38:11 2009 +0100
+++ b/block.c Fri Oct 02 13:38:28 2009 +0100
@@ -40,6 +40,8 @@
#define SECTOR_BITS 9
#define SECTOR_SIZE (1 << SECTOR_BITS)
+
+static AIOPool vectored_aio_pool;
typedef struct BlockDriverAIOCBSync {
BlockDriverAIOCB common;
@@ -1369,6 +1371,13 @@
BlockDriverAIOCB *this_aiocb;
} VectorTranslationState;
+static void bdrv_aio_cancel_vector(BlockDriverAIOCB *acb)
+{
+ VectorTranslationState *s = acb->opaque;
+
+ bdrv_aio_cancel(s->aiocb);
+}
+
static void bdrv_aio_rw_vector_cb(void *opaque, int ret)
{
VectorTranslationState *s = opaque;
@@ -1391,7 +1400,8 @@
{
VectorTranslationState *s = qemu_mallocz(sizeof(*s));
- BlockDriverAIOCB *aiocb = qemu_aio_get(bs, cb, opaque);
+ BlockDriverAIOCB *aiocb = qemu_aio_get_pool(&vectored_aio_pool, bs,
+ cb, opaque);
s->this_aiocb = aiocb;
s->iov = iov;
@@ -1480,11 +1490,6 @@
void bdrv_aio_cancel(BlockDriverAIOCB *acb)
{
- if (acb->cb == bdrv_aio_rw_vector_cb) {
- VectorTranslationState *s = acb->opaque;
- acb = s->aiocb;
- }
-
acb->pool->cancel(acb);
}
@@ -1611,6 +1616,9 @@
void bdrv_init(void)
{
+ aio_pool_init(&vectored_aio_pool, sizeof(BlockDriverAIOCB),
+ bdrv_aio_cancel_vector);
+
bdrv_register(&bdrv_raw);
#ifndef CONFIG_STUBDOM
bdrv_register(&bdrv_host_device);
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|