From 47f73749c61765f7a898ac88f11995368740da10 Mon Sep 17 00:00:00 2001 From: Scott Wood Date: Fri, 21 Dec 2012 16:15:47 +0000 Subject: [PATCH] Revert "openpic: Accelerate pending irq search" 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 Signed-off-by: Alexander Graf --- hw/openpic.c | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/hw/openpic.c b/hw/openpic.c index 19e6280..2c238fb 100644 --- a/hw/openpic.c +++ b/hw/openpic.c @@ -183,7 +183,6 @@ typedef struct IRQQueue { uint32_t queue[BF_WIDTH(MAX_IRQ)]; int next; int priority; - int pending; /* nr of pending bits in queue */ } IRQQueue; typedef struct IRQSource { @@ -269,13 +268,11 @@ typedef struct OpenPICState { static inline void IRQ_setbit(IRQQueue *q, int n_IRQ) { - q->pending++; set_bit(q->queue, n_IRQ); } static inline void IRQ_resetbit(IRQQueue *q, int n_IRQ) { - q->pending--; reset_bit(q->queue, n_IRQ); } @@ -291,12 +288,6 @@ static void IRQ_check(OpenPICState *opp, IRQQueue *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", @@ -307,8 +298,6 @@ static void IRQ_check(OpenPICState *opp, IRQQueue *q) } } } - -out: q->next = next; q->priority = priority; } -- 2.7.4