Skip to content

Commit

Permalink
Merge tag 'perf-urgent-for-mingo' of git://git.kernel.org/pub/scm/lin…
Browse files Browse the repository at this point in the history
…ux/kernel/git/jolsa/perf into perf/urgent

Pull perf/urgent fixes from Jiri Olsa:

  * Fix kernel start address lookup in report code (Simon Que)

  * Fix segfault in cumulative.callchain report (Jiri Olsa)

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
  • Loading branch information
Ingo Molnar committed Jun 25, 2014
2 parents a497c3b + a93f0e5 commit 0bdb3cc
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 37 deletions.
21 changes: 16 additions & 5 deletions tools/perf/ui/browsers/hists.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include "../util.h"
#include "../ui.h"
#include "map.h"
#include "annotate.h"

struct hist_browser {
struct ui_browser b;
Expand Down Expand Up @@ -1593,13 +1594,18 @@ 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 &&
asprintf(&options[nr_options], "Annotate %s",
browser->selection->sym->name) > 0)
annotate = nr_options++;
!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 &&
Expand Down Expand Up @@ -1656,6 +1662,7 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,

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))
Expand All @@ -1679,6 +1686,10 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
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.
*/
Expand Down
54 changes: 22 additions & 32 deletions tools/perf/util/machine.c
Original file line number Diff line number Diff line change
Expand Up @@ -496,18 +496,6 @@ struct process_args {
u64 start;
};

static int symbol__in_kernel(void *arg, const char *name,
char type __maybe_unused, u64 start)
{
struct process_args *args = arg;

if (strchr(name, '['))
return 0;

args->start = start;
return 1;
}

static void machine__get_kallsyms_filename(struct machine *machine, char *buf,
size_t bufsz)
{
Expand All @@ -517,27 +505,41 @@ static void machine__get_kallsyms_filename(struct machine *machine, char *buf,
scnprintf(buf, bufsz, "%s/proc/kallsyms", machine->root_dir);
}

/* Figure out the start address of kernel map from /proc/kallsyms */
static u64 machine__get_kernel_start_addr(struct machine *machine)
const char *ref_reloc_sym_names[] = {"_text", "_stext", NULL};

/* Figure out the start address of kernel map from /proc/kallsyms.
* Returns the name of the start symbol in *symbol_name. Pass in NULL as
* symbol_name if it's not that important.
*/
static u64 machine__get_kernel_start_addr(struct machine *machine,
const char **symbol_name)
{
char filename[PATH_MAX];
struct process_args args;
int i;
const char *name;
u64 addr = 0;

machine__get_kallsyms_filename(machine, filename, PATH_MAX);

if (symbol__restricted_filename(filename, "/proc/kallsyms"))
return 0;

if (kallsyms__parse(filename, &args, symbol__in_kernel) <= 0)
return 0;
for (i = 0; (name = ref_reloc_sym_names[i]) != NULL; i++) {
addr = kallsyms__get_function_start(filename, name);
if (addr)
break;
}

if (symbol_name)
*symbol_name = name;

return args.start;
return addr;
}

int __machine__create_kernel_maps(struct machine *machine, struct dso *kernel)
{
enum map_type type;
u64 start = machine__get_kernel_start_addr(machine);
u64 start = machine__get_kernel_start_addr(machine, NULL);

for (type = 0; type < MAP__NR_TYPES; ++type) {
struct kmap *kmap;
Expand Down Expand Up @@ -852,23 +854,11 @@ static int machine__create_modules(struct machine *machine)
return 0;
}

const char *ref_reloc_sym_names[] = {"_text", "_stext", NULL};

int machine__create_kernel_maps(struct machine *machine)
{
struct dso *kernel = machine__get_kernel(machine);
char filename[PATH_MAX];
const char *name;
u64 addr = 0;
int i;

machine__get_kallsyms_filename(machine, filename, PATH_MAX);

for (i = 0; (name = ref_reloc_sym_names[i]) != NULL; i++) {
addr = kallsyms__get_function_start(filename, name);
if (addr)
break;
}
u64 addr = machine__get_kernel_start_addr(machine, &name);
if (!addr)
return -1;

Expand Down

0 comments on commit 0bdb3cc

Please sign in to comment.