perf: add perf-inject builtin
Currently, perf 'live mode' writes build-ids at the end of the session, which isn't actually useful for processing live mode events. What would be better would be to have the build-ids sent before any of the samples that reference them, which can be done by processing the event stream and retrieving the build-ids on the first hit. Doing that in perf-record itself, however, is off-limits. This patch introduces perf-inject, which does the same job while leaving perf-record untouched. Normal mode perf still records the build-ids at the end of the session as it should, but for live mode, perf-inject can be injected in between the record and report steps e.g.: perf record -o - ./hackbench 10 | perf inject -v -b | perf report -v -i - perf-inject reads a perf-record event stream and repipes it to stdout. At any point the processing code can inject other events into the event stream - in this case build-ids (-b option) are read and injected as needed into the event stream. Build-ids are just the first user of perf-inject - potentially anything that needs userspace processing to augment the trace stream with additional information could make use of this facility. Cc: Ingo Molnar <mingo@elte.hu> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Frédéric Weisbecker <fweisbec@gmail.com> LKML-Reference: <1272696080-16435-3-git-send-email-tzanussi@gmail.com> Signed-off-by: Tom Zanussi <tzanussi@gmail.com> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
committed by
Arnaldo Carvalho de Melo
parent
789688faef
commit
454c407ec1
@ -51,6 +51,7 @@ static int long_size;
|
||||
static unsigned long page_size;
|
||||
|
||||
static ssize_t calc_data_size;
|
||||
static bool repipe;
|
||||
|
||||
static int do_read(int fd, void *buf, int size)
|
||||
{
|
||||
@ -62,6 +63,13 @@ static int do_read(int fd, void *buf, int size)
|
||||
if (ret <= 0)
|
||||
return -1;
|
||||
|
||||
if (repipe) {
|
||||
int retw = write(STDOUT_FILENO, buf, ret);
|
||||
|
||||
if (retw <= 0 || retw != ret)
|
||||
die("repiping input file");
|
||||
}
|
||||
|
||||
size -= ret;
|
||||
buf += ret;
|
||||
}
|
||||
@ -116,6 +124,13 @@ static char *read_string(void)
|
||||
if (!r)
|
||||
die("no data");
|
||||
|
||||
if (repipe) {
|
||||
int retw = write(STDOUT_FILENO, &c, 1);
|
||||
|
||||
if (retw <= 0 || retw != r)
|
||||
die("repiping input file string");
|
||||
}
|
||||
|
||||
buf[size++] = c;
|
||||
|
||||
if (!c)
|
||||
@ -454,7 +469,7 @@ struct record *trace_read_data(int cpu)
|
||||
return data;
|
||||
}
|
||||
|
||||
ssize_t trace_report(int fd)
|
||||
ssize_t trace_report(int fd, bool __repipe)
|
||||
{
|
||||
char buf[BUFSIZ];
|
||||
char test[] = { 23, 8, 68 };
|
||||
@ -465,6 +480,7 @@ ssize_t trace_report(int fd)
|
||||
ssize_t size;
|
||||
|
||||
calc_data_size = 1;
|
||||
repipe = __repipe;
|
||||
|
||||
input_fd = fd;
|
||||
|
||||
@ -499,6 +515,7 @@ ssize_t trace_report(int fd)
|
||||
|
||||
size = calc_data_size - 1;
|
||||
calc_data_size = 0;
|
||||
repipe = false;
|
||||
|
||||
if (show_funcs) {
|
||||
print_funcs();
|
||||
|
Reference in New Issue
Block a user