diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-21 14:08:05 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-21 14:08:05 -0400 |
commit | 90b9a32d8f441369b2f97a765d2d957b531eb653 (patch) | |
tree | 3146d251a983ba12226e75c121613de6f051af8b /kernel/signal.c | |
parent | 8b108c609adefd98577c35f0a41497a610041a6c (diff) | |
parent | 4402c153cb9c549cd21d6007ef0dfac50c8d148d (diff) |
Merge branch 'kdb-merge' of git://git.kernel.org/pub/scm/linux/kernel/git/jwessel/linux-2.6-kgdb
* 'kdb-merge' of git://git.kernel.org/pub/scm/linux/kernel/git/jwessel/linux-2.6-kgdb: (25 commits)
kdb,debug_core: Allow the debug core to receive a panic notification
MAINTAINERS: update kgdb, kdb, and debug_core info
debug_core,kdb: Allow the debug core to process a recursive debug entry
printk,kdb: capture printk() when in kdb shell
kgdboc,kdb: Allow kdb to work on a non open console port
kgdb: Add the ability to schedule a breakpoint via a tasklet
mips,kgdb: kdb low level trap catch and stack trace
powerpc,kgdb: Introduce low level trap catching
x86,kgdb: Add low level debug hook
kgdb: remove post_primary_code references
kgdb,docs: Update the kgdb docs to include kdb
kgdboc,keyboard: Keyboard driver for kdb with kgdb
kgdb: gdb "monitor" -> kdb passthrough
sparc,sunzilog: Add console polling support for sunzilog serial driver
sh,sh-sci: Use NO_POLL_CHAR in the SCIF polled console code
kgdb,8250,pl011: Return immediately from console poll
kgdb: core changes to support kdb
kdb: core for kgdb back end (2 of 2)
kdb: core for kgdb back end (1 of 2)
kgdb,blackfin: Add in kgdb_arch_set_pc for blackfin
...
Diffstat (limited to 'kernel/signal.c')
-rw-r--r-- | kernel/signal.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/kernel/signal.c b/kernel/signal.c index dbd7fe073c55..825a3f24ad76 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
@@ -2735,3 +2735,43 @@ void __init signals_init(void) | |||
2735 | { | 2735 | { |
2736 | sigqueue_cachep = KMEM_CACHE(sigqueue, SLAB_PANIC); | 2736 | sigqueue_cachep = KMEM_CACHE(sigqueue, SLAB_PANIC); |
2737 | } | 2737 | } |
2738 | |||
2739 | #ifdef CONFIG_KGDB_KDB | ||
2740 | #include <linux/kdb.h> | ||
2741 | /* | ||
2742 | * kdb_send_sig_info - Allows kdb to send signals without exposing | ||
2743 | * signal internals. This function checks if the required locks are | ||
2744 | * available before calling the main signal code, to avoid kdb | ||
2745 | * deadlocks. | ||
2746 | */ | ||
2747 | void | ||
2748 | kdb_send_sig_info(struct task_struct *t, struct siginfo *info) | ||
2749 | { | ||
2750 | static struct task_struct *kdb_prev_t; | ||
2751 | int sig, new_t; | ||
2752 | if (!spin_trylock(&t->sighand->siglock)) { | ||
2753 | kdb_printf("Can't do kill command now.\n" | ||
2754 | "The sigmask lock is held somewhere else in " | ||
2755 | "kernel, try again later\n"); | ||
2756 | return; | ||
2757 | } | ||
2758 | spin_unlock(&t->sighand->siglock); | ||
2759 | new_t = kdb_prev_t != t; | ||
2760 | kdb_prev_t = t; | ||
2761 | if (t->state != TASK_RUNNING && new_t) { | ||
2762 | kdb_printf("Process is not RUNNING, sending a signal from " | ||
2763 | "kdb risks deadlock\n" | ||
2764 | "on the run queue locks. " | ||
2765 | "The signal has _not_ been sent.\n" | ||
2766 | "Reissue the kill command if you want to risk " | ||
2767 | "the deadlock.\n"); | ||
2768 | return; | ||
2769 | } | ||
2770 | sig = info->si_signo; | ||
2771 | if (send_sig_info(sig, info, t)) | ||
2772 | kdb_printf("Fail to deliver Signal %d to process %d.\n", | ||
2773 | sig, t->pid); | ||
2774 | else | ||
2775 | kdb_printf("Signal %d is sent to process %d.\n", sig, t->pid); | ||
2776 | } | ||
2777 | #endif /* CONFIG_KGDB_KDB */ | ||