From: Paul Mackerras When the generic IRQ stuff went in, it seems that HARDIRQ_BITS got bumped from 9 (for ppc64) up to 12. Consequently, the PREEMPT_ACTIVE bit is now within HARDIRQ_MASK, and I get in_interrupt() falsely returning true when PREEMPT_ACTIVE is set, and thus a BUG_ON tripping in arch/ppc64/mm/tlb.c. The patch below fixes this by changing PREEMPT_ACTIVE to 0x10000000. I have changed the PREEMPT_ACTIVE definitions for each of the architectures that define CONFIG_GENERIC_HARDIRQS (i386, ppc, ppc64, x86_64) and fixed the comment in include/linux/hardirq.h. We could perhaps move the PREEMPT_ACTIVE definition to include/linux/hardirq.h - I don't know why it is still per-arch. Signed-off-by: Paul Mackerras Acked-by: Ingo Molnar Signed-off-by: Andrew Morton --- 25-akpm/include/asm-i386/thread_info.h | 2 +- 25-akpm/include/asm-ppc/thread_info.h | 2 +- 25-akpm/include/asm-ppc64/thread_info.h | 2 +- 25-akpm/include/asm-x86_64/thread_info.h | 2 +- 25-akpm/include/linux/hardirq.h | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff -puN include/asm-i386/thread_info.h~fix-preempt_active-definition include/asm-i386/thread_info.h --- 25/include/asm-i386/thread_info.h~fix-preempt_active-definition Wed Oct 20 16:07:50 2004 +++ 25-akpm/include/asm-i386/thread_info.h Wed Oct 20 16:07:50 2004 @@ -51,7 +51,7 @@ struct thread_info { #endif -#define PREEMPT_ACTIVE 0x4000000 +#define PREEMPT_ACTIVE 0x10000000 #ifdef CONFIG_4KSTACKS #define THREAD_SIZE (4096) #else diff -puN include/asm-ppc64/thread_info.h~fix-preempt_active-definition include/asm-ppc64/thread_info.h --- 25/include/asm-ppc64/thread_info.h~fix-preempt_active-definition Wed Oct 20 16:07:50 2004 +++ 25-akpm/include/asm-ppc64/thread_info.h Wed Oct 20 16:07:50 2004 @@ -82,7 +82,7 @@ static inline struct thread_info *curren #endif /* __ASSEMBLY__ */ -#define PREEMPT_ACTIVE 0x4000000 +#define PREEMPT_ACTIVE 0x10000000 /* * thread information flag bit numbers diff -puN include/asm-ppc/thread_info.h~fix-preempt_active-definition include/asm-ppc/thread_info.h --- 25/include/asm-ppc/thread_info.h~fix-preempt_active-definition Wed Oct 20 16:07:50 2004 +++ 25-akpm/include/asm-ppc/thread_info.h Wed Oct 20 16:07:50 2004 @@ -65,7 +65,7 @@ static inline struct thread_info *curren */ #define THREAD_SIZE 8192 /* 2 pages */ -#define PREEMPT_ACTIVE 0x4000000 +#define PREEMPT_ACTIVE 0x10000000 /* * thread information flag bit numbers diff -puN include/asm-x86_64/thread_info.h~fix-preempt_active-definition include/asm-x86_64/thread_info.h --- 25/include/asm-x86_64/thread_info.h~fix-preempt_active-definition Wed Oct 20 16:07:50 2004 +++ 25-akpm/include/asm-x86_64/thread_info.h Wed Oct 20 16:07:50 2004 @@ -125,7 +125,7 @@ static inline struct thread_info *stack_ /* work to do on any return to user space */ #define _TIF_ALLWORK_MASK 0x0000FFFF -#define PREEMPT_ACTIVE 0x4000000 +#define PREEMPT_ACTIVE 0x10000000 /* * Thread-synchronous status. diff -puN include/linux/hardirq.h~fix-preempt_active-definition include/linux/hardirq.h --- 25/include/linux/hardirq.h~fix-preempt_active-definition Wed Oct 20 16:07:50 2004 +++ 25-akpm/include/linux/hardirq.h Wed Oct 20 16:07:50 2004 @@ -14,7 +14,7 @@ * - bits 8-15 are the softirq count (max # of softirqs: 256) * - bits 16-27 are the hardirq count (max # of hardirqs: 4096) * - * - ( bit 26 is the PREEMPT_ACTIVE flag. ) + * - ( bit 28 is the PREEMPT_ACTIVE flag. ) * * PREEMPT_MASK: 0x000000ff * SOFTIRQ_MASK: 0x0000ff00 _