Skip to contentSkip to conversation

NUMA-Q breakage 5/7 in_interrupt() race

PATCH William Lee Irwin III 2 participants 4 messages Jul 12, 2002 – Jul 13, 2002

lore
Share & tools
lore
#0 lore raw

On smaller machines, bootstrapping proceeds far enough to see races in kmaps near generic_file_read() etc. This is precisely the in_interrupt() BUG(), but it's quite clear this is happening in process context. Not even the smaller machines can survive this. That is, it is impossible to run at all without it (or an equivalent).

Robert, please apply.

Thanks,
Bill

===== include/asm-i386/hardirq.h 1.7 vs edited =====

include/asm-i386/hardirq.h +18 -2
@@ -22,8 +22,24 @@
  * Are we in an interrupt context? Either doing bottom half
  * or hardware interrupt processing?
  */
-#define in_interrupt() ({ int __cpu = smp_processor_id(); \
-	(local_irq_count(__cpu) + local_bh_count(__cpu) != 0); })
+static inline int in_interrupt(void)
+{
+	int total_count, retval, cpu;
+
+	preempt_disable();
+	cpu = smp_processor_id();
+
+	total_count = local_irq_count(cpu) + local_bh_count(cpu);
+
+	if (total_count)
+		retval = 1;
+	else
+		retval = 0;
+
+	preempt_disable();
+
+	return retval;
+}
 
 #define in_irq() (local_irq_count(smp_processor_id()) != 0)
 
#1 lore raw
Quoted 6 lines · William Lee Irwin III

On smaller machines, bootstrapping proceeds far enough to see races in kmaps near generic_file_read() etc. This is precisely the in_interrupt() BUG(), but it's quite clear this is happening in process context. Not even the smaller machines can survive this. That is, it is impossible to run at all without it (or an equivalent). Robert, please apply.

Argh, I forgot to credit Rusty Russell (and possibly also Paul Mackerras) with originally discovering & fixing this.

Cheers,
Bill

#2 lore raw

Hi,

Quoted 2 lines · William Lee Irwin III

Argh, I forgot to credit Rusty Russell (and possibly also Paul Mackerras) with originally discovering & fixing this.

While we're on it, thanks from me, too.

Regards, Thunder

Signature · 7 lines
(Use http://www.ebb.org/ungeek if you can't decode)
------BEGIN GEEK CODE BLOCK------
Version: 3.12
GCS/E/G/S/AT d- s++:-- a? C++$ ULAVHI++++$ P++$ L++++(+++++)$ E W-$
N--- o?  K? w-- O- M V$ PS+ PE- Y- PGP+ t+ 5+ X+ R- !tv b++ DI? !D G
e++++ h* r--- y- 
------END GEEK CODE BLOCK------
#3 lore raw
In reply to William Lee Irwin III

Review

Quoted 5 lines

===== include/asm-i386/hardirq.h 1.7 vs edited =====

(quoted diff) +4 -0
+	preempt_disable();
+
+	return retval;
+}

Not sure how it survived running. That should be a preempt_enable() on the way out. Maybe I should have used the get_cpu()/put_cpu() stuff.

Amended patch follows.

Cheers,
Bill

===== include/asm-i386/hardirq.h 1.7 vs edited =====

include/asm-i386/hardirq.h +18 -2
@@ -22,8 +22,24 @@
  * Are we in an interrupt context? Either doing bottom half
  * or hardware interrupt processing?
  */
-#define in_interrupt() ({ int __cpu = smp_processor_id(); \
-	(local_irq_count(__cpu) + local_bh_count(__cpu) != 0); })
+static inline int in_interrupt(void)
+{
+	int total_count, retval, cpu;
+
+	preempt_disable();
+	cpu = smp_processor_id();
+
+	total_count = local_irq_count(cpu) + local_bh_count(cpu);
+
+	if (total_count)
+		retval = 1;
+	else
+		retval = 0;
+
+	preempt_enable();
+
+	return retval;
+}
 
 #define in_irq() (local_irq_count(smp_processor_id()) != 0)