[PATCH] alpha smp fix
authorIvan Kokshaysky <ink@jurassic.park.msu.ru>
Thu, 30 Jun 2005 16:02:18 +0000 (20:02 +0400)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Fri, 1 Jul 2005 05:29:48 +0000 (22:29 -0700)
As usual, the reason of this breakage is quite silly: in do_entIF, we
are checking for PS == 0 to see whether it was a kernel BUG() or
userspace trap.

It works, unless BUG() happens in interrupt - PS is not 0 in kernel mode
due to non-zero IPL, and the things get messed up horribly then.  In
this particular case it was BUG_ON(!irqs_disabled()) triggered in
run_posix_cpu_timers(), so we ended up shooting "current" with the
bursts of one SIGTRAP and three SIGILLs on every timer tick.  ;-)

arch/alpha/kernel/traps.c

index fd7bd17cc96049334d98207333042b9eae11190c..6f509a644bddade182f7b27dade5e971fffb0f13 100644 (file)
@@ -240,7 +240,7 @@ do_entIF(unsigned long type, struct pt_regs *regs)
        siginfo_t info;
        int signo, code;
 
-       if (regs->ps == 0) {
+       if ((regs->ps & ~IPL_MAX) == 0) {
                if (type == 1) {
                        const unsigned int *data
                          = (const unsigned int *) regs->pc;