Merge branch 'linus' into irq/core
authorThomas Gleixner <tglx@linutronix.de>
Wed, 29 Jul 2015 22:13:24 +0000 (00:13 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Wed, 29 Jul 2015 22:13:24 +0000 (00:13 +0200)
Pull in upstream fixes before applying conflicting changes

1  2 
arch/powerpc/sysdev/ppc4xx_hsta_msi.c
drivers/irqchip/irq-gic-v3-its.c
drivers/irqchip/irq-gic.c
drivers/irqchip/irq-mips-gic.c
drivers/irqchip/spear-shirq.c
include/linux/device.h
kernel/irq/internals.h
kernel/irq/resend.c

Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -74,16 -74,22 +74,24 @@@ void check_irq_resend(struct irq_desc *
                if (!desc->irq_data.chip->irq_retrigger ||
                    !desc->irq_data.chip->irq_retrigger(&desc->irq_data)) {
  #ifdef CONFIG_HARDIRQS_SW_RESEND
 +                      unsigned int irq = irq_desc_get_irq(desc);
 +
                        /*
-                        * 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);