From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=40621 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PkL4G-0000vG-Lm for qemu-devel@nongnu.org; Tue, 01 Feb 2011 13:35:09 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PkL4C-0002Ci-Do for qemu-devel@nongnu.org; Tue, 01 Feb 2011 13:35:08 -0500 Received: from cantor2.suse.de ([195.135.220.15]:59693 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PkL4C-0002Ce-2g for qemu-devel@nongnu.org; Tue, 01 Feb 2011 13:35:04 -0500 From: Alexander Graf Date: Tue, 1 Feb 2011 19:35:01 +0100 Message-Id: <1296585301-15510-1-git-send-email-agraf@suse.de> In-Reply-To: <1296571892-12702-1-git-send-email-agraf@suse.de> References: <1296571892-12702-1-git-send-email-agraf@suse.de> Subject: [Qemu-devel] [PATCH 7/7] ahci: work around bug with level interrupts List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel Developers Cc: Kevin Wolf , Joerg Roedel , Sebastian Herbszt When using level based interrupts, the interrupt is treated the same as an edge triggered one: leaving the line up does not retrigger the interrupt. In fact, when not lowering the line, we won't ever get a new interrupt inside the guest. So let's always retrigger an interrupt as soon as the OS ack'ed something on the device. This way we're sure the guest doesn't starve on interrupts until someone fixes the actual interrupt path. Signed-off-by: Alexander Graf --- v2 -> v3: - add comment about the interrupt hack --- hw/ide/ahci.c | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-) diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c index 98bdf70..95e1cf7 100644 --- a/hw/ide/ahci.c +++ b/hw/ide/ahci.c @@ -152,11 +152,15 @@ static void ahci_check_irq(AHCIState *s) } } + /* XXX We lower the interrupt line here because of a bug with interrupt + handling in Qemu. When leaving a line up, the interrupt does + not get retriggered automatically currently. Once that bug is fixed, + this workaround is not necessary anymore and we only need to lower + in the else branch. */ + ahci_irq_lower(s, NULL); if (s->control_regs.irqstatus && (s->control_regs.ghc & HOST_CTL_IRQ_EN)) { ahci_irq_raise(s, NULL); - } else { - ahci_irq_lower(s, NULL); } } -- 1.6.0.2