Add namespaces statedump
[lttng-modules.git] / lttng-statedump-impl.c
index dc037508c055b7f61b8c758d581bd0178e26552a..a707c775dd683a8b6dff99b53049349ddea43fdf 100644 (file)
@@ -38,6 +38,7 @@
 #include <lttng-tracer.h>
 #include <wrapper/irqdesc.h>
 #include <wrapper/fdtable.h>
+#include <wrapper/namespace.h>
 #include <wrapper/irq.h>
 #include <wrapper/tracepoint.h>
 #include <wrapper/genhd.h>
@@ -61,6 +62,17 @@ DEFINE_TRACE(lttng_statedump_interrupt);
 DEFINE_TRACE(lttng_statedump_file_descriptor);
 DEFINE_TRACE(lttng_statedump_start);
 DEFINE_TRACE(lttng_statedump_process_state);
+DEFINE_TRACE(lttng_statedump_process_pid_ns);
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,6,0))
+DEFINE_TRACE(lttng_statedump_process_cgroup_ns);
+#endif
+DEFINE_TRACE(lttng_statedump_process_ipc_ns);
+#ifndef LTTNG_MNT_NS_MISSING_HEADER
+DEFINE_TRACE(lttng_statedump_process_mnt_ns);
+#endif
+DEFINE_TRACE(lttng_statedump_process_net_ns);
+DEFINE_TRACE(lttng_statedump_process_user_ns);
+DEFINE_TRACE(lttng_statedump_process_uts_ns);
 DEFINE_TRACE(lttng_statedump_network_interface);
 #ifdef LTTNG_HAVE_STATEDUMP_CPU_TOPOLOGY
 DEFINE_TRACE(lttng_statedump_cpu_topology);
@@ -388,6 +400,10 @@ int lttng_list_interrupts(struct lttng_session *session)
 #endif
 
 /*
+ * Statedump the task's namespaces using the proc filesystem inode number as
+ * the unique identifier. The user and pid ns are nested and will be dumped
+ * recursively.
+ *
  * Called with task lock held.
  */
 static
@@ -398,14 +414,64 @@ void lttng_statedump_process_ns(struct lttng_session *session,
                enum lttng_execution_submode submode,
                enum lttng_process_status status)
 {
+       struct nsproxy *proxy;
        struct pid_namespace *pid_ns;
+       struct user_namespace *user_ns;
 
+       /*
+        * The pid and user namespaces are special, they are nested and
+        * accessed with specific functions instead of the nsproxy struct
+        * like the other namespaces.
+        */
        pid_ns = task_active_pid_ns(p);
        do {
                trace_lttng_statedump_process_state(session,
                        p, type, mode, submode, status, pid_ns);
+               trace_lttng_statedump_process_pid_ns(session, p, pid_ns);
                pid_ns = pid_ns->parent;
        } while (pid_ns);
+
+
+       user_ns = task_cred_xxx(p, user_ns);
+       do {
+               trace_lttng_statedump_process_user_ns(session, p, user_ns);
+               user_ns = user_ns->lttng_user_ns_parent;
+       } while (user_ns);
+
+       /*
+        * Back and forth on locking strategy within Linux upstream for nsproxy.
+        * See Linux upstream commit 728dba3a39c66b3d8ac889ddbe38b5b1c264aec3
+        * "namespaces: Use task_lock and not rcu to protect nsproxy"
+        * for details.
+        */
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0) || \
+               LTTNG_UBUNTU_KERNEL_RANGE(3,13,11,36, 3,14,0,0) || \
+               LTTNG_UBUNTU_KERNEL_RANGE(3,16,1,11, 3,17,0,0) || \
+               LTTNG_RHEL_KERNEL_RANGE(3,10,0,229,13,0, 3,11,0,0,0,0))
+       proxy = p->nsproxy;
+#else
+       rcu_read_lock();
+       proxy = task_nsproxy(p);
+#endif
+       if (proxy) {
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,6,0))
+               trace_lttng_statedump_process_cgroup_ns(session, p, proxy->cgroup_ns);
+#endif
+               trace_lttng_statedump_process_ipc_ns(session, p, proxy->ipc_ns);
+#ifndef LTTNG_MNT_NS_MISSING_HEADER
+               trace_lttng_statedump_process_mnt_ns(session, p, proxy->mnt_ns);
+#endif
+               trace_lttng_statedump_process_net_ns(session, p, proxy->net_ns);
+               trace_lttng_statedump_process_uts_ns(session, p, proxy->uts_ns);
+       }
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0) || \
+               LTTNG_UBUNTU_KERNEL_RANGE(3,13,11,36, 3,14,0,0) || \
+               LTTNG_UBUNTU_KERNEL_RANGE(3,16,1,11, 3,17,0,0) || \
+               LTTNG_RHEL_KERNEL_RANGE(3,10,0,229,13,0, 3,11,0,0,0,0))
+       /* (nothing) */
+#else
+       rcu_read_unlock();
+#endif
 }
 
 static
This page took 0.024447 seconds and 4 git commands to generate.