From 7bbf55ea7a85748e02c9b3e966c1812032c48eb8 Mon Sep 17 00:00:00 2001 From: Sebastien Lorrain Date: Wed, 15 Apr 2015 11:53:53 -0400 Subject: [PATCH] Add namespace info in sched_fork and statedump Modifications to sched_fork : Add a field for parent and child pid namespace inode (as in /proc/$PID/ns/pid). Also add a field for the child VTID. Modifications to lttng_statedump_process_state : Add a field for the pid namespace inode of the task. Signed-off-by: Sebastien Lorrain Signed-off-by: Mathieu Desnoyers --- .../events/lttng-module/lttng-statedump.h | 11 ++++ instrumentation/events/lttng-module/sched.h | 63 ++++++++++++++++++- 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/instrumentation/events/lttng-module/lttng-statedump.h b/instrumentation/events/lttng-module/lttng-statedump.h index 23690370..916a6c5c 100644 --- a/instrumentation/events/lttng-module/lttng-statedump.h +++ b/instrumentation/events/lttng-module/lttng-statedump.h @@ -8,6 +8,14 @@ #include #include #include +#include + + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,19,0)) +#define lttng_proc_inum ns.inum +#else +#define lttng_proc_inum proc_inum +#endif LTTNG_TRACEPOINT_EVENT(lttng_statedump_start, TP_PROTO(struct lttng_session *session), @@ -60,6 +68,9 @@ LTTNG_TRACEPOINT_EVENT(lttng_statedump_process_state, ctf_integer(int, submode, submode) ctf_integer(int, status, status) ctf_integer(int, ns_level, pid_ns ? pid_ns->level : 0) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)) + ctf_integer(unsigned int, ns_inum, pid_ns ? pid_ns->lttng_proc_inum : 0) +#endif ) ) diff --git a/instrumentation/events/lttng-module/sched.h b/instrumentation/events/lttng-module/sched.h index ac61bcef..6e42fc62 100644 --- a/instrumentation/events/lttng-module/sched.h +++ b/instrumentation/events/lttng-module/sched.h @@ -6,12 +6,21 @@ #include "../../../probes/lttng-tracepoint-event.h" #include +#include #include #include #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,9,0)) #include #endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,19,0)) +#define lttng_proc_inum ns.inum +#else +#define lttng_proc_inum proc_inum +#endif + +#define LTTNG_MAX_PID_NS_LEVEL 32 + #ifndef _TRACE_SCHED_DEF_ #define _TRACE_SCHED_DEF_ @@ -288,19 +297,71 @@ LTTNG_TRACEPOINT_EVENT(sched_process_wait, * == child_pid, while creation of a thread yields to child_tid != * child_pid. */ -LTTNG_TRACEPOINT_EVENT(sched_process_fork, +LTTNG_TRACEPOINT_EVENT_CODE(sched_process_fork, TP_PROTO(struct task_struct *parent, struct task_struct *child), TP_ARGS(parent, child), + TP_locvar( + pid_t vtids[LTTNG_MAX_PID_NS_LEVEL]; + unsigned int ns_level; + ), + + TP_code( + if (child) { + struct pid *child_pid; + unsigned int i; + + child_pid = task_pid(child); + tp_locvar->ns_level = + min_t(unsigned int, child_pid->level + 1, + LTTNG_MAX_PID_NS_LEVEL); + for (i = 0; i < tp_locvar->ns_level; i++) + tp_locvar->vtids[i] = child_pid->numbers[i].nr; + } + ), + TP_FIELDS( ctf_array_text(char, parent_comm, parent->comm, TASK_COMM_LEN) ctf_integer(pid_t, parent_tid, parent->pid) ctf_integer(pid_t, parent_pid, parent->tgid) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)) + ctf_integer(unsigned int, parent_ns_inum, + ({ + unsigned int parent_ns_inum = 0; + + if (parent) { + struct pid_namespace *pid_ns; + + pid_ns = task_active_pid_ns(parent); + if (pid_ns) + parent_ns_inum = + pid_ns->lttng_proc_inum; + } + parent_ns_inum; + })) +#endif ctf_array_text(char, child_comm, child->comm, TASK_COMM_LEN) ctf_integer(pid_t, child_tid, child->pid) + ctf_sequence(pid_t, vtids, tp_locvar->vtids, u8, tp_locvar->ns_level) ctf_integer(pid_t, child_pid, child->tgid) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)) + ctf_integer(unsigned int, child_ns_inum, + ({ + unsigned int child_ns_inum = 0; + + if (child) { + struct pid_namespace *pid_ns; + + pid_ns = task_active_pid_ns(child); + if (pid_ns) + child_ns_inum = + pid_ns->lttng_proc_inum; + } + child_ns_inum; + })) +#endif ) ) -- 2.34.1