From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NDGGB-0006eS-Ab for qemu-devel@nongnu.org; Wed, 25 Nov 2009 06:42:11 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NDGG6-0006bz-9E for qemu-devel@nongnu.org; Wed, 25 Nov 2009 06:42:10 -0500 Received: from [199.232.76.173] (port=60763 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NDGG5-0006be-NL for qemu-devel@nongnu.org; Wed, 25 Nov 2009 06:42:05 -0500 Received: from mx1.redhat.com ([209.132.183.28]:23665) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NDGG5-00016X-8k for qemu-devel@nongnu.org; Wed, 25 Nov 2009 06:42:05 -0500 Date: Wed, 25 Nov 2009 13:39:24 +0200 From: "Michael S. Tsirkin" Message-ID: <20091125113924.GF9322@redhat.com> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: Subject: [Qemu-devel] [PATCH 5/5] msix: clear pending bit of an unused vector List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org, anthony@codemonkey.ws PCI spec states: if a masked vector has its Pending bit set, and the associated underlying interrupt events are somehow satisfied (usually by software though the exact manner is function-specific), the function must clear the Pending bit, to avoid sending a spurious interrupt message later when software unmasks the vector. In our case this happens if vector becomes unused. Clear pending bit in this case. Signed-off-by: Michael S. Tsirkin --- hw/msix.c | 27 +++++++++++++++++---------- 1 files changed, 17 insertions(+), 10 deletions(-) diff --git a/hw/msix.c b/hw/msix.c index a60ea95..0baedef 100644 --- a/hw/msix.c +++ b/hw/msix.c @@ -108,14 +108,6 @@ static int msix_add_config(struct PCIDevice *pdev, unsigned short nentries, return 0; } -static void msix_free_irq_entries(PCIDevice *dev) -{ - int vector; - - for (vector = 0; vector < dev->msix_entries_nr; ++vector) - dev->msix_entry_used[vector] = 0; -} - static uint32_t msix_mmio_readl(void *opaque, target_phys_addr_t addr) { PCIDevice *dev = opaque; @@ -299,6 +291,16 @@ err_index: return ret; } +static void msix_free_irq_entries(PCIDevice *dev) +{ + int vector; + + for (vector = 0; vector < dev->msix_entries_nr; ++vector) { + dev->msix_entry_used[vector] = 0; + msix_clr_pending(dev, vector); + } +} + /* Clean up resources for the device. */ int msix_uninit(PCIDevice *dev) { @@ -415,8 +417,13 @@ int msix_vector_use(PCIDevice *dev, unsigned vector) /* Mark vector as unused. */ void msix_vector_unuse(PCIDevice *dev, unsigned vector) { - if (vector < dev->msix_entries_nr && dev->msix_entry_used[vector]) - --dev->msix_entry_used[vector]; + if (vector >= dev->msix_entries_nr || !dev->msix_entry_used[vector]) { + return; + } + if (--dev->msix_entry_used[vector]) { + return; + } + msix_clr_pending(dev, vector); } void msix_unuse_all_vectors(PCIDevice *dev) -- 1.6.5.2.143.g8cc62