diff options
author | Steven Rostedt <srostedt@redhat.com> | 2011-01-19 21:50:41 -0500 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2011-01-19 21:50:41 -0500 |
commit | e2fd3f44d10c5ac28727215d65445e7cd9342e49 (patch) | |
tree | 1b66342dcecc8d21a80d93460f8a73260317ff14 | |
parent | e2d243799e10c70d4e6ffc25cd9578f62f06b492 (diff) |
trace-cmd: Change sched switch/wakeup plugin output
The current format for sched_switch and sched_wakeup events is:
trace-cmd-2271 [003] 6201.438152: sched_switch: 2271:120:S ==> 0:120: kworker/0:1
<idle>-0 [002] 6201.438301: sched_wakeup: 0:?:? + 2270:120:? trace-cmd [002] Success
<idle>-0 [002] 6201.438311: sched_switch: 0:120:R ==> 2270:120: trace-cmd
trace-cmd-2270 [002] 6201.438393: sched_switch: 2270:120:S ==> 0:120: kworker/0:1
<idle>-0 [000] 6201.438799: sched_wakeup: 0:?:? + 10:120:? kworker/0:1 [000] Success
<idle>-0 [000] 6201.438839: sched_switch: 0:120:R ==> 10:120: kworker/0:1
Which kinda sucks. Rewrite it to look like.
trace-cmd-2271 [003] 6201.438152: sched_switch: trace-cmd:2271 [120] S ==> kworker/0:1:0 [120]
<idle>-0 [002] 6201.438301: sched_wakeup: trace-cmd:2270 [120] success=1 CPU:002
<idle>-0 [002] 6201.438311: sched_switch: kworker/0:1:0 [120] R ==> trace-cmd:2270 [120]
trace-cmd-2270 [002] 6201.438393: sched_switch: trace-cmd:2270 [120] S ==> kworker/0:1:0 [120]
<idle>-0 [000] 6201.438799: sched_wakeup: kworker/0:1:10 [120] success=1 CPU:000
<idle>-0 [000] 6201.438839: sched_switch: swapper:0 [120] R ==> kworker/0:1:10 [120]
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r-- | plugin_sched_switch.c | 109 |
1 files changed, 47 insertions, 62 deletions
diff --git a/plugin_sched_switch.c b/plugin_sched_switch.c index 7490e16..3872595 100644 --- a/plugin_sched_switch.c +++ b/plugin_sched_switch.c | |||
@@ -45,59 +45,50 @@ static void write_state(struct trace_seq *s, int val) | |||
45 | trace_seq_putc(s, 'R'); | 45 | trace_seq_putc(s, 'R'); |
46 | } | 46 | } |
47 | 47 | ||
48 | static int sched_wakeup_handler(struct trace_seq *s, struct record *record, | 48 | static void write_and_save_comm(struct format_field *field, |
49 | struct event_format *event, void *context) | 49 | struct record *record, |
50 | struct trace_seq *s, int pid) | ||
50 | { | 51 | { |
51 | struct format_field *field; | 52 | const char *comm; |
52 | unsigned long long val; | 53 | int len; |
53 | 54 | ||
54 | if (pevent_get_common_field_val(s, event, "common_pid", record, &val, 1)) | 55 | comm = (char *)(record->data + field->offset); |
55 | return trace_seq_putc(s, '!'); | 56 | len = s->len; |
57 | trace_seq_printf(s, "%.*s", | ||
58 | field->size, comm); | ||
56 | 59 | ||
57 | trace_seq_printf(s, "%lld:", val); | 60 | /* make sure the comm has a \0 at the end. */ |
61 | trace_seq_terminate(s); | ||
62 | comm = &s->buffer[len]; | ||
58 | 63 | ||
59 | if (pevent_get_field_val(s, event, "prev_prio", record, &val, 0)) | 64 | /* Help out the comm to ids. This will handle dups */ |
60 | trace_seq_puts(s, "?:"); | 65 | pevent_register_comm(field->event->pevent, comm, pid); |
61 | else | 66 | } |
62 | trace_seq_printf(s, "%lld:", val); | ||
63 | |||
64 | if (pevent_get_field_val(s, event, "prev_state", record, &val, 0)) | ||
65 | trace_seq_putc(s, '?'); | ||
66 | else | ||
67 | write_state(s, val); | ||
68 | 67 | ||
69 | trace_seq_puts(s, " + "); | 68 | static int sched_wakeup_handler(struct trace_seq *s, struct record *record, |
69 | struct event_format *event, void *context) | ||
70 | { | ||
71 | struct format_field *field; | ||
72 | unsigned long long val; | ||
70 | 73 | ||
71 | if (pevent_get_field_val(s, event, "pid", record, &val, 1)) | 74 | if (pevent_get_field_val(s, event, "pid", record, &val, 1)) |
72 | return trace_seq_putc(s, '!'); | 75 | return trace_seq_putc(s, '!'); |
73 | 76 | ||
74 | trace_seq_printf(s, "%lld:", val); | 77 | field = pevent_find_any_field(event, "comm"); |
75 | 78 | if (field) { | |
76 | if (pevent_get_field_val(s, event, "prio", record, &val, 1)) | 79 | write_and_save_comm(field, record, s, val); |
77 | return trace_seq_putc(s, '!'); | 80 | trace_seq_putc(s, ':'); |
78 | |||
79 | trace_seq_printf(s, "%lld:", val); | ||
80 | |||
81 | if (pevent_get_field_val(s, event, "state", record, &val, 0)) | ||
82 | trace_seq_putc(s, '?'); | ||
83 | else | ||
84 | write_state(s, val); | ||
85 | |||
86 | trace_seq_putc(s, ' '); | ||
87 | |||
88 | field = pevent_find_field(event, "comm"); | ||
89 | if (!field) { | ||
90 | trace_seq_printf(s, "<CANT FIND FIELD %s>", "next_comm"); | ||
91 | return trace_seq_putc(s, '!'); | ||
92 | } | 81 | } |
82 | trace_seq_printf(s, "%lld", val); | ||
93 | 83 | ||
94 | trace_seq_printf(s, "%.*s", field->size, (char *)(record->data + field->offset)); | 84 | if (pevent_get_field_val(s, event, "prio", record, &val, 0) == 0) |
85 | trace_seq_printf(s, " [%lld]", val); | ||
95 | 86 | ||
96 | if (pevent_get_field_val(s, event, "target_cpu", record, &val, 0) == 0) | 87 | if (pevent_get_field_val(s, event, "success", record, &val, 1) == 0) |
97 | trace_seq_printf(s, " [%03llu]", val); | 88 | trace_seq_printf(s, " success=%lld", val); |
98 | 89 | ||
99 | if (pevent_get_field_val(s, event, "success", record, &val, 0) == 0) | 90 | if (pevent_get_field_val(s, event, "target_cpu", record, &val, 0) == 0) |
100 | trace_seq_puts(s, val ? " Success" : " Failed"); | 91 | trace_seq_printf(s, " CPU:%03llu", val); |
101 | 92 | ||
102 | return 0; | 93 | return 0; |
103 | } | 94 | } |
@@ -111,39 +102,33 @@ static int sched_switch_handler(struct trace_seq *s, struct record *record, | |||
111 | if (pevent_get_field_val(s, event, "prev_pid", record, &val, 1)) | 102 | if (pevent_get_field_val(s, event, "prev_pid", record, &val, 1)) |
112 | return trace_seq_putc(s, '!'); | 103 | return trace_seq_putc(s, '!'); |
113 | 104 | ||
114 | trace_seq_printf(s, "%lld:", val); | 105 | field = pevent_find_any_field(event, "prev_comm"); |
115 | 106 | if (field) { | |
116 | if (pevent_get_field_val(s, event, "prev_prio", record, &val, 1)) | 107 | write_and_save_comm(field, record, s, val); |
117 | return trace_seq_putc(s, '!'); | 108 | trace_seq_putc(s, ':'); |
109 | } | ||
110 | trace_seq_printf(s, "%lld ", val); | ||
118 | 111 | ||
119 | trace_seq_printf(s, "%lld:", val); | 112 | if (pevent_get_field_val(s, event, "prev_prio", record, &val, 0) == 0) |
113 | trace_seq_printf(s, "[%lld] ", val); | ||
120 | 114 | ||
121 | if (pevent_get_field_val(s, event, "prev_state", record, &val, 1)) | 115 | if (pevent_get_field_val(s, event, "prev_state", record, &val, 0) == 0) |
122 | return trace_seq_putc(s, '!'); | 116 | write_state(s, val); |
123 | |||
124 | write_state(s, val); | ||
125 | 117 | ||
126 | trace_seq_puts(s, " ==> "); | 118 | trace_seq_puts(s, " ==> "); |
127 | 119 | ||
128 | if (pevent_get_field_val(s, event, "next_pid", record, &val, 1)) | 120 | if (pevent_get_field_val(s, event, "next_pid", record, &val, 1)) |
129 | return trace_seq_putc(s, '!'); | 121 | return trace_seq_putc(s, '!'); |
130 | 122 | ||
131 | trace_seq_printf(s, "%lld:", val); | ||
132 | |||
133 | if (pevent_get_field_val(s, event, "next_prio", record, &val, 1)) | ||
134 | return trace_seq_putc(s, '!'); | ||
135 | |||
136 | trace_seq_printf(s, "%lld:", val); | ||
137 | |||
138 | trace_seq_putc(s, ' '); | ||
139 | |||
140 | field = pevent_find_any_field(event, "next_comm"); | 123 | field = pevent_find_any_field(event, "next_comm"); |
141 | if (!field) { | 124 | if (field) { |
142 | trace_seq_printf(s, "<CANT FIND FIELD %s>", "next_comm"); | 125 | write_and_save_comm(field, record, s, val); |
143 | return trace_seq_putc(s, '!'); | 126 | trace_seq_putc(s, ':'); |
144 | } | 127 | } |
128 | trace_seq_printf(s, "%lld", val); | ||
145 | 129 | ||
146 | trace_seq_printf(s, "%.*s", field->size, (char *)(record->data + field->offset)); | 130 | if (pevent_get_field_val(s, event, "next_prio", record, &val, 0) == 0) |
131 | trace_seq_printf(s, " [%lld]", val); | ||
147 | 132 | ||
148 | return 0; | 133 | return 0; |
149 | } | 134 | } |