Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 56927
b: refs/heads/master
c: 92ea772
h: refs/heads/master
i:
  56925: 74ce242
  56923: ed3cd0a
  56919: 6243437
  56911: f60716b
  56895: 2d6c5d6
v: v3
  • Loading branch information
Linus Torvalds committed May 24, 2007
1 parent ae0500a commit c4347ef
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 10 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: db2668fdbeb2e3c95ebadf95856c9e31a8a8d569
refs/heads/master: 92ea77275b5345c1300433f28689493dc4163f24
46 changes: 37 additions & 9 deletions trunk/kernel/irq/spurious.c
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,39 @@ report_bad_irq(unsigned int irq, struct irq_desc *desc, irqreturn_t action_ret)
}
}

static inline int try_misrouted_irq(unsigned int irq, struct irq_desc *desc, irqreturn_t action_ret)
{
struct irqaction *action;

if (!irqfixup)
return 0;

/* We didn't actually handle the IRQ - see if it was misrouted? */
if (action_ret == IRQ_NONE)
return 1;

/*
* But for 'irqfixup == 2' we also do it for handled interrupts if
* they are marked as IRQF_IRQPOLL (or for irq zero, which is the
* traditional PC timer interrupt.. Legacy)
*/
if (irqfixup < 2)
return 0;

if (!irq)
return 1;

/*
* Since we don't get the descriptor lock, "action" can
* change under us. We don't really care, but we don't
* want to follow a NULL pointer. So tell the compiler to
* just load it once by using a barrier.
*/
action = desc->action;
barrier();
return action && (action->flags & IRQF_IRQPOLL);
}

void note_interrupt(unsigned int irq, struct irq_desc *desc,
irqreturn_t action_ret)
{
Expand All @@ -144,15 +177,10 @@ void note_interrupt(unsigned int irq, struct irq_desc *desc,
report_bad_irq(irq, desc, action_ret);
}

if (unlikely(irqfixup)) {
/* Don't punish working computers */
if ((irqfixup == 2 && ((irq == 0) ||
(desc->action->flags & IRQF_IRQPOLL))) ||
action_ret == IRQ_NONE) {
int ok = misrouted_irq(irq);
if (action_ret == IRQ_NONE)
desc->irqs_unhandled -= ok;
}
if (unlikely(try_misrouted_irq(irq, desc, action_ret))) {
int ok = misrouted_irq(irq);
if (action_ret == IRQ_NONE)
desc->irqs_unhandled -= ok;
}

desc->irq_count++;
Expand Down

0 comments on commit c4347ef

Please sign in to comment.