diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-02-03 12:17:41 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-02-03 12:17:41 -0500 |
| commit | aba99437f5af7a419a82438f7fab16bb3ddd9b44 (patch) | |
| tree | b3b36b2d1c4b462519292f8c56dd2098ede637a1 /kernel | |
| parent | 49abda98929a100cd6309da8dca29db84c72c721 (diff) | |
| parent | f1a06390d013244e721372b3f9b66e39b6429c71 (diff) | |
Merge branch 'irq-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'irq-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
genirq: Prevent irq storm on migration
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/irq/migration.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/kernel/irq/migration.c b/kernel/irq/migration.c index 1d2541940480..441fd629ff04 100644 --- a/kernel/irq/migration.c +++ b/kernel/irq/migration.c | |||
| @@ -56,6 +56,7 @@ void move_masked_irq(int irq) | |||
| 56 | void move_native_irq(int irq) | 56 | void move_native_irq(int irq) |
| 57 | { | 57 | { |
| 58 | struct irq_desc *desc = irq_to_desc(irq); | 58 | struct irq_desc *desc = irq_to_desc(irq); |
| 59 | bool masked; | ||
| 59 | 60 | ||
| 60 | if (likely(!(desc->status & IRQ_MOVE_PENDING))) | 61 | if (likely(!(desc->status & IRQ_MOVE_PENDING))) |
| 61 | return; | 62 | return; |
| @@ -63,8 +64,15 @@ void move_native_irq(int irq) | |||
| 63 | if (unlikely(desc->status & IRQ_DISABLED)) | 64 | if (unlikely(desc->status & IRQ_DISABLED)) |
| 64 | return; | 65 | return; |
| 65 | 66 | ||
| 66 | desc->irq_data.chip->irq_mask(&desc->irq_data); | 67 | /* |
| 68 | * Be careful vs. already masked interrupts. If this is a | ||
| 69 | * threaded interrupt with ONESHOT set, we can end up with an | ||
| 70 | * interrupt storm. | ||
| 71 | */ | ||
| 72 | masked = desc->status & IRQ_MASKED; | ||
| 73 | if (!masked) | ||
| 74 | desc->irq_data.chip->irq_mask(&desc->irq_data); | ||
| 67 | move_masked_irq(irq); | 75 | move_masked_irq(irq); |
| 68 | desc->irq_data.chip->irq_unmask(&desc->irq_data); | 76 | if (!masked) |
| 77 | desc->irq_data.chip->irq_unmask(&desc->irq_data); | ||
| 69 | } | 78 | } |
| 70 | |||
