Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d755330c authored by Jiri Olsa's avatar Jiri Olsa
Browse files

perf tools: Fix segfault in cumulative.callchain report



When cumulative callchain mode is on, we could get samples with
with no actual hits. This breaks the assumption of the annotation
code, that each sample has annotation counts allocated and leads
to segfault.

Fixing this by additional checks for annotation stats.

Acked-by: default avatarNamhyung Kim <namhyung@kernel.org>
Acked-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1402821332-12419-1-git-send-email-jolsa@kernel.org


Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
parent cf230918
Loading
Loading
Loading
Loading
+16 −5
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
#include "../util.h"
#include "../ui.h"
#include "map.h"
#include "annotate.h"

struct hist_browser {
	struct ui_browser   b;
@@ -1593,14 +1594,19 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
					 bi->to.sym->name) > 0)
				annotate_t = nr_options++;
		} else {

			if (browser->selection != NULL &&
			    browser->selection->sym != NULL &&
			    !browser->selection->map->dso->annotate_warned &&
			    !browser->selection->map->dso->annotate_warned) {
				struct annotation *notes;

				notes = symbol__annotation(browser->selection->sym);

				if (notes->src &&
				    asprintf(&options[nr_options], "Annotate %s",
						 browser->selection->sym->name) > 0)
					annotate = nr_options++;
			}
		}

		if (thread != NULL &&
		    asprintf(&options[nr_options], "Zoom %s %s(%d) thread",
@@ -1656,6 +1662,7 @@ retry_popup_menu:

		if (choice == annotate || choice == annotate_t || choice == annotate_f) {
			struct hist_entry *he;
			struct annotation *notes;
			int err;
do_annotate:
			if (!objdump_path && perf_session_env__lookup_objdump(env))
@@ -1679,6 +1686,10 @@ do_annotate:
				he->ms.map = he->branch_info->to.map;
			}

			notes = symbol__annotation(he->ms.sym);
			if (!notes->src)
				continue;

			/*
			 * Don't let this be freed, say, by hists__decay_entry.
			 */