diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2015-07-30 00:13:24 +0200 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2015-07-30 00:13:24 +0200 |
commit | 4b979e4c611ce750d32b51737f837b485f43c69b (patch) | |
tree | 3bc56f2a22d2cf29bc183b67e74e1e8c0733efc0 /kernel/irq | |
parent | 1559f3b8d0527e24219149c95b3de5e7b2924828 (diff) | |
parent | cbfe8fa6cd672011c755c3cd85c9ffd4e2d10a6f (diff) | |
download | op-kernel-dev-4b979e4c611ce750d32b51737f837b485f43c69b.zip op-kernel-dev-4b979e4c611ce750d32b51737f837b485f43c69b.tar.gz |
Merge branch 'linus' into irq/core
Pull in upstream fixes before applying conflicting changes
Diffstat (limited to 'kernel/irq')
-rw-r--r-- | kernel/irq/internals.h | 4 | ||||
-rw-r--r-- | kernel/irq/resend.c | 18 |
2 files changed, 13 insertions, 9 deletions
diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h index c8dd8d7..eee4b38 100644 --- a/kernel/irq/internals.h +++ b/kernel/irq/internals.h @@ -75,12 +75,8 @@ extern void unmask_threaded_irq(struct irq_desc *desc); #ifdef CONFIG_SPARSE_IRQ static inline void irq_mark_irq(unsigned int irq) { } -extern void irq_lock_sparse(void); -extern void irq_unlock_sparse(void); #else extern void irq_mark_irq(unsigned int irq); -static inline void irq_lock_sparse(void) { } -static inline void irq_unlock_sparse(void) { } #endif extern void init_kstat_irqs(struct irq_desc *desc, int node, int nr); diff --git a/kernel/irq/resend.c b/kernel/irq/resend.c index 32fc47c..dd95f44 100644 --- a/kernel/irq/resend.c +++ b/kernel/irq/resend.c @@ -77,13 +77,21 @@ void check_irq_resend(struct irq_desc *desc) 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); |