perf/urgent fixes:
- '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: Arnaldo Carvalho de Melo <acme@redhat.com> -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJUp1VfAAoJEBpxZoYYoA71q8oIAJcsGVKioROAGgcaorZJlm4M XeC1THov9Rly96h73rKn7PNXs+YDouixNc6F63rxjKxePpLk3TWxcRdhjkXZtkzQ m4VJR2nZT8UC5OBBonuKB5dvDBrNnhvDYD3VR6cTThBuwKv7eZzLcNBdc2K/oa+y fmvv+Mk/6Kv3Ru0giOkSbiMLKaWUDP3stKl10cVIsVP7lIdbDm5IceXJChWnK1Uo ydEknREXyNm11dUQ2LR/PpO+R/mAq+/IfgYYbr1mJd67Zgc+iix2H/Y0yq+PtwuH Vsw5W+LFAzjQid7PhgNbsYXviMrZ5Vt74tskD9Ux3vCpcjvF/MoCrUJrcAe+Epw= =0JUz -----END PGP SIGNATURE----- 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: Arnaldo Carvalho de Melo <acme@redhat.com> Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
commit
ed9eb845d7
@ -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)
|
|||||||
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 @@
|
|||||||
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
|
|
||||||
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,
|
|||||||
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user