Commit 5538becaec9ca2ff21e7826372941dc46f498487
1 parent
98e1da905c
Exists in
master
and in
20 other branches
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: Frederic 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>
Showing 4 changed files with 33 additions and 11 deletions Side-by-side Diff
tools/perf/builtin-test.c
... | ... | @@ -559,8 +559,13 @@ |
559 | 559 | goto out_munmap; |
560 | 560 | } |
561 | 561 | |
562 | - perf_event__parse_sample(event, attr.sample_type, sample_size, | |
563 | - false, &sample); | |
562 | + err = perf_event__parse_sample(event, attr.sample_type, sample_size, | |
563 | + false, &sample); | |
564 | + if (err) { | |
565 | + pr_err("Can't parse sample, err = %d\n", err); | |
566 | + goto out_munmap; | |
567 | + } | |
568 | + | |
564 | 569 | evsel = perf_evlist__id2evsel(evlist, sample.id); |
565 | 570 | if (evsel == NULL) { |
566 | 571 | pr_debug("event with id %" PRIu64 |
tools/perf/builtin-top.c
... | ... | @@ -805,9 +805,14 @@ |
805 | 805 | { |
806 | 806 | struct perf_sample sample; |
807 | 807 | union perf_event *event; |
808 | + int ret; | |
808 | 809 | |
809 | 810 | while ((event = perf_evlist__read_on_cpu(top.evlist, cpu)) != NULL) { |
810 | - perf_session__parse_sample(self, event, &sample); | |
811 | + ret = perf_session__parse_sample(self, event, &sample); | |
812 | + if (ret) { | |
813 | + pr_err("Can't parse sample, err = %d\n", ret); | |
814 | + continue; | |
815 | + } | |
811 | 816 | |
812 | 817 | if (event->header.type == PERF_RECORD_SAMPLE) |
813 | 818 | perf_event__process_sample(event, &sample, self); |
tools/perf/util/python.c
... | ... | @@ -675,6 +675,7 @@ |
675 | 675 | union perf_event *event; |
676 | 676 | int sample_id_all = 1, cpu; |
677 | 677 | static char *kwlist[] = {"sample_id_all", NULL, NULL}; |
678 | + int err; | |
678 | 679 | |
679 | 680 | if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i", kwlist, |
680 | 681 | &cpu, &sample_id_all)) |
681 | 682 | |
... | ... | @@ -690,12 +691,17 @@ |
690 | 691 | return PyErr_NoMemory(); |
691 | 692 | |
692 | 693 | first = list_entry(evlist->entries.next, struct perf_evsel, node); |
693 | - perf_event__parse_sample(event, first->attr.sample_type, | |
694 | - perf_sample_size(first->attr.sample_type), | |
695 | - sample_id_all, &pevent->sample); | |
694 | + err = perf_event__parse_sample(event, first->attr.sample_type, | |
695 | + perf_sample_size(first->attr.sample_type), | |
696 | + sample_id_all, &pevent->sample); | |
697 | + if (err) { | |
698 | + pr_err("Can't parse sample, err = %d\n", err); | |
699 | + goto end; | |
700 | + } | |
701 | + | |
696 | 702 | return pyevent; |
697 | 703 | } |
698 | - | |
704 | +end: | |
699 | 705 | Py_INCREF(Py_None); |
700 | 706 | return Py_None; |
701 | 707 | } |
tools/perf/util/session.c
... | ... | @@ -480,6 +480,7 @@ |
480 | 480 | struct perf_sample sample; |
481 | 481 | u64 limit = os->next_flush; |
482 | 482 | u64 last_ts = os->last_sample ? os->last_sample->timestamp : 0ULL; |
483 | + int ret; | |
483 | 484 | |
484 | 485 | if (!ops->ordered_samples || !limit) |
485 | 486 | return; |
... | ... | @@ -488,9 +489,12 @@ |
488 | 489 | if (iter->timestamp > limit) |
489 | 490 | break; |
490 | 491 | |
491 | - perf_session__parse_sample(s, iter->event, &sample); | |
492 | - perf_session_deliver_event(s, iter->event, &sample, ops, | |
493 | - iter->file_offset); | |
492 | + ret = perf_session__parse_sample(s, iter->event, &sample); | |
493 | + if (ret) | |
494 | + pr_err("Can't parse sample, err = %d\n", ret); | |
495 | + else | |
496 | + perf_session_deliver_event(s, iter->event, &sample, ops, | |
497 | + iter->file_offset); | |
494 | 498 | |
495 | 499 | os->last_flush = iter->timestamp; |
496 | 500 | list_del(&iter->list); |
... | ... | @@ -806,7 +810,9 @@ |
806 | 810 | /* |
807 | 811 | * For all kernel events we get the sample data |
808 | 812 | */ |
809 | - perf_session__parse_sample(session, event, &sample); | |
813 | + ret = perf_session__parse_sample(session, event, &sample); | |
814 | + if (ret) | |
815 | + return ret; | |
810 | 816 | |
811 | 817 | /* Preprocess sample records - precheck callchains */ |
812 | 818 | if (perf_session__preprocess_sample(session, event, &sample)) |