perf event: Introduce perf_event__fprintf

So that tools like 'perf test' can print the events when in verbose
mode, for instance.

Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-xnovdqfi25nc48gy6604k7yp@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent e60770a0
...@@ -433,6 +433,11 @@ int perf_event__synthesize_kernel_mmap(struct perf_tool *tool, ...@@ -433,6 +433,11 @@ int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
return err; return err;
} }
size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp)
{
return fprintf(fp, ": %s:%d\n", event->comm.comm, event->comm.tid);
}
int perf_event__process_comm(struct perf_tool *tool __used, int perf_event__process_comm(struct perf_tool *tool __used,
union perf_event *event, union perf_event *event,
struct perf_sample *sample __used, struct perf_sample *sample __used,
...@@ -440,7 +445,8 @@ int perf_event__process_comm(struct perf_tool *tool __used, ...@@ -440,7 +445,8 @@ int perf_event__process_comm(struct perf_tool *tool __used,
{ {
struct thread *thread = machine__findnew_thread(machine, event->comm.tid); struct thread *thread = machine__findnew_thread(machine, event->comm.tid);
dump_printf(": %s:%d\n", event->comm.comm, event->comm.tid); if (dump_trace)
perf_event__fprintf_comm(event, stdout);
if (thread == NULL || thread__set_comm(thread, event->comm.comm)) { if (thread == NULL || thread__set_comm(thread, event->comm.comm)) {
dump_printf("problem processing PERF_RECORD_COMM, skipping event.\n"); dump_printf("problem processing PERF_RECORD_COMM, skipping event.\n");
...@@ -566,6 +572,13 @@ static int perf_event__process_kernel_mmap(struct perf_tool *tool __used, ...@@ -566,6 +572,13 @@ static int perf_event__process_kernel_mmap(struct perf_tool *tool __used,
return -1; return -1;
} }
size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp)
{
return fprintf(fp, " %d/%d: [%#" PRIx64 "(%#" PRIx64 ") @ %#" PRIx64 "]: %s\n",
event->mmap.pid, event->mmap.tid, event->mmap.start,
event->mmap.len, event->mmap.pgoff, event->mmap.filename);
}
int perf_event__process_mmap(struct perf_tool *tool, int perf_event__process_mmap(struct perf_tool *tool,
union perf_event *event, union perf_event *event,
struct perf_sample *sample __used, struct perf_sample *sample __used,
...@@ -576,9 +589,8 @@ int perf_event__process_mmap(struct perf_tool *tool, ...@@ -576,9 +589,8 @@ int perf_event__process_mmap(struct perf_tool *tool,
u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
int ret = 0; int ret = 0;
dump_printf(" %d/%d: [%#" PRIx64 "(%#" PRIx64 ") @ %#" PRIx64 "]: %s\n", if (dump_trace)
event->mmap.pid, event->mmap.tid, event->mmap.start, perf_event__fprintf_mmap(event, stdout);
event->mmap.len, event->mmap.pgoff, event->mmap.filename);
if (cpumode == PERF_RECORD_MISC_GUEST_KERNEL || if (cpumode == PERF_RECORD_MISC_GUEST_KERNEL ||
cpumode == PERF_RECORD_MISC_KERNEL) { cpumode == PERF_RECORD_MISC_KERNEL) {
...@@ -606,6 +618,13 @@ int perf_event__process_mmap(struct perf_tool *tool, ...@@ -606,6 +618,13 @@ int perf_event__process_mmap(struct perf_tool *tool,
return 0; return 0;
} }
size_t perf_event__fprintf_task(union perf_event *event, FILE *fp)
{
return fprintf(fp, "(%d:%d):(%d:%d)\n",
event->fork.pid, event->fork.tid,
event->fork.ppid, event->fork.ptid);
}
int perf_event__process_task(struct perf_tool *tool __used, int perf_event__process_task(struct perf_tool *tool __used,
union perf_event *event, union perf_event *event,
struct perf_sample *sample __used, struct perf_sample *sample __used,
...@@ -614,8 +633,8 @@ int perf_event__process_task(struct perf_tool *tool __used, ...@@ -614,8 +633,8 @@ int perf_event__process_task(struct perf_tool *tool __used,
struct thread *thread = machine__findnew_thread(machine, event->fork.tid); struct thread *thread = machine__findnew_thread(machine, event->fork.tid);
struct thread *parent = machine__findnew_thread(machine, event->fork.ptid); struct thread *parent = machine__findnew_thread(machine, event->fork.ptid);
dump_printf("(%d:%d):(%d:%d)\n", event->fork.pid, event->fork.tid, if (dump_trace)
event->fork.ppid, event->fork.ptid); perf_event__fprintf_task(event, stdout);
if (event->header.type == PERF_RECORD_EXIT) { if (event->header.type == PERF_RECORD_EXIT) {
machine__remove_thread(machine, thread); machine__remove_thread(machine, thread);
...@@ -631,6 +650,29 @@ int perf_event__process_task(struct perf_tool *tool __used, ...@@ -631,6 +650,29 @@ int perf_event__process_task(struct perf_tool *tool __used,
return 0; return 0;
} }
size_t perf_event__fprintf(union perf_event *event, FILE *fp)
{
size_t ret = fprintf(fp, "PERF_RECORD_%s",
perf_event__name(event->header.type));
switch (event->header.type) {
case PERF_RECORD_COMM:
ret += perf_event__fprintf_comm(event, fp);
break;
case PERF_RECORD_FORK:
case PERF_RECORD_EXIT:
ret += perf_event__fprintf_task(event, fp);
break;
case PERF_RECORD_MMAP:
ret += perf_event__fprintf_mmap(event, fp);
break;
default:
ret += fprintf(fp, "\n");
}
return ret;
}
int perf_event__process(struct perf_tool *tool, union perf_event *event, int perf_event__process(struct perf_tool *tool, union perf_event *event,
struct perf_sample *sample, struct machine *machine) struct perf_sample *sample, struct machine *machine)
{ {
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#define __PERF_RECORD_H #define __PERF_RECORD_H
#include <limits.h> #include <limits.h>
#include <stdio.h>
#include "../perf.h" #include "../perf.h"
#include "map.h" #include "map.h"
...@@ -199,4 +200,9 @@ int perf_event__parse_sample(const union perf_event *event, u64 type, ...@@ -199,4 +200,9 @@ int perf_event__parse_sample(const union perf_event *event, u64 type,
int sample_size, bool sample_id_all, int sample_size, bool sample_id_all,
struct perf_sample *sample, bool swapped); struct perf_sample *sample, bool swapped);
size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp);
size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp);
size_t perf_event__fprintf_task(union perf_event *event, FILE *fp);
size_t perf_event__fprintf(union perf_event *event, FILE *fp);
#endif /* __PERF_RECORD_H */ #endif /* __PERF_RECORD_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment