Fix exec instrumentation: only for kernels 3.4.0 and higher
[lttng-modules.git] / lttng-statedump-impl.c
index e042a96deaceed9e941f1db06afbf4ea620892a7..be498acc437155223dd50bcc944cced350fa017e 100644 (file)
@@ -48,6 +48,7 @@
 
 #include "lttng-events.h"
 #include "wrapper/irqdesc.h"
+#include "wrapper/spinlock.h"
 
 #ifdef CONFIG_GENERIC_HARDIRQS
 #include <linux/irq.h>
@@ -255,12 +256,12 @@ void lttng_list_interrupts(struct lttng_session *session)
                        irq_desc_get_chip(desc)->name ? : "unnamed_irq_chip";
 
                local_irq_save(flags);
-               raw_spin_lock(&desc->lock);
+               wrapper_desc_spin_lock(&desc->lock);
                for (action = desc->action; action; action = action->next) {
                        trace_lttng_statedump_interrupt(session,
                                irq, irq_chip_name, action);
                }
-               raw_spin_unlock(&desc->lock);
+               wrapper_desc_spin_unlock(&desc->lock);
                local_irq_restore(flags);
        }
 #undef irq_to_desc
@@ -272,6 +273,33 @@ void list_interrupts(struct lttng_session *session)
 }
 #endif
 
+static
+void lttng_statedump_process_ns(struct lttng_session *session,
+               struct task_struct *p,
+               enum lttng_thread_type type,
+               enum lttng_execution_mode mode,
+               enum lttng_execution_submode submode,
+               enum lttng_process_status status)
+{
+       struct nsproxy *proxy;
+       struct pid_namespace *pid_ns;
+
+       rcu_read_lock();
+       proxy = task_nsproxy(p);
+       if (proxy) {
+               pid_ns = proxy->pid_ns;
+               do {
+                       trace_lttng_statedump_process_state(session,
+                               p, type, mode, submode, status, pid_ns);
+                       pid_ns = pid_ns->parent;
+               } while (pid_ns);
+       } else {
+               trace_lttng_statedump_process_state(session,
+                       p, type, mode, submode, status, NULL);
+       }
+       rcu_read_unlock();
+}
+
 static
 int lttng_enumerate_process_states(struct lttng_session *session)
 {
@@ -321,7 +349,7 @@ int lttng_enumerate_process_states(struct lttng_session *session)
                                type = LTTNG_USER_THREAD;
                        else
                                type = LTTNG_KERNEL_THREAD;
-                       trace_lttng_statedump_process_state(session,
+                       lttng_statedump_process_ns(session,
                                p, type, mode, submode, status);
                        task_unlock(p);
                } while_each_thread(g, p);
This page took 0.024985 seconds and 4 git commands to generate.