From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MGyej-0005TB-9K for qemu-devel@nongnu.org; Wed, 17 Jun 2009 13:10:37 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MGyeW-0005FL-K4 for qemu-devel@nongnu.org; Wed, 17 Jun 2009 13:10:29 -0400 Received: from [199.232.76.173] (port=54833 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MGyeW-0005Ej-Bp for qemu-devel@nongnu.org; Wed, 17 Jun 2009 13:10:24 -0400 Received: from mx2.redhat.com ([66.187.237.31]:35969) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MGyeU-0007zB-Sm for qemu-devel@nongnu.org; Wed, 17 Jun 2009 13:10:23 -0400 From: Glauber Costa Date: Wed, 17 Jun 2009 13:10:00 -0400 Message-Id: <1245258604-2843-12-git-send-email-glommer@redhat.com> In-Reply-To: <1245258604-2843-11-git-send-email-glommer@redhat.com> References: <1245258604-2843-1-git-send-email-glommer@redhat.com> <1245258604-2843-2-git-send-email-glommer@redhat.com> <1245258604-2843-3-git-send-email-glommer@redhat.com> <1245258604-2843-4-git-send-email-glommer@redhat.com> <1245258604-2843-5-git-send-email-glommer@redhat.com> <1245258604-2843-6-git-send-email-glommer@redhat.com> <1245258604-2843-7-git-send-email-glommer@redhat.com> <1245258604-2843-8-git-send-email-glommer@redhat.com> <1245258604-2843-9-git-send-email-glommer@redhat.com> <1245258604-2843-10-git-send-email-glommer@redhat.com> <1245258604-2843-11-git-send-email-glommer@redhat.com> Subject: [Qemu-devel] [PATCH 11/15] fix qemu_aio_flush List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Andrea Arcangeli , aliguori@us.ibm.com, Christoph Hellwig From: Andrea Arcangeli qemu_aio_wait by invoking the bh or one of the aio completion callbacks, could end up submitting new pending aio, breaking the invariant that qemu_aio_flush returns only when no pending aio is outstanding (possibly a problem for migration as such). Signed-off-by: Andrea Arcangeli Signed-off-by: Christoph Hellwig Acked-by: Kevin Wolf Signed-off-by: Glauber Costa --- aio.c | 8 ++++++-- qemu-aio.h | 7 ++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/aio.c b/aio.c index 11fbb6c..dc9b85d 100644 --- a/aio.c +++ b/aio.c @@ -103,11 +103,15 @@ void qemu_aio_flush(void) do { ret = 0; + /* + * If there are pending emulated aio start them now so flush + * will be able to return 1. + */ + qemu_aio_wait(); + LIST_FOREACH(node, &aio_handlers, node) { ret |= node->io_flush(node->opaque); } - - qemu_aio_wait(); } while (ret > 0); } diff --git a/qemu-aio.h b/qemu-aio.h index 7967829..f262344 100644 --- a/qemu-aio.h +++ b/qemu-aio.h @@ -24,9 +24,10 @@ typedef int (AioFlushHandler)(void *opaque); * outstanding AIO operations have been completed or cancelled. */ void qemu_aio_flush(void); -/* Wait for a single AIO completion to occur. This function will until a - * single AIO opeartion has completed. It is intended to be used as a looping - * primative when simulating synchronous IO based on asynchronous IO. */ +/* Wait for a single AIO completion to occur. This function will wait + * until a single AIO event has completed and it will ensure something + * has moved before returning. This can issue new pending aio as + * result of executing I/O completion or bh callbacks. */ void qemu_aio_wait(void); /* Register a file descriptor and associated callbacks. Behaves very similarly -- 1.6.2.2