Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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

+11 -3
+11 -3
kernel/irq/migration.c
··· 56 56 void move_native_irq(int irq) 57 57 { 58 58 struct irq_desc *desc = irq_to_desc(irq); 59 + bool masked; 59 60 60 61 if (likely(!(desc->status & IRQ_MOVE_PENDING))) 61 62 return; ··· 64 63 if (unlikely(desc->status & IRQ_DISABLED)) 65 64 return; 66 65 67 - desc->irq_data.chip->irq_mask(&desc->irq_data); 66 + /* 67 + * Be careful vs. already masked interrupts. If this is a 68 + * threaded interrupt with ONESHOT set, we can end up with an 69 + * interrupt storm. 70 + */ 71 + masked = desc->status & IRQ_MASKED; 72 + if (!masked) 73 + desc->irq_data.chip->irq_mask(&desc->irq_data); 68 74 move_masked_irq(irq); 69 - desc->irq_data.chip->irq_unmask(&desc->irq_data); 75 + if (!masked) 76 + desc->irq_data.chip->irq_unmask(&desc->irq_data); 70 77 } 71 -