mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-19 10:44:14 +08:00
perf/core improvements and fixes:
User visible: - Use the alternative with the most descriptive filename containing a vmlinux file for a given build-id, providing a better title line for tools such as 'annotate' (Arnaldo Carvalho de Melo) - Remove help messages about previous right and left arrow keybidings, that were repurposed for horizontal scrolling (Arnaldo Carvalho de Melo) - Inform how to reset the symbol filter in the hists browser (top & report) (Arnaldo Carvalho de Melo) - Add 'm' key for context menu display in the hists browser, that became inacessible with the repurposing of the right arrow key for horizontal scrolling (Namhyung Kim) - Use debug_frame for callchains if eh_frame is unusable (Rabin Vicent) Build fixes: - Fix strict-aliasing breakage with gcc 4.4 in the READ_ONCE/WRITE_ONCE code adopted from the kernel tree, that builds with -fno-strict-aliasing while tools/perf/ uses -Wstrict-aliasing=3 (Jiri Olsa) - Fix unw_word_t pointer casts in code using libunwind for callchains, fixing the build in at least 32-bit MIPS systems (Rabin Vicent) - Workaround cross compile build problems related to fixdep (Jiri Olsa) Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJWHVxVAAoJENZQFvNTUqpA3joP+wTSN+x8rvHrGTvUsUsJ6D4W uvw4OdM+ZU2A781xCFmuYktbXEGFOsUcKlV1cUPZRuT/crrhxa/KgxVNBMgfJHE5 cfpuElM0CxBqf0oD9CGaVRP59JdcjfGybuL8S2I6Gon8eeSRm+DhdlIsLrx6JGYC lnaG6/77JK/tGEaA9bBen4LB55SuXTt3KZCC5fG/EgUfGzXvHwSNFsFIqO1CoqV2 RoZIBiTGCPBSMxHS9WX+Ghi7TiG9V8l1QdvGvXrPp2m1XfP3MPcus+CMyCxrFM83 qwDhel/sE6ZpH1Oc/01Qf4zrRdEvsm4ye/xCMxGLpxDmjlBsBPp6U8Pn0EpXbJ+U c+/L90XyloHj2AoOzQPkXnYLCekPLbpJ46aR92wbZC3yQrZ9Db6KVewd0Q5yiULR E4s69AQBXijzBuK8Kl/d+3Ytvvmn8iaJA/zsgL46JuQEn9Jndu6zgRj0CG/W3XI6 jlHtkk+SSDstRJX2DXnoJOb4kB3K11aOVecF2rpX0rZLTgGKh5Caa/ZXubIA5LGY ze2PkAqf0zqP9XU4/p/ZYDhCu/HMu9iyFyAQXmoC8vjFpIiGXMjmBVbdAGyx/hJU RN04TE0x9D5JlpgPIRien8ZylLyByK9/IJm/J395rn72EY8o0NDGi3Synh+akDpm sOvfHfhvLcSJQxfzOnhy =dLXA -----END PGP SIGNATURE----- Merge tag 'perf-core-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core Pull perf/core improvements and fixes from Arnaldo Carvalho de Melo: User visible changes: - Use the alternative with the most descriptive filename containing a vmlinux file for a given build-id, providing a better title line for tools such as 'annotate'. (Arnaldo Carvalho de Melo) - Remove help messages about previous right and left arrow keybidings, that were repurposed for horizontal scrolling. (Arnaldo Carvalho de Melo) - Inform how to reset the symbol filter in the hists browser. (top & report) (Arnaldo Carvalho de Melo) - Add 'm' key for context menu display in the hists browser, that became inacessible with the repurposing of the right arrow key for horizontal scrolling. (Namhyung Kim) - Use debug_frame for callchains if eh_frame is unusable. (Rabin Vicent) Build fixes: - Fix strict-aliasing breakage with gcc 4.4 in the READ_ONCE/WRITE_ONCE code adopted from the kernel tree, that builds with -fno-strict-aliasing while tools/perf/ uses -Wstrict-aliasing=3. (Jiri Olsa) - Fix unw_word_t pointer casts in code using libunwind for callchains, fixing the build in at least 32-bit MIPS systems. (Rabin Vicent) - Work around cross compile build problems related to fixdep. (Jiri Olsa) Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
commit
e9363deeb2
@ -1,6 +1,10 @@
|
||||
build := -f $(srctree)/tools/build/Makefile.build dir=. obj
|
||||
|
||||
ifdef CROSS_COMPILE
|
||||
fixdep:
|
||||
else
|
||||
fixdep:
|
||||
$(Q)$(MAKE) -C $(srctree)/tools/build fixdep
|
||||
endif
|
||||
|
||||
.PHONY: fixdep
|
||||
|
@ -43,13 +43,29 @@
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
/*
|
||||
* Following functions are taken from kernel sources and
|
||||
* break aliasing rules in their original form.
|
||||
*
|
||||
* While kernel is compiled with -fno-strict-aliasing,
|
||||
* perf uses -Wstrict-aliasing=3 which makes build fail
|
||||
* under gcc 4.4.
|
||||
*
|
||||
* Using extra __may_alias__ type to allow aliasing
|
||||
* in this case.
|
||||
*/
|
||||
typedef __u8 __attribute__((__may_alias__)) __u8_alias_t;
|
||||
typedef __u16 __attribute__((__may_alias__)) __u16_alias_t;
|
||||
typedef __u32 __attribute__((__may_alias__)) __u32_alias_t;
|
||||
typedef __u64 __attribute__((__may_alias__)) __u64_alias_t;
|
||||
|
||||
static __always_inline void __read_once_size(const volatile void *p, void *res, int size)
|
||||
{
|
||||
switch (size) {
|
||||
case 1: *(__u8 *)res = *(volatile __u8 *)p; break;
|
||||
case 2: *(__u16 *)res = *(volatile __u16 *)p; break;
|
||||
case 4: *(__u32 *)res = *(volatile __u32 *)p; break;
|
||||
case 8: *(__u64 *)res = *(volatile __u64 *)p; break;
|
||||
case 1: *(__u8_alias_t *) res = *(volatile __u8_alias_t *) p; break;
|
||||
case 2: *(__u16_alias_t *) res = *(volatile __u16_alias_t *) p; break;
|
||||
case 4: *(__u32_alias_t *) res = *(volatile __u32_alias_t *) p; break;
|
||||
case 8: *(__u64_alias_t *) res = *(volatile __u64_alias_t *) p; break;
|
||||
default:
|
||||
barrier();
|
||||
__builtin_memcpy((void *)res, (const void *)p, size);
|
||||
@ -60,10 +76,10 @@ static __always_inline void __read_once_size(const volatile void *p, void *res,
|
||||
static __always_inline void __write_once_size(volatile void *p, void *res, int size)
|
||||
{
|
||||
switch (size) {
|
||||
case 1: *(volatile __u8 *)p = *(__u8 *)res; break;
|
||||
case 2: *(volatile __u16 *)p = *(__u16 *)res; break;
|
||||
case 4: *(volatile __u32 *)p = *(__u32 *)res; break;
|
||||
case 8: *(volatile __u64 *)p = *(__u64 *)res; break;
|
||||
case 1: *(volatile __u8_alias_t *) p = *(__u8_alias_t *) res; break;
|
||||
case 2: *(volatile __u16_alias_t *) p = *(__u16_alias_t *) res; break;
|
||||
case 4: *(volatile __u32_alias_t *) p = *(__u32_alias_t *) res; break;
|
||||
case 8: *(volatile __u64_alias_t *) p = *(__u64_alias_t *) res; break;
|
||||
default:
|
||||
barrier();
|
||||
__builtin_memcpy((void *)p, (const void *)res, size);
|
||||
|
@ -768,8 +768,8 @@ static int annotate_browser__run(struct annotate_browser *browser,
|
||||
"UP/DOWN/PGUP\n"
|
||||
"PGDN/SPACE Navigate\n"
|
||||
"q/ESC/CTRL+C Exit\n\n"
|
||||
"-> Go to target\n"
|
||||
"<- Exit\n"
|
||||
"ENTER Go to target\n"
|
||||
"ESC Exit\n"
|
||||
"H Cycle thru hottest instructions\n"
|
||||
"j Toggle showing jump to target arrows\n"
|
||||
"J Toggle showing number of jump sources on targets\n"
|
||||
@ -1056,7 +1056,7 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map,
|
||||
goto out_free_offsets;
|
||||
}
|
||||
|
||||
ui_helpline__push("Press <- or ESC to exit");
|
||||
ui_helpline__push("Press ESC to exit");
|
||||
|
||||
notes = symbol__annotation(sym);
|
||||
browser.start = map__rip_2objdump(map, sym->start);
|
||||
|
@ -1496,7 +1496,7 @@ do_zoom_thread(struct hist_browser *browser, struct popup_action *act)
|
||||
thread__zput(browser->hists->thread_filter);
|
||||
ui_helpline__pop();
|
||||
} else {
|
||||
ui_helpline__fpush("To zoom out press <- or -> + \"Zoom out of %s(%d) thread\"",
|
||||
ui_helpline__fpush("To zoom out press ESC or ENTER + \"Zoom out of %s(%d) thread\"",
|
||||
thread->comm_set ? thread__comm_str(thread) : "",
|
||||
thread->tid);
|
||||
browser->hists->thread_filter = thread__get(thread);
|
||||
@ -1540,7 +1540,7 @@ do_zoom_dso(struct hist_browser *browser, struct popup_action *act)
|
||||
} else {
|
||||
if (map == NULL)
|
||||
return 0;
|
||||
ui_helpline__fpush("To zoom out press <- or -> + \"Zoom out of %s DSO\"",
|
||||
ui_helpline__fpush("To zoom out press ESC or ENTER + \"Zoom out of %s DSO\"",
|
||||
__map__is_kernel(map) ? "the Kernel" : map->dso->short_name);
|
||||
browser->hists->dso_filter = map->dso;
|
||||
perf_hpp__set_elide(HISTC_DSO, true);
|
||||
@ -1761,14 +1761,15 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
|
||||
"For multiple event sessions:\n\n" \
|
||||
"TAB/UNTAB Switch events\n\n" \
|
||||
"For symbolic views (--sort has sym):\n\n" \
|
||||
"-> Zoom into DSO/Threads & Annotate current symbol\n" \
|
||||
"<- Zoom out\n" \
|
||||
"ENTER Zoom into DSO/Threads & Annotate current symbol\n" \
|
||||
"ESC Zoom out\n" \
|
||||
"a Annotate current symbol\n" \
|
||||
"C Collapse all callchains\n" \
|
||||
"d Zoom into current DSO\n" \
|
||||
"E Expand all callchains\n" \
|
||||
"F Toggle percentage of filtered entries\n" \
|
||||
"H Display column headers\n" \
|
||||
"m Display context menu\n" \
|
||||
"S Zoom into current Processor Socket\n" \
|
||||
|
||||
/* help messages are sorted by lexical order of the hotkey */
|
||||
@ -1889,7 +1890,8 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
|
||||
continue;
|
||||
case '/':
|
||||
if (ui_browser__input_window("Symbol to show",
|
||||
"Please enter the name of symbol you want to see",
|
||||
"Please enter the name of symbol you want to see.\n"
|
||||
"To remove the filter later, press / + ENTER.",
|
||||
buf, "ENTER: OK, ESC: Cancel",
|
||||
delay_secs * 2) == K_ENTER) {
|
||||
hists->symbol_filter_str = *buf ? buf : NULL;
|
||||
@ -1934,6 +1936,7 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
|
||||
continue;
|
||||
case K_ENTER:
|
||||
case K_RIGHT:
|
||||
case 'm':
|
||||
/* menu */
|
||||
break;
|
||||
case K_ESC:
|
||||
|
@ -72,7 +72,7 @@ static int map_browser__run(struct map_browser *browser)
|
||||
int key;
|
||||
|
||||
if (ui_browser__show(&browser->b, browser->map->dso->long_name,
|
||||
"Press <- or ESC to exit, %s / to search",
|
||||
"Press ESC to exit, %s / to search",
|
||||
verbose ? "" : "restart with -v to use") < 0)
|
||||
return -1;
|
||||
|
||||
|
@ -89,7 +89,7 @@ static int script_browser__run(struct perf_script_browser *browser)
|
||||
int key;
|
||||
|
||||
if (ui_browser__show(&browser->b, browser->script_name,
|
||||
"Press <- or ESC to exit") < 0)
|
||||
"Press ESC to exit") < 0)
|
||||
return -1;
|
||||
|
||||
while (1) {
|
||||
|
@ -1607,6 +1607,15 @@ int dso__load_vmlinux_path(struct dso *dso, struct map *map,
|
||||
int i, err = 0;
|
||||
char *filename = NULL;
|
||||
|
||||
pr_debug("Looking at the vmlinux_path (%d entries long)\n",
|
||||
vmlinux_path__nr_entries + 1);
|
||||
|
||||
for (i = 0; i < vmlinux_path__nr_entries; ++i) {
|
||||
err = dso__load_vmlinux(dso, map, vmlinux_path[i], false, filter);
|
||||
if (err > 0)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!symbol_conf.ignore_vmlinux_buildid)
|
||||
filename = dso__build_id_filename(dso, NULL, 0);
|
||||
if (filename != NULL) {
|
||||
@ -1615,15 +1624,6 @@ int dso__load_vmlinux_path(struct dso *dso, struct map *map,
|
||||
goto out;
|
||||
free(filename);
|
||||
}
|
||||
|
||||
pr_debug("Looking at the vmlinux_path (%d entries long)\n",
|
||||
vmlinux_path__nr_entries + 1);
|
||||
|
||||
for (i = 0; i < vmlinux_path__nr_entries; ++i) {
|
||||
err = dso__load_vmlinux(dso, map, vmlinux_path[i], false, filter);
|
||||
if (err > 0)
|
||||
break;
|
||||
}
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
@ -330,6 +330,7 @@ find_proc_info(unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi,
|
||||
struct map *map;
|
||||
unw_dyn_info_t di;
|
||||
u64 table_data, segbase, fde_count;
|
||||
int ret = -EINVAL;
|
||||
|
||||
map = find_map(ip, ui);
|
||||
if (!map || !map->dso)
|
||||
@ -348,13 +349,14 @@ find_proc_info(unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi,
|
||||
di.u.rti.table_data = map->start + table_data;
|
||||
di.u.rti.table_len = fde_count * sizeof(struct table_entry)
|
||||
/ sizeof(unw_word_t);
|
||||
return dwarf_search_unwind_table(as, ip, &di, pi,
|
||||
need_unwind_info, arg);
|
||||
ret = dwarf_search_unwind_table(as, ip, &di, pi,
|
||||
need_unwind_info, arg);
|
||||
}
|
||||
|
||||
#ifndef NO_LIBUNWIND_DEBUG_FRAME
|
||||
/* Check the .debug_frame section for unwinding info */
|
||||
if (!read_unwind_spec_debug_frame(map->dso, ui->machine, &segbase)) {
|
||||
if (ret < 0 &&
|
||||
!read_unwind_spec_debug_frame(map->dso, ui->machine, &segbase)) {
|
||||
int fd = dso__data_get_fd(map->dso, ui->machine);
|
||||
int is_exec = elf_is_exec(fd, map->dso->name);
|
||||
unw_word_t base = is_exec ? 0 : map->start;
|
||||
@ -370,7 +372,7 @@ find_proc_info(unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi,
|
||||
}
|
||||
#endif
|
||||
|
||||
return -EINVAL;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int access_fpreg(unw_addr_space_t __maybe_unused as,
|
||||
@ -461,7 +463,7 @@ static int access_mem(unw_addr_space_t __maybe_unused as,
|
||||
if (ret) {
|
||||
pr_debug("unwind: access_mem %p not inside range"
|
||||
" 0x%" PRIx64 "-0x%" PRIx64 "\n",
|
||||
(void *) addr, start, end);
|
||||
(void *) (uintptr_t) addr, start, end);
|
||||
*valp = 0;
|
||||
return ret;
|
||||
}
|
||||
@ -471,7 +473,7 @@ static int access_mem(unw_addr_space_t __maybe_unused as,
|
||||
offset = addr - start;
|
||||
*valp = *(unw_word_t *)&stack->data[offset];
|
||||
pr_debug("unwind: access_mem addr %p val %lx, offset %d\n",
|
||||
(void *) addr, (unsigned long)*valp, offset);
|
||||
(void *) (uintptr_t) addr, (unsigned long)*valp, offset);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user