|
@@ -2126,6 +2126,17 @@ static int trace__event_handler(struct trace *trace, struct perf_evsel *evsel,
|
|
|
union perf_event *event __maybe_unused,
|
|
union perf_event *event __maybe_unused,
|
|
|
struct perf_sample *sample)
|
|
struct perf_sample *sample)
|
|
|
{
|
|
{
|
|
|
|
|
+ int callchain_ret = 0;
|
|
|
|
|
+
|
|
|
|
|
+ if (sample->callchain) {
|
|
|
|
|
+ callchain_ret = trace__resolve_callchain(trace, evsel, sample, &callchain_cursor);
|
|
|
|
|
+ if (callchain_ret == 0) {
|
|
|
|
|
+ if (callchain_cursor.nr < trace->min_stack)
|
|
|
|
|
+ goto out;
|
|
|
|
|
+ callchain_ret = 1;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
trace__printf_interrupted_entry(trace, sample);
|
|
trace__printf_interrupted_entry(trace, sample);
|
|
|
trace__fprintf_tstamp(trace, sample->time, trace->output);
|
|
trace__fprintf_tstamp(trace, sample->time, trace->output);
|
|
|
|
|
|
|
@@ -2144,11 +2155,11 @@ static int trace__event_handler(struct trace *trace, struct perf_evsel *evsel,
|
|
|
|
|
|
|
|
fprintf(trace->output, ")\n");
|
|
fprintf(trace->output, ")\n");
|
|
|
|
|
|
|
|
- if (sample->callchain) {
|
|
|
|
|
- if (trace__resolve_callchain(trace, evsel, sample, &callchain_cursor) == 0)
|
|
|
|
|
- trace__fprintf_callchain(trace, sample);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
|
|
+ if (callchain_ret > 0)
|
|
|
|
|
+ trace__fprintf_callchain(trace, sample);
|
|
|
|
|
+ else if (callchain_ret < 0)
|
|
|
|
|
+ pr_err("Problem processing %s callchain, skipping...\n", perf_evsel__name(evsel));
|
|
|
|
|
+out:
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|