Commit ed9eb845 authored by Ingo Molnar's avatar Ingo Molnar

Merge tag 'perf-urgent-for-mingo' of...

Merge tag 'perf-urgent-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent

Pull perf/urgent fixes from Arnaldo Carvalho de Melo:

"
  - 'perf probe' should fall back to find probe point in symbols when failing
    to do so in a debuginfo file (Masami Hiramatsu)

  - Fix 'perf probe' crash in dwarf_getcfi_elf (Namhyung Kim)

  - Fix shell completion with 'perf list' --raw-dump option (Taesoo Kim)

  - Fix 'perf diff' to sort by baseline field by default (Namhyung Kim)
"
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parents 5b5e7621 e7024fc3
...@@ -545,6 +545,42 @@ hist_entry__cmp_compute(struct hist_entry *left, struct hist_entry *right, ...@@ -545,6 +545,42 @@ hist_entry__cmp_compute(struct hist_entry *left, struct hist_entry *right,
return __hist_entry__cmp_compute(p_left, p_right, c); return __hist_entry__cmp_compute(p_left, p_right, c);
} }
static int64_t
hist_entry__cmp_nop(struct hist_entry *left __maybe_unused,
struct hist_entry *right __maybe_unused)
{
return 0;
}
static int64_t
hist_entry__cmp_baseline(struct hist_entry *left, struct hist_entry *right)
{
if (sort_compute)
return 0;
if (left->stat.period == right->stat.period)
return 0;
return left->stat.period > right->stat.period ? 1 : -1;
}
static int64_t
hist_entry__cmp_delta(struct hist_entry *left, struct hist_entry *right)
{
return hist_entry__cmp_compute(right, left, COMPUTE_DELTA);
}
static int64_t
hist_entry__cmp_ratio(struct hist_entry *left, struct hist_entry *right)
{
return hist_entry__cmp_compute(right, left, COMPUTE_RATIO);
}
static int64_t
hist_entry__cmp_wdiff(struct hist_entry *left, struct hist_entry *right)
{
return hist_entry__cmp_compute(right, left, COMPUTE_WEIGHTED_DIFF);
}
static void insert_hist_entry_by_compute(struct rb_root *root, static void insert_hist_entry_by_compute(struct rb_root *root,
struct hist_entry *he, struct hist_entry *he,
int c) int c)
...@@ -1038,27 +1074,35 @@ static void data__hpp_register(struct data__file *d, int idx) ...@@ -1038,27 +1074,35 @@ static void data__hpp_register(struct data__file *d, int idx)
fmt->header = hpp__header; fmt->header = hpp__header;
fmt->width = hpp__width; fmt->width = hpp__width;
fmt->entry = hpp__entry_global; fmt->entry = hpp__entry_global;
fmt->cmp = hist_entry__cmp_nop;
fmt->collapse = hist_entry__cmp_nop;
/* TODO more colors */ /* TODO more colors */
switch (idx) { switch (idx) {
case PERF_HPP_DIFF__BASELINE: case PERF_HPP_DIFF__BASELINE:
fmt->color = hpp__color_baseline; fmt->color = hpp__color_baseline;
fmt->sort = hist_entry__cmp_baseline;
break; break;
case PERF_HPP_DIFF__DELTA: case PERF_HPP_DIFF__DELTA:
fmt->color = hpp__color_delta; fmt->color = hpp__color_delta;
fmt->sort = hist_entry__cmp_delta;
break; break;
case PERF_HPP_DIFF__RATIO: case PERF_HPP_DIFF__RATIO:
fmt->color = hpp__color_ratio; fmt->color = hpp__color_ratio;
fmt->sort = hist_entry__cmp_ratio;
break; break;
case PERF_HPP_DIFF__WEIGHTED_DIFF: case PERF_HPP_DIFF__WEIGHTED_DIFF:
fmt->color = hpp__color_wdiff; fmt->color = hpp__color_wdiff;
fmt->sort = hist_entry__cmp_wdiff;
break; break;
default: default:
fmt->sort = hist_entry__cmp_nop;
break; break;
} }
init_header(d, dfmt); init_header(d, dfmt);
perf_hpp__column_register(fmt); perf_hpp__column_register(fmt);
perf_hpp__register_sort_field(fmt);
} }
static void ui_init(void) static void ui_init(void)
......
...@@ -19,7 +19,9 @@ ...@@ -19,7 +19,9 @@
int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused) int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused)
{ {
int i; int i;
const struct option list_options[] = { bool raw_dump = false;
struct option list_options[] = {
OPT_BOOLEAN(0, "raw-dump", &raw_dump, "Dump raw events"),
OPT_END() OPT_END()
}; };
const char * const list_usage[] = { const char * const list_usage[] = {
...@@ -27,11 +29,18 @@ int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused) ...@@ -27,11 +29,18 @@ int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused)
NULL NULL
}; };
set_option_flag(list_options, 0, "raw-dump", PARSE_OPT_HIDDEN);
argc = parse_options(argc, argv, list_options, list_usage, argc = parse_options(argc, argv, list_options, list_usage,
PARSE_OPT_STOP_AT_NON_OPTION); PARSE_OPT_STOP_AT_NON_OPTION);
setup_pager(); setup_pager();
if (raw_dump) {
print_events(NULL, true);
return 0;
}
if (argc == 0) { if (argc == 0) {
print_events(NULL, false); print_events(NULL, false);
return 0; return 0;
...@@ -53,8 +62,6 @@ int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused) ...@@ -53,8 +62,6 @@ int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused)
print_hwcache_events(NULL, false); print_hwcache_events(NULL, false);
else if (strcmp(argv[i], "pmu") == 0) else if (strcmp(argv[i], "pmu") == 0)
print_pmu_events(NULL, false); print_pmu_events(NULL, false);
else if (strcmp(argv[i], "--raw-dump") == 0)
print_events(NULL, true);
else { else {
char *sep = strchr(argv[i], ':'), *s; char *sep = strchr(argv[i], ':'), *s;
int sep_idx; int sep_idx;
......
...@@ -495,9 +495,11 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev, ...@@ -495,9 +495,11 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
} }
if (ntevs == 0) { /* No error but failed to find probe point. */ if (ntevs == 0) { /* No error but failed to find probe point. */
pr_warning("Probe point '%s' not found.\n", pr_warning("Probe point '%s' not found in debuginfo.\n",
synthesize_perf_probe_point(&pev->point)); synthesize_perf_probe_point(&pev->point));
if (need_dwarf)
return -ENOENT; return -ENOENT;
return 0;
} }
/* Error path : ntevs < 0 */ /* Error path : ntevs < 0 */
pr_debug("An error occurred in debuginfo analysis (%d).\n", ntevs); pr_debug("An error occurred in debuginfo analysis (%d).\n", ntevs);
......
...@@ -989,8 +989,24 @@ static int debuginfo__find_probes(struct debuginfo *dbg, ...@@ -989,8 +989,24 @@ static int debuginfo__find_probes(struct debuginfo *dbg,
int ret = 0; int ret = 0;
#if _ELFUTILS_PREREQ(0, 142) #if _ELFUTILS_PREREQ(0, 142)
Elf *elf;
GElf_Ehdr ehdr;
GElf_Shdr shdr;
/* Get the call frame information from this dwarf */ /* Get the call frame information from this dwarf */
pf->cfi = dwarf_getcfi_elf(dwarf_getelf(dbg->dbg)); elf = dwarf_getelf(dbg->dbg);
if (elf == NULL)
return -EINVAL;
if (gelf_getehdr(elf, &ehdr) == NULL)
return -EINVAL;
if (elf_section_by_name(elf, &ehdr, &shdr, ".eh_frame", NULL) &&
shdr.sh_type == SHT_PROGBITS) {
pf->cfi = dwarf_getcfi_elf(elf);
} else {
pf->cfi = dwarf_getcfi(dbg->dbg);
}
#endif #endif
off = 0; off = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment