aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2011-01-19 21:50:41 -0500
committerSteven Rostedt <rostedt@goodmis.org>2011-01-19 21:50:41 -0500
commite2fd3f44d10c5ac28727215d65445e7cd9342e49 (patch)
tree1b66342dcecc8d21a80d93460f8a73260317ff14
parente2d243799e10c70d4e6ffc25cd9578f62f06b492 (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.c109
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
48static int sched_wakeup_handler(struct trace_seq *s, struct record *record, 48static 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, " + "); 68static 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}