[Top] [All Lists]

[PATCH] die() does not call die notifier chain

Subject: [PATCH] die() does not call die notifier chain
From: Yury Polyanskiy <>
Date: Mon, 26 Apr 2010 00:53:10 -0400
Original-recipient: rfc822;
Dear Ralf,

I think that the arch/mips implementation of die() forgets to call the
notify_die() and thus notifiers registered via register_die_notifier()
are not called.

For example this results in kgdb not being activated on exceptions.

The patch is very simple and attached: the only subtlety is that main
notify_die declares regs argument w/o const, so I needed to remove const 
from mips die() as well.

Best wishes,

PS. Please CC me: I am not on the list.

diff --git a/arch/mips/include/asm/ptrace.h b/arch/mips/include/asm/ptrace.h
index ce47118..cdc6a46 100644
--- a/arch/mips/include/asm/ptrace.h
+++ b/arch/mips/include/asm/ptrace.h
@@ -142,9 +142,9 @@ extern int ptrace_set_watch_regs(struct task_struct *child,
 extern asmlinkage void do_syscall_trace(struct pt_regs *regs, int entryexit);
-extern NORET_TYPE void die(const char *, const struct pt_regs *) ATTRIB_NORET;
+extern NORET_TYPE void die(const char *, struct pt_regs *) ATTRIB_NORET;
-static inline void die_if_kernel(const char *str, const struct pt_regs *regs)
+static inline void die_if_kernel(const char *str, struct pt_regs *regs)
        if (unlikely(!user_mode(regs)))
                die(str, regs);
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c
index 4e00f9b..fdc6773 100644
--- a/arch/mips/kernel/traps.c
+++ b/arch/mips/kernel/traps.c
@@ -352,9 +352,10 @@ void show_registers(const struct pt_regs *regs)
 static DEFINE_SPINLOCK(die_lock);
-void __noreturn die(const char * str, const struct pt_regs * regs)
+void __noreturn die(const char * str, struct pt_regs * regs)
        static int die_counter;
+       int sig = SIGSEGV;
        unsigned long dvpret = dvpe();
 #endif /* CONFIG_MIPS_MT_SMTC */
@@ -365,6 +366,10 @@ void __noreturn die(const char * str, const struct pt_regs 
* regs)
 #endif /* CONFIG_MIPS_MT_SMTC */
+       if (notify_die(DIE_OOPS, str, regs, 0, current->thread.trap_no, 
+               sig = 0;
        printk("%s[#%d]:\n", str, ++die_counter);
@@ -379,7 +384,7 @@ void __noreturn die(const char * str, const struct pt_regs 
* regs)
                panic("Fatal exception");
-       do_exit(SIGSEGV);
+       do_exit(sig);
 extern struct exception_table_entry __start___dbe_table[];

Attachment: signature.asc
Description: PGP signature

<Prev in Thread] Current Thread [Next in Thread>