NUMA-Q breakage 5/7 in_interrupt() race
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)
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 thein_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
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------
Review
Quoted 5 lines
=====
include/asm-i386/hardirq.h1.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)