summaryrefslogtreecommitdiffstats
path: root/testsuite/systemtap.examples
diff options
context:
space:
mode:
authorKiran Prakesh <kiran@linux.vnet.ibm.com>2009-10-01 22:39:32 +0530
committerJosh Stone <jistone@redhat.com>2009-10-02 16:29:56 -0700
commitae3072f460693e85962556bf0529a729c7d97bf6 (patch)
treeaab6a3db669060012aea4a5c6bdabe597eac6c74 /testsuite/systemtap.examples
parenta8f5a3bf344f9b014c5adf8b5eada10d09f31219 (diff)
downloadsystemtap-steved-ae3072f460693e85962556bf0529a729c7d97bf6.tar.gz
systemtap-steved-ae3072f460693e85962556bf0529a729c7d97bf6.tar.xz
systemtap-steved-ae3072f460693e85962556bf0529a729c7d97bf6.zip
Scheduler Tapset based on kernel tracepoints
This patch adds kernel tracepoints based probes to the scheduler tapset along with the testcase, scheduler-test-tracepoints.stp and an example script, sched_switch.stp. Signed-off-by: Kiran Prakash <kiran@linux.vnet.ibm.com> Signed-off-by: Josh Stone <jistone@redhat.com>
Diffstat (limited to 'testsuite/systemtap.examples')
-rw-r--r--testsuite/systemtap.examples/profiling/sched_switch.meta14
-rw-r--r--testsuite/systemtap.examples/profiling/sched_switch.stp62
2 files changed, 76 insertions, 0 deletions
diff --git a/testsuite/systemtap.examples/profiling/sched_switch.meta b/testsuite/systemtap.examples/profiling/sched_switch.meta
new file mode 100644
index 00000000..8f1a2858
--- /dev/null
+++ b/testsuite/systemtap.examples/profiling/sched_switch.meta
@@ -0,0 +1,14 @@
+title: Display the task switches happeningt the scheduler
+name: sched_switch.stp
+version: 1.0
+author: kiran
+keywords: profiling functions
+subsystem: kernel
+status: production
+exit: user-controlled
+output: sorted-list on-exit
+scope: system-wide
+description: The sched_switch.stp script takes two arguments, first argument can be "pid" or "name" to indicate what is being passed as second argument. The script will trace the process based on pid/name and print the scheduler switches happening with the process. If no arguments are passed, it displays all the scheduler switches. This can be used to understand which tasks scheduler the current process being traced, out and when it gets scheduled in again.
+test_check: stap -p4 sched_switch.stp
+test_installcheck: stap sched_switch.stp -c "sleep 1"
+
diff --git a/testsuite/systemtap.examples/profiling/sched_switch.stp b/testsuite/systemtap.examples/profiling/sched_switch.stp
new file mode 100644
index 00000000..24973526
--- /dev/null
+++ b/testsuite/systemtap.examples/profiling/sched_switch.stp
@@ -0,0 +1,62 @@
+/* This script works similar to ftrace's sched_switch. It displays a list of
+ * processes which get switched in and out of the scheduler. The format of display
+ * is PROCESS_NAME PROCESS_PID CPU TIMESTAMP PID: PRIORITY: PROCESS STATE ->/+
+ * NEXT_PID : NEXT_PRIORITY: NEXT_STATE NEXT_PROCESS_NAME
+ * -> indicates that prev process is scheduled out and the next process is
+ * scheduled in.
+ * + indicates that prev process has woken up the next process.
+ * The usage is sched_switch.stp <"pid"/"name"> pid/name
+ */
+
+function state_calc(state) {
+ if(state == 0)
+ status = "R"
+ if(state == 1)
+ status = "S"
+ if(state == 2)
+ status = "D"
+ if(state == 4)
+ status = "T"
+ if(state == 8)
+ status = "T"
+ if(state == 16)
+ status = "Z"
+ if(state == 32)
+ status = "EXIT_DEAD"
+ return status
+}
+probe scheduler.wakeup
+{
+ %( $# == 2 %?
+
+ if(@1 == "pid")
+ if (task_pid != $2 && pid() != $2)
+ next
+ if(@1 == "name")
+ if (task_execname(task) != @2 && execname() != @2)
+ next
+
+ %)
+
+ printf("%-16s%5d%5d%d:%d:%s + %d:%d:%s %16s\n",
+ execname(), task_cpu(task), gettimeofday_ns(),
+ pid(), task_prio(task_current()), state_calc(task_state(task_current())),
+ task_pid(task), task_prio(task), state_calc(task_state(task)),
+ task_execname(task))
+}
+probe scheduler.ctxswitch
+{
+ %( $# == 2 %?
+
+ if(@1 == "pid")
+ if (next_pid != $2 && prev_pid != $2)
+ next
+ if(@1 == "name")
+ if (prev_task_name != @2 && next_task_name != @2)
+ next
+ %)
+
+ printf("%-16s%5d%5d%d:%d:%s ==> %d:%d:%s %16s\n",prev_task_name,
+ task_cpu(prev_task),gettimeofday_ns(),prev_pid,prev_priority,state_calc(prevtsk_state),next_pid,
+ next_priority,state_calc(nexttsk_state),next_task_name)
+}