From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:37181) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TmEdb-0000bJ-Cj for qemu-devel@nongnu.org; Fri, 21 Dec 2012 21:16:37 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TmEdS-0006Eu-D7 for qemu-devel@nongnu.org; Fri, 21 Dec 2012 21:16:31 -0500 From: Scott Wood Date: Fri, 21 Dec 2012 20:15:47 -0600 Message-ID: <1356142552-13453-11-git-send-email-scottwood@freescale.com> In-Reply-To: <1356142552-13453-1-git-send-email-scottwood@freescale.com> References: <1356142552-13453-1-git-send-email-scottwood@freescale.com> MIME-Version: 1.0 Content-Type: text/plain Subject: [Qemu-devel] [PATCH 10/15] Revert "openpic: Accelerate pending irq search" List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Alexander Graf Cc: Scott Wood , qemu-ppc@nongnu.org, qemu-devel@nongnu.org This reverts commit a9bd83f4c65de0058659ede009fa1a241f379edd. This counting approach is not robust against setting a bit that was already set, or clearing a bit that was already clear. Perhaps that is considered a bug, but besides the lack of any documentation for that restriction, it's a pretty unpleasant way for the problem to manifest itself. It could be made more robust by testing the current value of the bit before changing the count, but a later patch speeds up IRQ_check in all cases, not just when there's nothing pending. Hopefully that should be adequate to address performance concerns. Signed-off-by: Scott Wood --- hw/openpic.c | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/hw/openpic.c b/hw/openpic.c index e2e7079..cc3e514 100644 --- a/hw/openpic.c +++ b/hw/openpic.c @@ -181,7 +181,6 @@ typedef struct IRQ_queue_t { uint32_t queue[BF_WIDTH(MAX_IRQ)]; int next; int priority; - int pending; /* nr of pending bits in queue */ } IRQ_queue_t; typedef struct IRQ_src_t { @@ -270,13 +269,11 @@ typedef struct OpenPICState { static inline void IRQ_setbit(IRQ_queue_t *q, int n_IRQ) { - q->pending++; set_bit(q->queue, n_IRQ); } static inline void IRQ_resetbit(IRQ_queue_t *q, int n_IRQ) { - q->pending--; reset_bit(q->queue, n_IRQ); } @@ -292,12 +289,6 @@ static void IRQ_check(OpenPICState *opp, IRQ_queue_t *q) next = -1; priority = -1; - - if (!q->pending) { - /* IRQ bitmap is empty */ - goto out; - } - for (i = 0; i < opp->max_irq; i++) { if (IRQ_testbit(q, i)) { DPRINTF("IRQ_check: irq %d set ivpr_pr=%d pr=%d\n", @@ -308,8 +299,6 @@ static void IRQ_check(OpenPICState *opp, IRQ_queue_t *q) } } } - -out: q->next = next; q->priority = priority; } -- 1.7.9.5