Skip to contentSkip to conversation

irq/core change for v3.8

GIT PULL Ingo Molnar 1 participant 1 message Dec 11, 2012 IRQ

lore
Share & tools
lore
#0 lore raw

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
index 216b0ba..526f10a 100644
@@ -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
index 0ba014c..623325e 100644
@@ -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
index 57d86d0..3aca9f2 100644
@@ -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
index 6454db7..9065107 100644
@@ -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);