On Fri, Jul 17, 2020 at 07:19:38PM +0200, Philippe Mathieu-Daudé wrote:
Last minute chat:
19:01 <stefanha> f4bug: use bdrv_aio_cancel_async() if possible because it
won't block the current thread.
19:02 <stefanha> f4bug: For example, in device emulation code where the guest
has requested to cancel an I/O request it's often possible to use the async version.
19:02 <stefanha> f4bug: But in synchronous code like device reset it may be
necessary to use the synchronous (blocking) bdrv_aio_cancel() API instead. :(
19:14 <stefanha> f4bug: The way to decide is: will the current function return
to the event loop and is there someone who will handle the request completion
callback when cancel finishes?
19:14 <stefanha> f4bug: If the next line of code requires the request to
finished then async cancel cannot be used.
19:15 <stefanha> f4bug: On the other hand, if the function can return and it's
okay for the request to cancel at some future time then you can use async.
So I'll revisit this patch :)
---
hw/ide/core.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/hw/ide/core.c b/hw/ide/core.c
index d997a78e47..e3a9ce7d25 100644
--- a/hw/ide/core.c
+++ b/hw/ide/core.c
@@ -1315,7 +1315,8 @@ static void ide_reset(IDEState *s)
trace_ide_reset(s);
if (s->pio_aiocb) {
- blk_aio_cancel(s->pio_aiocb);
+ /* If there is a pending AIO callback, invoke it now. */
+ blk_aio_cancel_async(s->pio_aiocb);
This is a place where an async call is not allowed. The completion
function must be called right away (synchronously) before we can
continue resetting the device.
I sent a patch that allows bdrv_aio_cancel() to find the AioContext so
it can call aio_poll().
Stefan