perf fixes
Subsystems (2)
Linus,
Please pull the latest perf-urgent-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf-urgent-for-linus
# HEAD: 31f5260a7653e6042ac28578db1c61e84f2d7898 Merge tag 'perf-urgent-for-mingo-4.10-20170117' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent
An Intel PMU driver hotplug fix and three 'perf probe' tooling fixes.
Thanks,
Ingo
------------------>
Masami Hiramatsu (3):
perf probe: Fix to show correct locations for events on modules perf probe: Add error checks to offline probe post-processing perf probe: Fix to probe on gcc generated functions in modules
Zhou Chengming (1):
perf/x86/intel: Handle exclusive threadid correctly on CPU hotplug
arch/x86/events/intel/core.c | 7 +++- tools/perf/util/probe-event.c | 95 +++++++++++++++++++++++++++--------------- tools/perf/util/probe-finder.c | 15 ++++--- tools/perf/util/probe-finder.h | 3 ++ 4 files changed, 77 insertions(+), 43 deletions(-)
arch/x86/events/intel/core.c +5 -2
@@ -3176,13 +3176,16 @@ static void intel_pmu_cpu_starting(int cpu)if (x86_pmu.flags &PMU_FL_EXCL_CNTRS ) {for_each_cpu (i,topology_sibling_cpumask (cpu)) { +struct cpu_hw_events *sibling;struct intel_excl_cntrs *c; - c =per_cpu (cpu_hw_events, i).excl_cntrs; + sibling = &per_cpu (cpu_hw_events, i); + c = sibling->excl_cntrs;if (c && c->core_id == core_id) { cpuc->kfree_on_online[1 ] = cpuc->excl_cntrs; cpuc->excl_cntrs = c; - cpuc->excl_thread_id =1 ; +if (!sibling->excl_thread_id) + cpuc->excl_thread_id =1 ;break ; } }
tools/perf/util/probe-event.c +62 -33
170 lines not on this page · raw message
tools/perf/util/probe-finder.c +7 -8
@@ -1501,7 +1501,8 @@ int debuginfo__find_available_vars_at(struct debuginfo *dbg, }/* For the kernel module, we need a special code to get a DIE */ -static int debuginfo__get_text_offset (struct debuginfo *dbg,Dwarf_Addr *offs) +int debuginfo__get_text_offset (struct debuginfo *dbg,Dwarf_Addr *offs, +bool adjust_offset) {int n, i;Elf32_Word shndx;
@@ -1530,6 +1531,8 @@ static int debuginfo__get_text_offset(struct debuginfo *dbg, Dwarf_Addr *offs)if (!shdr)return -ENOENT ; *offs = shdr->sh_addr; +if (adjust_offset) + *offs -= shdr->sh_offset; } }return 0 ;
@@ -1543,16 +1546,12 @@ int debuginfo__find_probe_point(struct debuginfo *dbg, unsigned long addr,Dwarf_Addr _addr =0 , baseaddr =0 ;const char *fname =NULL , *func =NULL , *basefunc =NULL , *tmp;int baseline =0 , lineno =0 , ret =0 ; -bool reloc = false; -retry: +/* We always need to relocate the address for aranges */ +if (debuginfo__get_text_offset (dbg, &baseaddr, false) ==0 ) + addr += baseaddr;/* Find cu die */ if (!dwarf_addrdie (dbg->dbg, (Dwarf_Addr )addr, &cudie)) { -if (!reloc &&debuginfo__get_text_offset (dbg, &baseaddr) ==0 ) { - addr += baseaddr; - reloc = true; - goto retry; - }pr_warning ("Failed to find debug information for address %lx\n" , addr); ret = -EINVAL ;
tools/perf/util/probe-finder.h +3 -0
@@ -46,6 +46,9 @@ int debuginfo__find_trace_events(struct debuginfo *dbg,int debuginfo__find_probe_point (struct debuginfo *dbg,unsigned long addr,struct perf_probe_point *ppt); +int debuginfo__get_text_offset (struct debuginfo *dbg,Dwarf_Addr *offs, +bool adjust_offset); +/* Find a line range */ int debuginfo__find_line_range (struct debuginfo *dbg,struct line_range *lr);