| From 0a0d736ec89dffdbc83e7181166a99d5563acfe8 Mon Sep 17 00:00:00 2001 |
| From: Michael Jeanson <mjeanson@efficios.com> |
| Date: Mon, 5 Nov 2018 11:35:52 -0500 |
| Subject: [PATCH 1/9] Fix: signal: Distinguish between kernel_siginfo and |
| siginfo (v4.20) |
| |
| See upstream commit : |
| |
| commit ae7795bc6187a15ec51cf258abae656a625f9980 |
| Author: Eric W. Biederman <ebiederm@xmission.com> |
| Date: Tue Sep 25 11:27:20 2018 +0200 |
| |
| signal: Distinguish between kernel_siginfo and siginfo |
| |
| Linus recently observed that if we did not worry about the padding |
| member in struct siginfo it is only about 48 bytes, and 48 bytes is |
| much nicer than 128 bytes for allocating on the stack and copying |
| around in the kernel. |
| |
| The obvious thing of only adding the padding when userspace is |
| including siginfo.h won't work as there are sigframe definitions in |
| the kernel that embed struct siginfo. |
| |
| So split siginfo in two; kernel_siginfo and siginfo. Keeping the |
| traditional name for the userspace definition. While the version that |
| is used internally to the kernel and ultimately will not be padded to |
| 128 bytes is called kernel_siginfo. |
| |
| The definition of struct kernel_siginfo I have put in include/signal_types.h |
| |
| A set of buildtime checks has been added to verify the two structures have |
| the same field offsets. |
| |
| To make it easy to verify the change kernel_siginfo retains the same |
| size as siginfo. The reduction in size comes in a following change. |
| |
| Signed-off-by: Michael Jeanson <mjeanson@efficios.com> |
| Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> |
| |
| Upstream-Status: backport https://github.com/lttng/lttng-modules/commit/0a0d736ec89dffdbc83e7181166a99d5563acfe8 |
| |
| Signed-off-by: Bruce Ashfield <bruce.ashfield@gmail.com> |
| --- |
| instrumentation/events/lttng-module/signal.h | 41 ++++++++++++++++++-- |
| 1 file changed, 37 insertions(+), 4 deletions(-) |
| |
| diff --git a/instrumentation/events/lttng-module/signal.h b/instrumentation/events/lttng-module/signal.h |
| index b3c9126..8783b52 100644 |
| --- a/instrumentation/events/lttng-module/signal.h |
| +++ b/instrumentation/events/lttng-module/signal.h |
| @@ -35,21 +35,24 @@ |
| * SEND_SIG_NOINFO means that si_code is SI_USER, and SEND_SIG_PRIV |
| * means that si_code is SI_KERNEL. |
| */ |
| -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,20,0)) |
| LTTNG_TRACEPOINT_EVENT(signal_generate, |
| |
| - TP_PROTO(int sig, struct siginfo *info, struct task_struct *task), |
| + TP_PROTO(int sig, struct kernel_siginfo *info, struct task_struct *task, |
| + int group, int result), |
| |
| - TP_ARGS(sig, info, task), |
| + TP_ARGS(sig, info, task, group, result), |
| |
| TP_FIELDS( |
| ctf_integer(int, sig, sig) |
| LTTNG_FIELDS_SIGINFO(info) |
| ctf_array_text(char, comm, task->comm, TASK_COMM_LEN) |
| ctf_integer(pid_t, pid, task->pid) |
| + ctf_integer(int, group, group) |
| + ctf_integer(int, result, result) |
| ) |
| ) |
| -#else |
| +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0)) |
| LTTNG_TRACEPOINT_EVENT(signal_generate, |
| |
| TP_PROTO(int sig, struct siginfo *info, struct task_struct *task, |
| @@ -66,6 +69,20 @@ LTTNG_TRACEPOINT_EVENT(signal_generate, |
| ctf_integer(int, result, result) |
| ) |
| ) |
| +#else |
| +LTTNG_TRACEPOINT_EVENT(signal_generate, |
| + |
| + TP_PROTO(int sig, struct siginfo *info, struct task_struct *task), |
| + |
| + TP_ARGS(sig, info, task), |
| + |
| + TP_FIELDS( |
| + ctf_integer(int, sig, sig) |
| + LTTNG_FIELDS_SIGINFO(info) |
| + ctf_array_text(char, comm, task->comm, TASK_COMM_LEN) |
| + ctf_integer(pid_t, pid, task->pid) |
| + ) |
| +) |
| #endif |
| |
| /** |
| @@ -82,6 +99,21 @@ LTTNG_TRACEPOINT_EVENT(signal_generate, |
| * This means, this can show which signals are actually delivered, but |
| * matching generated signals and delivered signals may not be correct. |
| */ |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,20,0)) |
| +LTTNG_TRACEPOINT_EVENT(signal_deliver, |
| + |
| + TP_PROTO(int sig, struct kernel_siginfo *info, struct k_sigaction *ka), |
| + |
| + TP_ARGS(sig, info, ka), |
| + |
| + TP_FIELDS( |
| + ctf_integer(int, sig, sig) |
| + LTTNG_FIELDS_SIGINFO(info) |
| + ctf_integer(unsigned long, sa_handler, (unsigned long) ka->sa.sa_handler) |
| + ctf_integer(unsigned long, sa_flags, ka->sa.sa_flags) |
| + ) |
| +) |
| +#else |
| LTTNG_TRACEPOINT_EVENT(signal_deliver, |
| |
| TP_PROTO(int sig, struct siginfo *info, struct k_sigaction *ka), |
| @@ -95,6 +127,7 @@ LTTNG_TRACEPOINT_EVENT(signal_deliver, |
| ctf_integer(unsigned long, sa_flags, ka->sa.sa_flags) |
| ) |
| ) |
| +#endif |
| |
| #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) |
| LTTNG_TRACEPOINT_EVENT_CLASS(signal_queue_overflow, |
| -- |
| 2.19.1 |
| |