diff options
Diffstat (limited to 'kernel/irq/resend.c')
-rw-r--r-- | kernel/irq/resend.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/kernel/irq/resend.c b/kernel/irq/resend.c index 9065107f083e..7a5237a1bce5 100644 --- a/kernel/irq/resend.c +++ b/kernel/irq/resend.c | |||
@@ -75,13 +75,21 @@ void check_irq_resend(struct irq_desc *desc, unsigned int irq) | |||
75 | !desc->irq_data.chip->irq_retrigger(&desc->irq_data)) { | 75 | !desc->irq_data.chip->irq_retrigger(&desc->irq_data)) { |
76 | #ifdef CONFIG_HARDIRQS_SW_RESEND | 76 | #ifdef CONFIG_HARDIRQS_SW_RESEND |
77 | /* | 77 | /* |
78 | * If the interrupt has a parent irq and runs | 78 | * If the interrupt is running in the thread |
79 | * in the thread context of the parent irq, | 79 | * context of the parent irq we need to be |
80 | * retrigger the parent. | 80 | * careful, because we cannot trigger it |
81 | * directly. | ||
81 | */ | 82 | */ |
82 | if (desc->parent_irq && | 83 | if (irq_settings_is_nested_thread(desc)) { |
83 | irq_settings_is_nested_thread(desc)) | 84 | /* |
85 | * If the parent_irq is valid, we | ||
86 | * retrigger the parent, otherwise we | ||
87 | * do nothing. | ||
88 | */ | ||
89 | if (!desc->parent_irq) | ||
90 | return; | ||
84 | irq = desc->parent_irq; | 91 | irq = desc->parent_irq; |
92 | } | ||
85 | /* Set it pending and activate the softirq: */ | 93 | /* Set it pending and activate the softirq: */ |
86 | set_bit(irq, irqs_resend); | 94 | set_bit(irq, irqs_resend); |
87 | tasklet_schedule(&resend_tasklet); | 95 | tasklet_schedule(&resend_tasklet); |