/* Find who killed me !? */

/*
 * Make me with:
 *
	touch Makefile ; make obj-m=trace-signal.o -C /lib/modules/`uname -r`/build M=`pwd` modules
	insmod ./trace-signal.ko
 */

#include <linux/module.h>
#include <linux/sched.h>
#include <trace/sched.h>

/* events/0 - http://www.linuxjournal.com/article/6916 */
/*
 [   54.726154] Process 'events/0' (10) kills with signal 3, task 1619 ('X')
 [   54.726177] Pid: 10, comm: events/0 Tainted: G          N  2.6.29.4-1-default #1
 [   54.726191] Call Trace:
 [   54.726241]  [<c0206903>] try_stack_unwind+0x51/0x11e
 [   54.726276]  [<c0205d5f>] dump_trace+0x55/0xca
 [   54.726304]  [<c02066d4>] show_trace_log_lvl+0x33/0x3e
 [   54.726328]  [<c02066ef>] show_trace+0x10/0x14
 [   54.726352]  [<c0573c1d>] dump_stack+0x57/0x61
 [   54.726384]  [<f7fbe03f>] probe_signal_send+0x3f/0x44 [trace_signal]
 [   54.726413]  [<c02379ba>] send_signal+0x2c/0x1ed
 [   54.726437]  [<c0237ddc>] __group_send_sig_info+0xa/0xc
 [   54.726461]  [<c02383c2>] group_send_sig_info+0x3e/0x5c
 [   54.726485]  [<c02384d7>] __kill_pgrp_info+0x3b/0x53
 [   54.726508]  [<c0238515>] kill_pgrp+0x26/0x32
 [   54.726533]  [<c03a9e02>] n_tty_receive_char+0x217/0x576
 [   54.726559]  [<c03aa360>] n_tty_receive_buf+0x1ff/0x455
 [   54.726584]  [<c03abf9d>] flush_to_ldisc+0xf1/0x17f
 [   54.726609]  [<c023b77a>] run_workqueue+0x99/0x12f
 [   54.726634]  [<c023b8c6>] worker_thread+0xb6/0xc2
 [   54.726657]  [<c023e5e8>] kthread+0x3b/0x61
 [   54.726680]  [<c0204adf>] kernel_thread_helper+0x7/0x10
*/

static void probe_signal_send(int sig, struct task_struct *t)
{
	printk(KERN_INFO "Process '%s' (%u) kills with signal %u, task %u ('%s')\n",
	       current->comm, (int)current->pid, sig, (int)t->pid, t->comm);
	if (sig == 3)
	  dump_stack();
}

int __init tp_signal_trace_init(void)
{
	int ret;

	ret = register_trace_sched_signal_send(probe_signal_send);
	WARN_ON(ret);

	return 0;
}

module_init(tp_signal_trace_init);

void __exit tp_signal_trace_exit(void)
{
	unregister_trace_sched_signal_send(probe_signal_send);
	tracepoint_synchronize_unregister();
}

module_exit(tp_signal_trace_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Michael Meeks");
MODULE_DESCRIPTION("Find who send me that signal");
