Commit d1eb650ff4130972fa21462fa49cd35a2865403b
Committed by
Ingo Molnar
1 parent
80bbf6b641
Exists in
master
and in
7 other branches
tracepoint: Move signal sending tracepoint to events/signal.h
Move signal sending event to events/signal.h. This patch also renames sched_signal_send event to signal_generate. Changes in v4: - Fix a typo of task_struct pointer. Changes in v3: - Add docbook style comments Changes in v2: - Add siginfo argument - Add siginfo storing macro Signed-off-by: Masami Hiramatsu <mhiramat@redhat.com> Reviewed-by: Jason Baron <jbaron@redhat.com> Acked-by: Roland McGrath <roland@redhat.com> Cc: systemtap <systemtap@sources.redhat.com> Cc: DLE <dle-develop@lists.sourceforge.net> Cc: Oleg Nesterov <oleg@redhat.com> LKML-Reference: <20091124215645.30449.60208.stgit@dhcp-100-2-132.bos.redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Showing 4 changed files with 74 additions and 27 deletions Side-by-side Diff
Documentation/DocBook/tracepoint.tmpl
include/trace/events/sched.h
... | ... | @@ -288,31 +288,6 @@ |
288 | 288 | ); |
289 | 289 | |
290 | 290 | /* |
291 | - * Tracepoint for sending a signal: | |
292 | - */ | |
293 | -TRACE_EVENT(sched_signal_send, | |
294 | - | |
295 | - TP_PROTO(int sig, struct task_struct *p), | |
296 | - | |
297 | - TP_ARGS(sig, p), | |
298 | - | |
299 | - TP_STRUCT__entry( | |
300 | - __field( int, sig ) | |
301 | - __array( char, comm, TASK_COMM_LEN ) | |
302 | - __field( pid_t, pid ) | |
303 | - ), | |
304 | - | |
305 | - TP_fast_assign( | |
306 | - memcpy(__entry->comm, p->comm, TASK_COMM_LEN); | |
307 | - __entry->pid = p->pid; | |
308 | - __entry->sig = sig; | |
309 | - ), | |
310 | - | |
311 | - TP_printk("sig=%d comm=%s pid=%d", | |
312 | - __entry->sig, __entry->comm, __entry->pid) | |
313 | -); | |
314 | - | |
315 | -/* | |
316 | 291 | * XXX the below sched_stat tracepoints only apply to SCHED_OTHER/BATCH/IDLE |
317 | 292 | * adding sched_stat support to SCHED_FIFO/RR would be welcome. |
318 | 293 | */ |
include/trace/events/signal.h
1 | +#undef TRACE_SYSTEM | |
2 | +#define TRACE_SYSTEM signal | |
3 | + | |
4 | +#if !defined(_TRACE_SIGNAL_H) || defined(TRACE_HEADER_MULTI_READ) | |
5 | +#define _TRACE_SIGNAL_H | |
6 | + | |
7 | +#include <linux/signal.h> | |
8 | +#include <linux/sched.h> | |
9 | +#include <linux/tracepoint.h> | |
10 | + | |
11 | +#define TP_STORE_SIGINFO(__entry, info) \ | |
12 | + do { \ | |
13 | + if (info == SEND_SIG_NOINFO) { \ | |
14 | + __entry->errno = 0; \ | |
15 | + __entry->code = SI_USER; \ | |
16 | + } else if (info == SEND_SIG_PRIV) { \ | |
17 | + __entry->errno = 0; \ | |
18 | + __entry->code = SI_KERNEL; \ | |
19 | + } else { \ | |
20 | + __entry->errno = info->si_errno; \ | |
21 | + __entry->code = info->si_code; \ | |
22 | + } \ | |
23 | + } while (0) | |
24 | + | |
25 | +/** | |
26 | + * signal_generate - called when a signal is generated | |
27 | + * @sig: signal number | |
28 | + * @info: pointer to struct siginfo | |
29 | + * @task: pointer to struct task_struct | |
30 | + * | |
31 | + * Current process sends a 'sig' signal to 'task' process with | |
32 | + * 'info' siginfo. If 'info' is SEND_SIG_NOINFO or SEND_SIG_PRIV, | |
33 | + * 'info' is not a pointer and you can't access its field. Instead, | |
34 | + * SEND_SIG_NOINFO means that si_code is SI_USER, and SEND_SIG_PRIV | |
35 | + * means that si_code is SI_KERNEL. | |
36 | + */ | |
37 | +TRACE_EVENT(signal_generate, | |
38 | + | |
39 | + TP_PROTO(int sig, struct siginfo *info, struct task_struct *task), | |
40 | + | |
41 | + TP_ARGS(sig, info, task), | |
42 | + | |
43 | + TP_STRUCT__entry( | |
44 | + __field( int, sig ) | |
45 | + __field( int, errno ) | |
46 | + __field( int, code ) | |
47 | + __array( char, comm, TASK_COMM_LEN ) | |
48 | + __field( pid_t, pid ) | |
49 | + ), | |
50 | + | |
51 | + TP_fast_assign( | |
52 | + __entry->sig = sig; | |
53 | + TP_STORE_SIGINFO(__entry, info); | |
54 | + memcpy(__entry->comm, task->comm, TASK_COMM_LEN); | |
55 | + __entry->pid = task->pid; | |
56 | + ), | |
57 | + | |
58 | + TP_printk("sig=%d errno=%d code=%d comm=%s pid=%d", | |
59 | + __entry->sig, __entry->errno, __entry->code, | |
60 | + __entry->comm, __entry->pid) | |
61 | +); | |
62 | + | |
63 | +#endif /* _TRACE_SIGNAL_H */ | |
64 | + | |
65 | +/* This part must be outside protection */ | |
66 | +#include <trace/define_trace.h> |
kernel/signal.c
... | ... | @@ -27,7 +27,8 @@ |
27 | 27 | #include <linux/freezer.h> |
28 | 28 | #include <linux/pid_namespace.h> |
29 | 29 | #include <linux/nsproxy.h> |
30 | -#include <trace/events/sched.h> | |
30 | +#define CREATE_TRACE_POINTS | |
31 | +#include <trace/events/signal.h> | |
31 | 32 | |
32 | 33 | #include <asm/param.h> |
33 | 34 | #include <asm/uaccess.h> |
... | ... | @@ -834,7 +835,7 @@ |
834 | 835 | struct sigqueue *q; |
835 | 836 | int override_rlimit; |
836 | 837 | |
837 | - trace_sched_signal_send(sig, t); | |
838 | + trace_signal_generate(sig, info, t); | |
838 | 839 | |
839 | 840 | assert_spin_locked(&t->sighand->siglock); |
840 | 841 |