Commit 5538becaec9ca2ff21e7826372941dc46f498487

Authored by Frederic Weisbecker
1 parent 98e1da905c

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))