Jack Steiner uncovered some opportunities for improvement in
the MCA recovery code.

  1) Set bsp to save registers on the kernel stack.
  2) Disable interrupts while in the MCA recovery code.
  3) Change the way the user process is killed, to avoid 
     a panic in schedule.

Testing shows that these changes make the recovery code much 
more reliable with the 2.6.12 kernel.

Signed-off-by: Russ Anderson <[EMAIL PROTECTED]>

------------------------------------------------------------------------------------
Index: linux/arch/ia64/kernel/mca_drv.c
===================================================================
--- linux.orig/arch/ia64/kernel/mca_drv.c       2005-04-01 13:28:21.897191890 
-0600
+++ linux/arch/ia64/kernel/mca_drv.c    2005-04-01 13:29:48.547634088 -0600
@@ -132,8 +132,7 @@
        spin_unlock(&mca_bh_lock);
 
        /* This process is about to be killed itself */
-       force_sig(SIGKILL, current);
-       schedule();
+       do_exit(SIGKILL);
 }
 
 /**
@@ -439,6 +438,7 @@
                        psr2 = (struct ia64_psr *)&pmsa->pmsa_ipsr;
                        psr2->cpl = 0;
                        psr2->ri  = 0;
+                       psr2->i  = 0;
 
                        return 1;
                }
Index: linux/arch/ia64/kernel/mca_drv_asm.S
===================================================================
--- linux.orig/arch/ia64/kernel/mca_drv_asm.S   2005-04-01 13:28:15.696086223 
-0600
+++ linux/arch/ia64/kernel/mca_drv_asm.S        2005-04-01 14:31:24.275077908 
-0600
@@ -10,6 +10,7 @@
 
 #include <asm/asmmacro.h>
 #include <asm/processor.h>
+#include <asm/ptrace.h>
 
 GLOBAL_ENTRY(mca_handler_bhhook)
        invala                                          // clear RSE ?
@@ -20,12 +21,21 @@
        ;;                                              
        alloc           r16=ar.pfs,0,2,1,0              // make a new frame
        ;;
+       mov             ar.rsc=0
+       ;;
        mov             r13=IA64_KR(CURRENT)            // current task pointer
        ;;
-       adds            r12=IA64_TASK_THREAD_KSP_OFFSET,r13
+       mov             r2=r13
+       ;;
+       addl            r22=IA64_RBS_OFFSET,r2
+       ;;
+       mov             ar.bspstore=r22
        ;;
-       ld8             r12=[r12]                       // stack pointer
+       addl            sp=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r2
        ;;
+       adds            r2=IA64_TASK_THREAD_ON_USTACK_OFFSET,r13
+       ;;
+       st1             [r2]=r0                         // clear 
current->thread.on_ustack flag
        mov             loc0=r16
        movl            loc1=mca_handler_bh             // recovery C function
        ;;
@@ -34,7 +44,9 @@
        ;;
        mov             loc1=rp
        ;;
-       br.call.sptk.many    rp=b6                      // not return ...
+       ssm             psr.i
+       ;;
+       br.call.sptk.many    rp=b6                      // does not return ...
        ;;
        mov             ar.pfs=loc0
        mov             rp=loc1
------------------------------------------------------------------------------------
-- 
Russ Anderson, OS RAS/Partitioning Project Lead  
SGI - Silicon Graphics Inc          [EMAIL PROTECTED]
-
To unsubscribe from this list: send the line "unsubscribe linux-ia64" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to