Commit 5538beca authored by Frederic Weisbecker's avatar Frederic Weisbecker

perf tools: Propagate event parse error handling

Better handle event parsing error by propagating the details
in upper layers or by dumping some failure message. So that
the user knows he has some crazy events in the batch.
Signed-off-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Stephane Eranian <eranian@google.com>
parent 98e1da90
...@@ -559,8 +559,13 @@ static int test__basic_mmap(void) ...@@ -559,8 +559,13 @@ static int test__basic_mmap(void)
goto out_munmap; goto out_munmap;
} }
perf_event__parse_sample(event, attr.sample_type, sample_size, err = perf_event__parse_sample(event, attr.sample_type, sample_size,
false, &sample); false, &sample);
if (err) {
pr_err("Can't parse sample, err = %d\n", err);
goto out_munmap;
}
evsel = perf_evlist__id2evsel(evlist, sample.id); evsel = perf_evlist__id2evsel(evlist, sample.id);
if (evsel == NULL) { if (evsel == NULL) {
pr_debug("event with id %" PRIu64 pr_debug("event with id %" PRIu64
......
...@@ -805,9 +805,14 @@ static void perf_session__mmap_read_cpu(struct perf_session *self, int cpu) ...@@ -805,9 +805,14 @@ static void perf_session__mmap_read_cpu(struct perf_session *self, int cpu)
{ {
struct perf_sample sample; struct perf_sample sample;
union perf_event *event; union perf_event *event;
int ret;
while ((event = perf_evlist__read_on_cpu(top.evlist, cpu)) != NULL) { while ((event = perf_evlist__read_on_cpu(top.evlist, cpu)) != NULL) {
perf_session__parse_sample(self, event, &sample); ret = perf_session__parse_sample(self, event, &sample);
if (ret) {
pr_err("Can't parse sample, err = %d\n", ret);
continue;
}
if (event->header.type == PERF_RECORD_SAMPLE) if (event->header.type == PERF_RECORD_SAMPLE)
perf_event__process_sample(event, &sample, self); perf_event__process_sample(event, &sample, self);
......
...@@ -675,6 +675,7 @@ static PyObject *pyrf_evlist__read_on_cpu(struct pyrf_evlist *pevlist, ...@@ -675,6 +675,7 @@ static PyObject *pyrf_evlist__read_on_cpu(struct pyrf_evlist *pevlist,
union perf_event *event; union perf_event *event;
int sample_id_all = 1, cpu; int sample_id_all = 1, cpu;
static char *kwlist[] = {"sample_id_all", NULL, NULL}; static char *kwlist[] = {"sample_id_all", NULL, NULL};
int err;
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i", kwlist, if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i", kwlist,
&cpu, &sample_id_all)) &cpu, &sample_id_all))
...@@ -690,12 +691,17 @@ static PyObject *pyrf_evlist__read_on_cpu(struct pyrf_evlist *pevlist, ...@@ -690,12 +691,17 @@ static PyObject *pyrf_evlist__read_on_cpu(struct pyrf_evlist *pevlist,
return PyErr_NoMemory(); return PyErr_NoMemory();
first = list_entry(evlist->entries.next, struct perf_evsel, node); first = list_entry(evlist->entries.next, struct perf_evsel, node);
perf_event__parse_sample(event, first->attr.sample_type, err = perf_event__parse_sample(event, first->attr.sample_type,
perf_sample_size(first->attr.sample_type), perf_sample_size(first->attr.sample_type),
sample_id_all, &pevent->sample); sample_id_all, &pevent->sample);
if (err) {
pr_err("Can't parse sample, err = %d\n", err);
goto end;
}
return pyevent; return pyevent;
} }
end:
Py_INCREF(Py_None); Py_INCREF(Py_None);
return Py_None; return Py_None;
} }
......
...@@ -480,6 +480,7 @@ static void flush_sample_queue(struct perf_session *s, ...@@ -480,6 +480,7 @@ static void flush_sample_queue(struct perf_session *s,
struct perf_sample sample; struct perf_sample sample;
u64 limit = os->next_flush; u64 limit = os->next_flush;
u64 last_ts = os->last_sample ? os->last_sample->timestamp : 0ULL; u64 last_ts = os->last_sample ? os->last_sample->timestamp : 0ULL;
int ret;
if (!ops->ordered_samples || !limit) if (!ops->ordered_samples || !limit)
return; return;
...@@ -488,9 +489,12 @@ static void flush_sample_queue(struct perf_session *s, ...@@ -488,9 +489,12 @@ static void flush_sample_queue(struct perf_session *s,
if (iter->timestamp > limit) if (iter->timestamp > limit)
break; break;
perf_session__parse_sample(s, iter->event, &sample); ret = perf_session__parse_sample(s, iter->event, &sample);
perf_session_deliver_event(s, iter->event, &sample, ops, if (ret)
iter->file_offset); pr_err("Can't parse sample, err = %d\n", ret);
else
perf_session_deliver_event(s, iter->event, &sample, ops,
iter->file_offset);
os->last_flush = iter->timestamp; os->last_flush = iter->timestamp;
list_del(&iter->list); list_del(&iter->list);
...@@ -806,7 +810,9 @@ static int perf_session__process_event(struct perf_session *session, ...@@ -806,7 +810,9 @@ static int perf_session__process_event(struct perf_session *session,
/* /*
* For all kernel events we get the sample data * For all kernel events we get the sample data
*/ */
perf_session__parse_sample(session, event, &sample); ret = perf_session__parse_sample(session, event, &sample);
if (ret)
return ret;
/* Preprocess sample records - precheck callchains */ /* Preprocess sample records - precheck callchains */
if (perf_session__preprocess_sample(session, event, &sample)) if (perf_session__preprocess_sample(session, event, &sample))
......
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