X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=kernel%2Fkernel%2Firq%2Fresend.c;fp=kernel%2Fkernel%2Firq%2Fresend.c;h=7a5237a1bce5b5626d74cdb377f8e5a900d06f7a;hb=fdb8b20906f3546ba6c2f9f0686d8a5189516ba3;hp=9065107f083e90e3fbd3c38f2fbc164d11ff2b3c;hpb=cc84a1f21026270463b580f2564f9d71912b20db;p=kvmfornfv.git diff --git a/kernel/kernel/irq/resend.c b/kernel/kernel/irq/resend.c index 9065107f0..7a5237a1b 100644 --- a/kernel/kernel/irq/resend.c +++ b/kernel/kernel/irq/resend.c @@ -75,13 +75,21 @@ void check_irq_resend(struct irq_desc *desc, unsigned int irq) !desc->irq_data.chip->irq_retrigger(&desc->irq_data)) { #ifdef CONFIG_HARDIRQS_SW_RESEND /* - * If the interrupt has a parent irq and runs - * in the thread context of the parent irq, - * retrigger the parent. + * If the interrupt is running in the thread + * context of the parent irq we need to be + * careful, because we cannot trigger it + * directly. */ - if (desc->parent_irq && - irq_settings_is_nested_thread(desc)) + if (irq_settings_is_nested_thread(desc)) { + /* + * If the parent_irq is valid, we + * retrigger the parent, otherwise we + * do nothing. + */ + if (!desc->parent_irq) + return; irq = desc->parent_irq; + } /* Set it pending and activate the softirq: */ set_bit(irq, irqs_resend); tasklet_schedule(&resend_tasklet);