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 /** 64 * signal_deliver - called when a signal is delivered 65 * @sig: signal number 66 * @info: pointer to struct siginfo 67 * @ka: pointer to struct k_sigaction 68 * 69 * A 'sig' signal is delivered to current process with 'info' siginfo, 70 * and it will be handled by 'ka'. ka->sa.sa_handler can be SIG_IGN or 71 * SIG_DFL. 72 * Note that some signals reported by signal_generate tracepoint can be 73 * lost, ignored or modified (by debugger) before hitting this tracepoint. 74 * This means, this can show which signals are actually delivered, but 75 * matching generated signals and delivered signals may not be correct. 76 */ 77 TRACE_EVENT(signal_deliver, 78 79 TP_PROTO(int sig, struct siginfo *info, struct k_sigaction *ka), 80 81 TP_ARGS(sig, info, ka), 82 83 TP_STRUCT__entry( 84 __field( int, sig ) 85 __field( int, errno ) 86 __field( int, code ) 87 __field( unsigned long, sa_handler ) 88 __field( unsigned long, sa_flags ) 89 ), 90 91 TP_fast_assign( 92 __entry->sig = sig; 93 TP_STORE_SIGINFO(__entry, info); 94 __entry->sa_handler = (unsigned long)ka->sa.sa_handler; 95 __entry->sa_flags = ka->sa.sa_flags; 96 ), 97 98 TP_printk("sig=%d errno=%d code=%d sa_handler=%lx sa_flags=%lx", 99 __entry->sig, __entry->errno, __entry->code, 100 __entry->sa_handler, __entry->sa_flags) 101 ); 102 103 /** 104 * signal_overflow_fail - called when signal queue is overflow 105 * @sig: signal number 106 * @group: signal to process group or not (bool) 107 * @info: pointer to struct siginfo 108 * 109 * Kernel fails to generate 'sig' signal with 'info' siginfo, because 110 * siginfo queue is overflow, and the signal is dropped. 111 * 'group' is not 0 if the signal will be sent to a process group. 112 * 'sig' is always one of RT signals. 113 */ 114 TRACE_EVENT(signal_overflow_fail, 115 116 TP_PROTO(int sig, int group, struct siginfo *info), 117 118 TP_ARGS(sig, group, info), 119 120 TP_STRUCT__entry( 121 __field( int, sig ) 122 __field( int, group ) 123 __field( int, errno ) 124 __field( int, code ) 125 ), 126 127 TP_fast_assign( 128 __entry->sig = sig; 129 __entry->group = group; 130 TP_STORE_SIGINFO(__entry, info); 131 ), 132 133 TP_printk("sig=%d group=%d errno=%d code=%d", 134 __entry->sig, __entry->group, __entry->errno, __entry->code) 135 ); 136 137 /** 138 * signal_lose_info - called when siginfo is lost 139 * @sig: signal number 140 * @group: signal to process group or not (bool) 141 * @info: pointer to struct siginfo 142 * 143 * Kernel generates 'sig' signal but loses 'info' siginfo, because siginfo 144 * queue is overflow. 145 * 'group' is not 0 if the signal will be sent to a process group. 146 * 'sig' is always one of non-RT signals. 147 */ 148 TRACE_EVENT(signal_lose_info, 149 150 TP_PROTO(int sig, int group, struct siginfo *info), 151 152 TP_ARGS(sig, group, info), 153 154 TP_STRUCT__entry( 155 __field( int, sig ) 156 __field( int, group ) 157 __field( int, errno ) 158 __field( int, code ) 159 ), 160 161 TP_fast_assign( 162 __entry->sig = sig; 163 __entry->group = group; 164 TP_STORE_SIGINFO(__entry, info); 165 ), 166 167 TP_printk("sig=%d group=%d errno=%d code=%d", 168 __entry->sig, __entry->group, __entry->errno, __entry->code) 169 ); 170 #endif /* _TRACE_SIGNAL_H */ 171 172 /* This part must be outside protection */ 173 #include <trace/define_trace.h> 174