x86, mm: fault.c, unify oops handling
authorIngo Molnar <mingo@elte.hu>
Fri, 20 Feb 2009 22:07:48 +0000 (23:07 +0100)
committerIngo Molnar <mingo@elte.hu>
Fri, 20 Feb 2009 23:09:44 +0000 (00:09 +0100)
Impact: add oops-recursion check to 32-bit

Unify the oops state-machine, to the 64-bit version. It is
slightly more careful in that it does a recursion check
in oops_begin(), and is thus more likely to show the relevant
oops.

It also means that 32-bit will print one more line at the
end of pagefault triggered oopses:

  printk(KERN_EMERG "CR2: %016lx\n", address);

Which is generally good information to be seen in partial-dump
digital-camera jpegs ;-)

The downside is the somewhat more complex critical path. Both
variants have been tested well meanwhile by kernel developers
crashing their boxes so i dont think this is a practical worry.

This removes 3 ugly #ifdefs from no_context() and makes the
function a lot nicer read.

Cc: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/mm/fault.c

index ebfaca3bbb12ffa7aafa3a9e485266ccfd7e9874..8fe2dd254df034fb6853278ecb3b6cb659615f8c 100644 (file)
@@ -659,11 +659,8 @@ no_context(struct pt_regs *regs, unsigned long error_code,
 {
        struct task_struct *tsk = current;
        unsigned long *stackend;
-
-#ifdef CONFIG_X86_64
        unsigned long flags;
        int sig;
-#endif
 
        /* Are we prepared to handle this kernel fault? */
        if (fixup_exception(regs))
@@ -690,11 +687,7 @@ no_context(struct pt_regs *regs, unsigned long error_code,
         * Oops. The kernel tried to access some bad page. We'll have to
         * terminate things with extreme prejudice:
         */
-#ifdef CONFIG_X86_32
-       bust_spinlocks(1);
-#else
        flags = oops_begin();
-#endif
 
        show_fault_oops(regs, error_code, address);
 
@@ -702,15 +695,10 @@ no_context(struct pt_regs *regs, unsigned long error_code,
        if (*stackend != STACK_END_MAGIC)
                printk(KERN_ALERT "Thread overran stack, or stack corrupted\n");
 
-       tsk->thread.cr2 = address;
-       tsk->thread.trap_no = 14;
-       tsk->thread.error_code = error_code;
+       tsk->thread.cr2         = address;
+       tsk->thread.trap_no     = 14;
+       tsk->thread.error_code  = error_code;
 
-#ifdef CONFIG_X86_32
-       die("Oops", regs, error_code);
-       bust_spinlocks(0);
-       do_exit(SIGKILL);
-#else
        sig = SIGKILL;
        if (__die("Oops", regs, error_code))
                sig = 0;
@@ -719,7 +707,6 @@ no_context(struct pt_regs *regs, unsigned long error_code,
        printk(KERN_EMERG "CR2: %016lx\n", address);
 
        oops_end(flags, regs, sig);
-#endif
 }
 
 /*