diff options
author | Jason Wessel <jason.wessel@windriver.com> | 2012-08-10 12:21:15 -0500 |
---|---|---|
committer | Jason Wessel <jason.wessel@windriver.com> | 2012-10-12 06:37:34 -0500 |
commit | f0a996eeeda214f4293e234df33b29bec003b536 (patch) | |
tree | 0e99211ea48768a0bf9a9590861a24640cc50ea6 /arch/mips/kernel/kgdb.c | |
parent | f30fed10c440a25937e509860fa207399b26efe5 (diff) | |
download | lwn-f0a996eeeda214f4293e234df33b29bec003b536.tar.gz lwn-f0a996eeeda214f4293e234df33b29bec003b536.zip |
mips,kgdb: fix recursive page fault with CONFIG_KPROBES
This fault was detected using the kgdb test suite on boot and it
crashes recursively due to the fact that CONFIG_KPROBES on mips adds
an extra die notifier in the page fault handler. The crash signature
looks like this:
kgdbts:RUN bad memory access test
KGDB: re-enter exception: ALL breakpoints killed
Call Trace:
[<807b7548>] dump_stack+0x20/0x54
[<807b7548>] dump_stack+0x20/0x54
The fix for now is to have kgdb return immediately if the fault type
is DIE_PAGE_FAULT and allow the kprobe code to decide what is supposed
to happen.
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: David S. Miller <davem@davemloft.net>
Cc: <stable@vger.kernel.org>
Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
Diffstat (limited to 'arch/mips/kernel/kgdb.c')
-rw-r--r-- | arch/mips/kernel/kgdb.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/arch/mips/kernel/kgdb.c b/arch/mips/kernel/kgdb.c index f4546e97c60d..23817a6e32b6 100644 --- a/arch/mips/kernel/kgdb.c +++ b/arch/mips/kernel/kgdb.c @@ -283,6 +283,15 @@ static int kgdb_mips_notify(struct notifier_block *self, unsigned long cmd, struct pt_regs *regs = args->regs; int trap = (regs->cp0_cause & 0x7c) >> 2; +#ifdef CONFIG_KPROBES + /* + * Return immediately if the kprobes fault notifier has set + * DIE_PAGE_FAULT. + */ + if (cmd == DIE_PAGE_FAULT) + return NOTIFY_DONE; +#endif /* CONFIG_KPROBES */ + /* Userspace events, ignore. */ if (user_mode(regs)) return NOTIFY_DONE; |