irq/core change for v3.8
Linus,
Please pull the latest irq-core-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq-core-for-linus
HEAD: 04aa530ec04f61875b99c12721162e2964e3318c genirq: Always force thread affinity
Affinity fixes and a nested threaded IRQ handling fix.
Thanks,
Ingo
------------------>
Sankara Muthukrishnan (1):
irq: Set CPU affinity right on thread creation
Thomas Gleixner (2):
genirq: Provide means to retrigger parent
genirq: Always force thread affinity
include/linux/irq.h | 9 +++++++++ include/linux/irqdesc.h | 3 +++ kernel/irq/chip.c | 1 + kernel/irq/manage.c | 41 +++++++++++++++++++++++++++++++++++++++-- kernel/irq/resend.c | 8 ++++++++ 5 files changed, 60 insertions(+), 2 deletions(-)
include/linux/irq.h +9 -0
@@ -392,6 +392,15 @@ static inline void irq_move_masked_irq(struct irq_data *data) { }extern int no_irq_affinity; +#ifdef CONFIG_HARDIRQS_SW_RESEND +int irq_set_parent (int irq,int parent_irq); +#else +static inline int irq_set_parent (int irq,int parent_irq) +{ +return 0 ; +} +#endif +/* * Built-in IRQ handlers for various IRQ types, * callable via desc->handle_irq()
include/linux/irqdesc.h +3 -0
@@ -11,6 +11,8 @@struct irq_affinity_notify ;struct proc_dir_entry ;struct module ; +struct irq_desc ; +/** * struct irq_desc - interrupt descriptor * @irq_data: per irq and chip data passed down to chip functions
@@ -65,6 +67,7 @@ struct irq_desc {#ifdef CONFIG_PROC_FS struct proc_dir_entry *dir;#endif +int parent_irq;struct module *owner;const char *name; }____cacheline_internodealigned_in_smp ;
kernel/irq/chip.c +1 -0
@@ -272,6 +272,7 @@ void handle_nested_irq(unsigned int irq)raw_spin_lock_irq (&desc->lock); + desc->istate &= ~(IRQS_REPLAY |IRQS_WAITING );kstat_incr_irqs_this_cpu (irq, desc); action = desc->action;
kernel/irq/manage.c +39 -2
73 lines not on this page · raw message
kernel/irq/resend.c +8 -0
@@ -74,6 +74,14 @@ void check_irq_resend(struct irq_desc *desc, unsigned int irq)if (!desc->irq_data.chip->irq_retrigger || !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 (desc->parent_irq && +irq_settings_is_nested_thread (desc)) + irq = desc->parent_irq;/* Set it pending and activate the softirq: */ set_bit (irq, irqs_resend);tasklet_schedule (&resend_tasklet);