Commit 07a4bddd authored by Steven Rostedt's avatar Steven Rostedt Committed by Ingo Molnar

perf tools: Still continue on failed parsing of an event

Even though an event may fail to parse, we should not kill the
entire report. The trace should still be able to show what it
can.

If an event fails to parse, a warning is printed, and the output
continues.
Signed-off-by: default avatarSteven Rostedt <srostedt@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
LKML-Reference: <20091014194359.190809589@goodmis.org>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 13999e59
...@@ -613,7 +613,7 @@ static enum event_type read_token_item(char **tok) ...@@ -613,7 +613,7 @@ static enum event_type read_token_item(char **tok)
static int test_type(enum event_type type, enum event_type expect) static int test_type(enum event_type type, enum event_type expect)
{ {
if (type != expect) { if (type != expect) {
die("Error: expected type %d but read %d", warning("Error: expected type %d but read %d",
expect, type); expect, type);
return -1; return -1;
} }
...@@ -624,13 +624,13 @@ static int test_type_token(enum event_type type, char *token, ...@@ -624,13 +624,13 @@ static int test_type_token(enum event_type type, char *token,
enum event_type expect, const char *expect_tok) enum event_type expect, const char *expect_tok)
{ {
if (type != expect) { if (type != expect) {
die("Error: expected type %d but read %d", warning("Error: expected type %d but read %d",
expect, type); expect, type);
return -1; return -1;
} }
if (strcmp(token, expect_tok) != 0) { if (strcmp(token, expect_tok) != 0) {
die("Error: expected '%s' but read '%s'", warning("Error: expected '%s' but read '%s'",
expect_tok, token); expect_tok, token);
return -1; return -1;
} }
...@@ -668,7 +668,7 @@ static int __read_expected(enum event_type expect, const char *str, int newline_ ...@@ -668,7 +668,7 @@ static int __read_expected(enum event_type expect, const char *str, int newline_
free_token(token); free_token(token);
return 0; return ret;
} }
static int read_expected(enum event_type expect, const char *str) static int read_expected(enum event_type expect, const char *str)
...@@ -1258,12 +1258,12 @@ process_op(struct event *event, struct print_arg *arg, char **tok) ...@@ -1258,12 +1258,12 @@ process_op(struct event *event, struct print_arg *arg, char **tok)
type = process_array(event, arg, tok); type = process_array(event, arg, tok);
} else { } else {
die("unknown op '%s'", token); warning("unknown op '%s'", token);
event->flags |= EVENT_FL_FAILED;
/* the arg is now the left side */ /* the arg is now the left side */
return EVENT_NONE; return EVENT_NONE;
} }
if (type == EVENT_OP) { if (type == EVENT_OP) {
int prio; int prio;
...@@ -2873,7 +2873,7 @@ void print_event(int cpu, void *data, int size, unsigned long long nsecs, ...@@ -2873,7 +2873,7 @@ void print_event(int cpu, void *data, int size, unsigned long long nsecs,
event = trace_find_event(type); event = trace_find_event(type);
if (!event) { if (!event) {
printf("ug! no event found for type %d\n", type); warning("ug! no event found for type %d", type);
return; return;
} }
...@@ -2887,6 +2887,12 @@ void print_event(int cpu, void *data, int size, unsigned long long nsecs, ...@@ -2887,6 +2887,12 @@ void print_event(int cpu, void *data, int size, unsigned long long nsecs,
comm, pid, cpu, comm, pid, cpu,
secs, nsecs, event->name); secs, nsecs, event->name);
if (event->flags & EVENT_FL_FAILED) {
printf("EVENT '%s' FAILED TO PARSE\n",
event->name);
return;
}
pretty_print(data, size, event); pretty_print(data, size, event);
printf("\n"); printf("\n");
} }
...@@ -3120,12 +3126,16 @@ int parse_event_file(char *buf, unsigned long size, char *sys) ...@@ -3120,12 +3126,16 @@ int parse_event_file(char *buf, unsigned long size, char *sys)
die("failed to read event id"); die("failed to read event id");
ret = event_read_format(event); ret = event_read_format(event);
if (ret < 0) if (ret < 0) {
die("failed to read event format"); warning("failed to read event format for %s", event->name);
goto event_failed;
}
ret = event_read_print(event); ret = event_read_print(event);
if (ret < 0) if (ret < 0) {
die("failed to read event print fmt"); warning("failed to read event print fmt for %s", event->name);
goto event_failed;
}
event->system = strdup(sys); event->system = strdup(sys);
...@@ -3135,6 +3145,12 @@ int parse_event_file(char *buf, unsigned long size, char *sys) ...@@ -3135,6 +3145,12 @@ int parse_event_file(char *buf, unsigned long size, char *sys)
add_event(event); add_event(event);
return 0; return 0;
event_failed:
event->flags |= EVENT_FL_FAILED;
/* still add it even if it failed */
add_event(event);
return -1;
} }
void parse_set_info(int nr_cpus, int long_sz) void parse_set_info(int nr_cpus, int long_sz)
......
...@@ -139,12 +139,14 @@ struct event { ...@@ -139,12 +139,14 @@ struct event {
}; };
enum { enum {
EVENT_FL_ISFTRACE = 1, EVENT_FL_ISFTRACE = 0x01,
EVENT_FL_ISPRINT = 2, EVENT_FL_ISPRINT = 0x02,
EVENT_FL_ISBPRINT = 4, EVENT_FL_ISBPRINT = 0x04,
EVENT_FL_ISFUNC = 8, EVENT_FL_ISFUNC = 0x08,
EVENT_FL_ISFUNCENT = 16, EVENT_FL_ISFUNCENT = 0x10,
EVENT_FL_ISFUNCRET = 32, EVENT_FL_ISFUNCRET = 0x20,
EVENT_FL_FAILED = 0x80000000
}; };
struct record { struct record {
......
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