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 <paulus@samba.org>
Acked-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
#endif
-#define PREEMPT_ACTIVE 0x4000000
+#define PREEMPT_ACTIVE 0x10000000
#ifdef CONFIG_4KSTACKS
#define THREAD_SIZE (4096)
#else
*/
#define THREAD_SIZE 8192 /* 2 pages */
-#define PREEMPT_ACTIVE 0x4000000
+#define PREEMPT_ACTIVE 0x10000000
/*
* thread information flag bit numbers
#endif /* __ASSEMBLY__ */
-#define PREEMPT_ACTIVE 0x4000000
+#define PREEMPT_ACTIVE 0x10000000
/*
* thread information flag bit numbers
/* 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.
* - 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