From 99cc598924d9686e497fa9ddd7889d6be27f3084 Mon Sep 17 00:00:00 2001 From: Stefan Hajnoczi Date: Thu, 8 May 2014 16:34:49 +0200 Subject: block/raw-win32: create one QEMUWin32AIOState per BDRVRawState Each QEMUWin32AIOState event notifier is associated with an AioContext. Since BlockDriverState instances can use different AioContexts we cannot continue to use a global QEMUWin32AIOState. Let each BDRVRawState have its own QEMUWin32AIOState and free it when BDRVRawState is closed. Reviewed-by: Paolo Bonzini Signed-off-by: Stefan Hajnoczi --- block/win32-aio.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'block/win32-aio.c') diff --git a/block/win32-aio.c b/block/win32-aio.c index 5d1d199b61..b43b1667ee 100644 --- a/block/win32-aio.c +++ b/block/win32-aio.c @@ -204,3 +204,11 @@ out_free_state: g_free(s); return NULL; } + +void win32_aio_cleanup(QEMUWin32AIOState *aio) +{ + qemu_aio_set_event_notifier(&aio->e, NULL); + CloseHandle(aio->hIOCP); + event_notifier_cleanup(&aio->e); + g_free(aio); +} -- cgit v1.2.1 From 85ebd381fdae2d551cd6a0ffff47ab08734edf12 Mon Sep 17 00:00:00 2001 From: Stefan Hajnoczi Date: Thu, 8 May 2014 16:34:50 +0200 Subject: block/raw-win32: implement .bdrv_detach/attach_aio_context() Drop the assumption that we're using the main AioContext for raw-win32. Convert the aio-win32 code to support detach/attach and replace qemu_aio_wait() with aio_poll(). The .bdrv_detach/attach_aio_context() interfaces move the aio-win32 event notifier from the old to the new AioContext. Cc: Paolo Bonzini Signed-off-by: Stefan Hajnoczi --- block/win32-aio.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) (limited to 'block/win32-aio.c') diff --git a/block/win32-aio.c b/block/win32-aio.c index b43b1667ee..8e417f70ae 100644 --- a/block/win32-aio.c +++ b/block/win32-aio.c @@ -40,6 +40,7 @@ struct QEMUWin32AIOState { HANDLE hIOCP; EventNotifier e; int count; + bool is_aio_context_attached; }; typedef struct QEMUWin32AIOCB { @@ -114,7 +115,7 @@ static void win32_aio_cancel(BlockDriverAIOCB *blockacb) * wait for completion. */ while (!HasOverlappedIoCompleted(&waiocb->ov)) { - qemu_aio_wait(); + aio_poll(bdrv_get_aio_context(blockacb->bs), true); } } @@ -180,6 +181,20 @@ int win32_aio_attach(QEMUWin32AIOState *aio, HANDLE hfile) } } +void win32_aio_detach_aio_context(QEMUWin32AIOState *aio, + AioContext *old_context) +{ + aio_set_event_notifier(old_context, &aio->e, NULL); + aio->is_aio_context_attached = false; +} + +void win32_aio_attach_aio_context(QEMUWin32AIOState *aio, + AioContext *new_context) +{ + aio->is_aio_context_attached = true; + aio_set_event_notifier(new_context, &aio->e, win32_aio_completion_cb); +} + QEMUWin32AIOState *win32_aio_init(void) { QEMUWin32AIOState *s; @@ -194,8 +209,6 @@ QEMUWin32AIOState *win32_aio_init(void) goto out_close_efd; } - qemu_aio_set_event_notifier(&s->e, win32_aio_completion_cb); - return s; out_close_efd: @@ -207,7 +220,7 @@ out_free_state: void win32_aio_cleanup(QEMUWin32AIOState *aio) { - qemu_aio_set_event_notifier(&aio->e, NULL); + assert(!aio->is_aio_context_attached); CloseHandle(aio->hIOCP); event_notifier_cleanup(&aio->e); g_free(aio); -- cgit v1.2.1