diff options
author | Scott Wood <scottwood@freescale.com> | 2012-12-21 16:15:47 +0000 |
---|---|---|
committer | Alexander Graf <agraf@suse.de> | 2013-01-07 17:37:10 +0100 |
commit | 47f73749c61765f7a898ac88f11995368740da10 (patch) | |
tree | 8131c8329be0fd224ecc5577a97bd3671c0979a0 /hw/openpic.c | |
parent | 3c94378e2c500b6211e95d7457f4a9959955c3d1 (diff) | |
download | qemu-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.c | 11 |
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; } |