Fix: Use MAX_RT_PRIO offset in sched_wakeup_template
[lttng-modules.git] / instrumentation / events / lttng-module / sched.h
index ac61bcef3d4a79335a53166574d9b39a99c79813..b6a13ce435c6637f81d1b1e8cf22376ac2944124 100644 (file)
@@ -6,16 +6,39 @@
 
 #include "../../../probes/lttng-tracepoint-event.h"
 #include <linux/sched.h>
+#include <linux/pid_namespace.h>
 #include <linux/binfmts.h>
 #include <linux/version.h>
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,9,0))
 #include <linux/sched/rt.h>
 #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_
 
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,19,0))
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,4,0))
+
+static inline long __trace_sched_switch_state(bool preempt, struct task_struct *p)
+{
+#ifdef CONFIG_SCHED_DEBUG
+       BUG_ON(p != current);
+#endif /* CONFIG_SCHED_DEBUG */
+       /*
+        * Preemption ignores task state, therefore preempted tasks are always RUNNING
+        * (we will not have dequeued if state != RUNNING).
+        */
+       return preempt ? TASK_RUNNING | TASK_STATE_MAX : p->state;
+}
+
+#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3,19,0))
 
 static inline long __trace_sched_switch_state(struct task_struct *p)
 {
@@ -122,6 +145,21 @@ LTTNG_TRACEPOINT_EVENT(sched_kthread_stop_ret,
 /*
  * Tracepoint for waking up a task:
  */
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0))
+LTTNG_TRACEPOINT_EVENT_CLASS(sched_wakeup_template,
+
+       TP_PROTO(struct task_struct *p),
+
+       TP_ARGS(p),
+
+       TP_FIELDS(
+               ctf_array_text(char, comm, p->comm, TASK_COMM_LEN)
+               ctf_integer(pid_t, tid, p->pid)
+               ctf_integer(int, prio, p->prio - MAX_RT_PRIO)
+               ctf_integer(int, target_cpu, task_cpu(p))
+       )
+)
+#else /* #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0)) */
 LTTNG_TRACEPOINT_EVENT_CLASS(sched_wakeup_template,
 
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
@@ -137,15 +175,41 @@ LTTNG_TRACEPOINT_EVENT_CLASS(sched_wakeup_template,
        TP_FIELDS(
                ctf_array_text(char, comm, p->comm, TASK_COMM_LEN)
                ctf_integer(pid_t, tid, p->pid)
-               ctf_integer(int, prio, p->prio)
+               ctf_integer(int, prio, p->prio - MAX_RT_PRIO)
                ctf_integer(int, success, success)
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32))
                ctf_integer(int, target_cpu, task_cpu(p))
 #endif
        )
 )
+#endif /* #else #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0)) */
 
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0))
+
+/*
+ * Tracepoint called when waking a task; this tracepoint is guaranteed to be
+ * called from the waking context.
+ */
+LTTNG_TRACEPOINT_EVENT_INSTANCE(sched_wakeup_template, sched_waking,
+            TP_PROTO(struct task_struct *p),
+            TP_ARGS(p))
+
+/*
+ * Tracepoint called when the task is actually woken; p->state == TASK_RUNNNG.
+ * It it not always called from the waking context.
+ */
+LTTNG_TRACEPOINT_EVENT_INSTANCE(sched_wakeup_template, sched_wakeup,
+            TP_PROTO(struct task_struct *p),
+            TP_ARGS(p))
+
+/*
+ * Tracepoint for waking up a new task:
+ */
+LTTNG_TRACEPOINT_EVENT_INSTANCE(sched_wakeup_template, sched_wakeup_new,
+            TP_PROTO(struct task_struct *p),
+            TP_ARGS(p))
+
+#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
 
 LTTNG_TRACEPOINT_EVENT_INSTANCE(sched_wakeup_template, sched_wakeup,
             TP_PROTO(struct task_struct *p, int success),
@@ -178,7 +242,13 @@ LTTNG_TRACEPOINT_EVENT_INSTANCE(sched_wakeup_template, sched_wakeup_new,
  */
 LTTNG_TRACEPOINT_EVENT(sched_switch,
 
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,4,0))
+       TP_PROTO(bool preempt,
+                struct task_struct *prev,
+                struct task_struct *next),
+
+       TP_ARGS(preempt, prev, next),
+#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
        TP_PROTO(struct task_struct *prev,
                 struct task_struct *next),
 
@@ -194,7 +264,9 @@ LTTNG_TRACEPOINT_EVENT(sched_switch,
                ctf_array_text(char, prev_comm, prev->comm, TASK_COMM_LEN)
                ctf_integer(pid_t, prev_tid, prev->pid)
                ctf_integer(int, prev_prio, prev->prio - MAX_RT_PRIO)
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,4,0))
+               ctf_integer(long, prev_state, __trace_sched_switch_state(preempt, prev))
+#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
                ctf_integer(long, prev_state, __trace_sched_switch_state(prev))
 #else
                ctf_integer(long, prev_state, prev->state)
@@ -288,19 +360,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
        )
 )
 
This page took 0.026068 seconds and 4 git commands to generate.