[PATCH 3/4] tracing/sched: Add sched_rt_push and sched_rt_pull tracepoints

From: Steven Rostedt
Date: Mon Sep 20 2010 - 22:42:06 EST


From: Steven Rostedt <srostedt@xxxxxxxxxx>

Seeing how tasks are affected by the push/pull algorithm of the RT
scheduler helps in understanding the migration of RT tasks.

Adding these two tracepoints to show when an RT task is pushed from
one CPU to another, or pulled helps with analyzing the way the
scheduler works.

Cc: Peter Zijlstra <a.p.zijlstra@xxxxxxxxx>
Cc: Gregory Haskins <ghaskins@xxxxxxxxxx>
Signed-off-by: Steven Rostedt <rostedt@xxxxxxxxxxx>
---
include/trace/events/sched.h | 36 ++++++++++++++++++++++++++++++++++++
kernel/sched_rt.c | 2 ++
2 files changed, 38 insertions(+), 0 deletions(-)

diff --git a/include/trace/events/sched.h b/include/trace/events/sched.h
index 9208c92..0e0c108 100644
--- a/include/trace/events/sched.h
+++ b/include/trace/events/sched.h
@@ -362,6 +362,42 @@ TRACE_EVENT(sched_stat_runtime,
(unsigned long long)__entry->vruntime)
);

+DECLARE_EVENT_CLASS(sched_rt_push_pull,
+
+ TP_PROTO(struct task_struct *tsk, int cpu),
+
+ TP_ARGS(tsk, cpu),
+
+ TP_STRUCT__entry(
+ __array( char, comm, TASK_COMM_LEN )
+ __field( pid_t, pid )
+ __field( int, prio )
+ __field( int, cpu )
+ ),
+
+ TP_fast_assign(
+ memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN);
+ __entry->pid = tsk->pid;
+ __entry->prio = tsk->prio;
+ __entry->cpu = cpu;
+ ),
+
+ TP_printk("comm=%s pid=%d prio=%d dest_cpu=%d",
+ __entry->comm, __entry->pid,
+ __entry->prio, __entry->cpu)
+);
+
+DEFINE_EVENT(sched_rt_push_pull, sched_rt_push,
+ TP_PROTO(struct task_struct *tsk, int cpu),
+ TP_ARGS(tsk, cpu));
+
+DEFINE_EVENT_PRINT(sched_rt_push_pull, sched_rt_pull,
+ TP_PROTO(struct task_struct *tsk, int cpu),
+ TP_ARGS(tsk, cpu),
+ TP_printk("comm=%s pid=%d prio=%d src_cpu=%d",
+ __entry->comm, __entry->pid,
+ __entry->prio, __entry->cpu));
+
#endif /* _TRACE_SCHED_H */

/* This part must be outside protection */
diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c
index baef30f..3aed9b0 100644
--- a/kernel/sched_rt.c
+++ b/kernel/sched_rt.c
@@ -1372,6 +1372,7 @@ static int push_rt_task(struct rq *rq)
}

deactivate_task(rq, next_task, 0);
+ trace_sched_rt_push(next_task, lowest_rq->cpu);
set_task_cpu(next_task, lowest_rq->cpu);
activate_task(lowest_rq, next_task, 0);

@@ -1455,6 +1456,7 @@ static int pull_rt_task(struct rq *this_rq)
ret = 1;

deactivate_task(src_rq, p, 0);
+ trace_sched_rt_pull(p, src_rq->cpu);
set_task_cpu(p, this_cpu);
activate_task(this_rq, p, 0);
/*
--
1.7.1


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/