Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1cc99544 authored by Ingo Molnar's avatar Ingo Molnar
Browse files

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: default avatarIngo Molnar <mingo@elte.hu>
parent 8f766149
Loading
Loading
Loading
Loading
+3 −16
Original line number Original line Diff line number Diff line
@@ -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
}
}


/*
/*