x86, mm: fault.c, unify oops handling
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>
This commit is contained in:
@@ -659,11 +659,8 @@ no_context(struct pt_regs *regs, unsigned long error_code,
|
|||||||
{
|
{
|
||||||
struct task_struct *tsk = current;
|
struct task_struct *tsk = current;
|
||||||
unsigned long *stackend;
|
unsigned long *stackend;
|
||||||
|
|
||||||
#ifdef CONFIG_X86_64
|
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int sig;
|
int sig;
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Are we prepared to handle this kernel fault? */
|
/* Are we prepared to handle this kernel fault? */
|
||||||
if (fixup_exception(regs))
|
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
|
* Oops. The kernel tried to access some bad page. We'll have to
|
||||||
* terminate things with extreme prejudice:
|
* terminate things with extreme prejudice:
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_X86_32
|
|
||||||
bust_spinlocks(1);
|
|
||||||
#else
|
|
||||||
flags = oops_begin();
|
flags = oops_begin();
|
||||||
#endif
|
|
||||||
|
|
||||||
show_fault_oops(regs, error_code, address);
|
show_fault_oops(regs, error_code, address);
|
||||||
|
|
||||||
@@ -706,11 +699,6 @@ no_context(struct pt_regs *regs, unsigned long error_code,
|
|||||||
tsk->thread.trap_no = 14;
|
tsk->thread.trap_no = 14;
|
||||||
tsk->thread.error_code = error_code;
|
tsk->thread.error_code = error_code;
|
||||||
|
|
||||||
#ifdef CONFIG_X86_32
|
|
||||||
die("Oops", regs, error_code);
|
|
||||||
bust_spinlocks(0);
|
|
||||||
do_exit(SIGKILL);
|
|
||||||
#else
|
|
||||||
sig = SIGKILL;
|
sig = SIGKILL;
|
||||||
if (__die("Oops", regs, error_code))
|
if (__die("Oops", regs, error_code))
|
||||||
sig = 0;
|
sig = 0;
|
||||||
@@ -719,7 +707,6 @@ no_context(struct pt_regs *regs, unsigned long error_code,
|
|||||||
printk(KERN_EMERG "CR2: %016lx\n", address);
|
printk(KERN_EMERG "CR2: %016lx\n", address);
|
||||||
|
|
||||||
oops_end(flags, regs, sig);
|
oops_end(flags, regs, sig);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in New Issue
Block a user