Re: x86: fix race in create_irq_nr on irq_desc

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Yinghai Lu
Date: Wednesday, February 3, 2010 - 12:31 pm

On 02/03/2010 09:42 AM, Brandon Philips wrote:

please try following patch in addition to 

http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=37ef2a...

diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index 7edafc7..14099ba 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -3280,12 +3280,9 @@ unsigned int create_irq_nr(unsigned int irq_want, int node)
 	}
 	spin_unlock_irqrestore(&vector_lock, flags);
 
-	if (irq > 0) {
-		dynamic_irq_init(irq);
-		/* restore it, in case dynamic_irq_init clear it */
-		if (desc_new)
-			desc_new->chip_data = cfg_new;
-	}
+	if (irq > 0)
+		dynamic_irq_init_keep_chip_data(irq);
+
 	return irq;
 }
 
diff --git a/include/linux/irq.h b/include/linux/irq.h
index d13492d..cd6b870 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -400,6 +400,7 @@ static inline int irq_has_action(unsigned int irq)
 
 /* Dynamic irq helper functions */
 extern void dynamic_irq_init(unsigned int irq);
+void dynamic_irq_init_keep_chip_data(unsigned int irq);
 extern void dynamic_irq_cleanup(unsigned int irq);
 
 /* Set/get chip/data for an IRQ: */
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index ecc3fa2..370dbc4 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -22,7 +22,7 @@
  *	dynamic_irq_init - initialize a dynamically allocated irq
  *	@irq:	irq number to initialize
  */
-void dynamic_irq_init(unsigned int irq)
+static void dynamic_irq_init_x(unsigned int irq, bool keep_chip_data)
 {
 	struct irq_desc *desc;
 	unsigned long flags;
@@ -41,7 +41,8 @@ void dynamic_irq_init(unsigned int irq)
 	desc->depth = 1;
 	desc->msi_desc = NULL;
 	desc->handler_data = NULL;
-	desc->chip_data = NULL;
+	if (!keep_chip_data)
+		desc->chip_data = NULL;
 	desc->action = NULL;
 	desc->irq_count = 0;
 	desc->irqs_unhandled = 0;
@@ -54,6 +55,16 @@ void dynamic_irq_init(unsigned int irq)
 	raw_spin_unlock_irqrestore(&desc->lock, flags);
 }
 
+void dynamic_irq_init(unsigned int irq)
+{
+	dynamic_irq_init_x(irq, false);
+}
+
+void dynamic_irq_init_keep_chip_data(unsigned int irq)
+{
+	dynamic_irq_init_x(irq, true);
+}
+
 /**
  *	dynamic_irq_cleanup - cleanup a dynamically allocated irq
  *	@irq:	irq number to initialize
--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
x86: fix race in create_irq_nr on irq_desc, Brandon Philips, (Tue Feb 2, 8:31 pm)
Re: x86: fix race in create_irq_nr on irq_desc, Yinghai Lu, (Wed Feb 3, 3:20 am)
Re: x86: fix race in create_irq_nr on irq_desc, Yinghai Lu, (Wed Feb 3, 3:32 am)
Re: x86: fix race in create_irq_nr on irq_desc, Brandon Philips, (Wed Feb 3, 10:42 am)
Re: x86: fix race in create_irq_nr on irq_desc, Yinghai Lu, (Wed Feb 3, 12:31 pm)
Re: x86: fix race in create_irq_nr on irq_desc, Brandon Philips, (Wed Feb 3, 8:17 pm)
[PATCH] x86: keep chip_data in create_irq_nr, Yinghai Lu, (Fri Feb 5, 1:45 am)
Re: [PATCH] x86: keep chip_data in create_irq_nr, Brandon Philips, (Fri Feb 5, 2:05 pm)
Re: [PATCH] x86: keep chip_data in create_irq_nr, H. Peter Anvin, (Fri Feb 5, 2:42 pm)
[tip:x86/urgent] x86, irq: Keep chip_data in create_irq_nr ..., tip-bot for Brandon ..., (Thu Feb 18, 11:06 pm)
[tip:x86/irq] x86: apic: Fix mismerge, add arch_probe_nr_i ..., tip-bot for Ingo Molnar, (Fri Feb 26, 3:26 am)
Re: [tip:x86/irq] x86: apic: Fix mismerge, add arch_probe_ ..., Eric W. Biederman, (Sat Feb 27, 2:37 am)
Re: [tip:x86/irq] x86: apic: Fix mismerge, add arch_probe_ ..., Eric W. Biederman, (Sat Feb 27, 3:12 am)
[tip:x86/apic] x86: apic: Fix mismerge, add arch_probe_nr_ ..., tip-bot for Ingo Molnar, (Sat Feb 27, 5:57 am)
Re: [tip:x86/irq] x86: apic: Fix mismerge, add arch_probe_ ..., Eric W. Biederman, (Mon Mar 1, 11:34 am)
Re: [tip:x86/irq] x86: apic: Fix mismerge, add arch_probe_ ..., Jeremy Fitzhardinge, (Mon Mar 1, 3:01 pm)
Re: [PATCH] x86: namespace some I/O APIC related structure ..., Eric W. Biederman, (Wed Mar 10, 10:07 am)
Re: [PATCH] irq: move some interrupt arch_* functions into ..., Eric W. Biederman, (Wed Mar 10, 10:18 am)
Re: [PATCH] irq: move some interrupt arch_* functions into ..., Eric W. Biederman, (Wed Mar 10, 10:42 am)
Re: [PATCH] irq: move some interrupt arch_* functions into ..., Eric W. Biederman, (Wed Mar 10, 11:11 am)
Re: [PATCH] irq: move some interrupt arch_* functions into ..., Eric W. Biederman, (Wed Mar 10, 11:15 am)
Re: [PATCH] irq: move some interrupt arch_* functions into ..., Jeremy Fitzhardinge, (Wed Mar 10, 11:27 am)
Re: [PATCH] irq: move some interrupt arch_* functions into ..., Eric W. Biederman, (Wed Mar 10, 12:15 pm)