aboutsummaryrefslogtreecommitdiff
path: root/hw/openpic.c
diff options
context:
space:
mode:
authorScott Wood <scottwood@freescale.com>2012-12-21 16:15:47 +0000
committerAlexander Graf <agraf@suse.de>2013-01-07 17:37:10 +0100
commit47f73749c61765f7a898ac88f11995368740da10 (patch)
tree8131c8329be0fd224ecc5577a97bd3671c0979a0 /hw/openpic.c
parent3c94378e2c500b6211e95d7457f4a9959955c3d1 (diff)
downloadqemu-47f73749c61765f7a898ac88f11995368740da10.zip
qemu-47f73749c61765f7a898ac88f11995368740da10.tar.gz
qemu-47f73749c61765f7a898ac88f11995368740da10.tar.bz2
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 <scottwood@freescale.com> Signed-off-by: Alexander Graf <agraf@suse.de>
Diffstat (limited to 'hw/openpic.c')
-rw-r--r--hw/openpic.c11
1 files changed, 0 insertions, 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;
}