|
|
@@ -5339,41 +5339,45 @@ static bool is_timestamp_in_us(char *trace_clock, bool use_trace_clock)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
-void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
|
|
|
- struct pevent_record *record, bool use_trace_clock)
|
|
|
+/**
|
|
|
+ * pevent_find_event_by_record - return the event from a given record
|
|
|
+ * @pevent: a handle to the pevent
|
|
|
+ * @record: The record to get the event from
|
|
|
+ *
|
|
|
+ * Returns the associated event for a given record, or NULL if non is
|
|
|
+ * is found.
|
|
|
+ */
|
|
|
+struct event_format *
|
|
|
+pevent_find_event_by_record(struct pevent *pevent, struct pevent_record *record)
|
|
|
{
|
|
|
- static const char *spaces = " "; /* 20 spaces */
|
|
|
- struct event_format *event;
|
|
|
- unsigned long secs;
|
|
|
- unsigned long usecs;
|
|
|
- unsigned long nsecs;
|
|
|
- const char *comm;
|
|
|
- void *data = record->data;
|
|
|
int type;
|
|
|
- int pid;
|
|
|
- int len;
|
|
|
- int p;
|
|
|
- bool use_usec_format;
|
|
|
-
|
|
|
- use_usec_format = is_timestamp_in_us(pevent->trace_clock,
|
|
|
- use_trace_clock);
|
|
|
- if (use_usec_format) {
|
|
|
- secs = record->ts / NSECS_PER_SEC;
|
|
|
- nsecs = record->ts - secs * NSECS_PER_SEC;
|
|
|
- }
|
|
|
|
|
|
if (record->size < 0) {
|
|
|
do_warning("ug! negative record size %d", record->size);
|
|
|
- return;
|
|
|
+ return NULL;
|
|
|
}
|
|
|
|
|
|
- type = trace_parse_common_type(pevent, data);
|
|
|
+ type = trace_parse_common_type(pevent, record->data);
|
|
|
|
|
|
- event = pevent_find_event(pevent, type);
|
|
|
- if (!event) {
|
|
|
- do_warning("ug! no event found for type %d", type);
|
|
|
- return;
|
|
|
- }
|
|
|
+ return pevent_find_event(pevent, type);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * pevent_print_event_task - Write the event task comm, pid and CPU
|
|
|
+ * @pevent: a handle to the pevent
|
|
|
+ * @s: the trace_seq to write to
|
|
|
+ * @event: the handle to the record's event
|
|
|
+ * @record: The record to get the event from
|
|
|
+ *
|
|
|
+ * Writes the tasks comm, pid and CPU to @s.
|
|
|
+ */
|
|
|
+void pevent_print_event_task(struct pevent *pevent, struct trace_seq *s,
|
|
|
+ struct event_format *event,
|
|
|
+ struct pevent_record *record)
|
|
|
+{
|
|
|
+ void *data = record->data;
|
|
|
+ const char *comm;
|
|
|
+ int pid;
|
|
|
|
|
|
pid = parse_common_pid(pevent, data);
|
|
|
comm = find_cmdline(pevent, pid);
|
|
|
@@ -5381,9 +5385,43 @@ void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
|
|
|
if (pevent->latency_format) {
|
|
|
trace_seq_printf(s, "%8.8s-%-5d %3d",
|
|
|
comm, pid, record->cpu);
|
|
|
- pevent_data_lat_fmt(pevent, s, record);
|
|
|
} else
|
|
|
trace_seq_printf(s, "%16s-%-5d [%03d]", comm, pid, record->cpu);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * pevent_print_event_time - Write the event timestamp
|
|
|
+ * @pevent: a handle to the pevent
|
|
|
+ * @s: the trace_seq to write to
|
|
|
+ * @event: the handle to the record's event
|
|
|
+ * @record: The record to get the event from
|
|
|
+ * @use_trace_clock: Set to parse according to the @pevent->trace_clock
|
|
|
+ *
|
|
|
+ * Writes the timestamp of the record into @s.
|
|
|
+ */
|
|
|
+void pevent_print_event_time(struct pevent *pevent, struct trace_seq *s,
|
|
|
+ struct event_format *event,
|
|
|
+ struct pevent_record *record,
|
|
|
+ bool use_trace_clock)
|
|
|
+{
|
|
|
+ unsigned long secs;
|
|
|
+ unsigned long usecs;
|
|
|
+ unsigned long nsecs;
|
|
|
+ int p;
|
|
|
+ bool use_usec_format;
|
|
|
+
|
|
|
+ use_usec_format = is_timestamp_in_us(pevent->trace_clock,
|
|
|
+ use_trace_clock);
|
|
|
+ if (use_usec_format) {
|
|
|
+ secs = record->ts / NSECS_PER_SEC;
|
|
|
+ nsecs = record->ts - secs * NSECS_PER_SEC;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (pevent->latency_format) {
|
|
|
+ trace_seq_printf(s, " %3d", record->cpu);
|
|
|
+ pevent_data_lat_fmt(pevent, s, record);
|
|
|
+ } else
|
|
|
+ trace_seq_printf(s, " [%03d]", record->cpu);
|
|
|
|
|
|
if (use_usec_format) {
|
|
|
if (pevent->flags & PEVENT_NSEC_OUTPUT) {
|
|
|
@@ -5394,11 +5432,28 @@ void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
|
|
|
p = 6;
|
|
|
}
|
|
|
|
|
|
- trace_seq_printf(s, " %5lu.%0*lu: %s: ",
|
|
|
- secs, p, usecs, event->name);
|
|
|
+ trace_seq_printf(s, " %5lu.%0*lu:", secs, p, usecs);
|
|
|
} else
|
|
|
- trace_seq_printf(s, " %12llu: %s: ",
|
|
|
- record->ts, event->name);
|
|
|
+ trace_seq_printf(s, " %12llu:", record->ts);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * pevent_print_event_data - Write the event data section
|
|
|
+ * @pevent: a handle to the pevent
|
|
|
+ * @s: the trace_seq to write to
|
|
|
+ * @event: the handle to the record's event
|
|
|
+ * @record: The record to get the event from
|
|
|
+ *
|
|
|
+ * Writes the parsing of the record's data to @s.
|
|
|
+ */
|
|
|
+void pevent_print_event_data(struct pevent *pevent, struct trace_seq *s,
|
|
|
+ struct event_format *event,
|
|
|
+ struct pevent_record *record)
|
|
|
+{
|
|
|
+ static const char *spaces = " "; /* 20 spaces */
|
|
|
+ int len;
|
|
|
+
|
|
|
+ trace_seq_printf(s, " %s: ", event->name);
|
|
|
|
|
|
/* Space out the event names evenly. */
|
|
|
len = strlen(event->name);
|
|
|
@@ -5408,6 +5463,23 @@ void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
|
|
|
pevent_event_info(s, event, record);
|
|
|
}
|
|
|
|
|
|
+void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
|
|
|
+ struct pevent_record *record, bool use_trace_clock)
|
|
|
+{
|
|
|
+ struct event_format *event;
|
|
|
+
|
|
|
+ event = pevent_find_event_by_record(pevent, record);
|
|
|
+ if (!event) {
|
|
|
+ do_warning("ug! no event found for type %d",
|
|
|
+ trace_parse_common_type(pevent, record->data));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ pevent_print_event_task(pevent, s, event, record);
|
|
|
+ pevent_print_event_time(pevent, s, event, record, use_trace_clock);
|
|
|
+ pevent_print_event_data(pevent, s, event, record);
|
|
|
+}
|
|
|
+
|
|
|
static int events_id_cmp(const void *a, const void *b)
|
|
|
{
|
|
|
struct event_format * const * ea = a;
|