From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:42889) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RJpOd-00033c-05 for qemu-devel@nongnu.org; Fri, 28 Oct 2011 12:35:08 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RJpOb-0005ca-Nb for qemu-devel@nongnu.org; Fri, 28 Oct 2011 12:35:06 -0400 Received: from mail-qy0-f173.google.com ([209.85.216.173]:49923) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RJpOb-0005bX-L4 for qemu-devel@nongnu.org; Fri, 28 Oct 2011 12:35:05 -0400 Received: by qyk10 with SMTP id 10so3904020qyk.4 for ; Fri, 28 Oct 2011 09:35:05 -0700 (PDT) Sender: Paolo Bonzini Message-ID: <4EAAD9B4.7040206@redhat.com> Date: Fri, 28 Oct 2011 18:35:00 +0200 From: Paolo Bonzini MIME-Version: 1.0 References: <1319811501-6823-1-git-send-email-kwolf@redhat.com> In-Reply-To: <1319811501-6823-1-git-send-email-kwolf@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH] dma: Avoid reentrancy in DMA transfer handlers List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Kevin Wolf Cc: qemu-devel@nongnu.org On 10/28/2011 04:18 PM, Kevin Wolf wrote: > With the conversion of the block layer to coroutines, bdrv_read/write > have changed to run a nested event loop that calls qemu_bh_poll. > Consequently a scheduled BH can be called while a DMA transfer handler > runs and this means that DMA_run becomes reentrant. > > Devices haven't been designed to cope with that, so instead of running a > nested transfer handler just wait for the next invocation of the BH from the > main loop. > > This fixes some problems with the floppy device. > > Signed-off-by: Kevin Wolf > --- > hw/dma.c | 9 +++++++++ > 1 files changed, 9 insertions(+), 0 deletions(-) > > diff --git a/hw/dma.c b/hw/dma.c > index 8a7302a..e8d6341 100644 > --- a/hw/dma.c > +++ b/hw/dma.c > @@ -358,6 +358,13 @@ static void DMA_run (void) > struct dma_cont *d; > int icont, ichan; > int rearm = 0; > + static int running = 0; > + > + if (running) { > + goto out; > + } else { > + running = 1; > + } > > d = dma_controllers; > > @@ -374,6 +381,8 @@ static void DMA_run (void) > } > } > > +out: > + running = 0; > if (rearm) > qemu_bh_schedule_idle(dma_bh); > } Hmm, I think you should set rearm = 1 to ensure the BH is run when ultimately you leave the sync read. Sorry for not spotting this before. Paolo