[linux-yocto] [PATCH 27/48] tools/perf: Changes for Axxia CoreSight Support
Daniel Dragomir
daniel.dragomir at windriver.com
Mon Dec 11 05:13:57 PST 2017
From: John Jacques <john.jacques at intel.com>
Signed-off-by: John Jacques <john.jacques at intel.com>
---
tools/build/Makefile | 4 ++--
tools/build/Makefile.include | 3 +++
tools/perf/Makefile.config | 2 +-
tools/perf/Makefile.perf | 4 ++--
tools/perf/util/auxtrace.c | 4 ++--
tools/perf/util/cs-etm.c | 11 +++--------
tools/perf/util/probe-event.c | 45 +++++++++++++++---------------------------
tools/perf/util/probe-finder.c | 15 +++++++-------
tools/perf/util/probe-finder.h | 3 ---
9 files changed, 37 insertions(+), 54 deletions(-)
diff --git a/tools/build/Makefile b/tools/build/Makefile
index 8332959..edbb358 100644
--- a/tools/build/Makefile
+++ b/tools/build/Makefile
@@ -35,8 +35,8 @@ all: $(OUTPUT)fixdep
clean:
$(call QUIET_CLEAN, fixdep)
- $(Q)find . -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete
- $(Q)rm -f fixdep
+ $(Q)find $(if $(OUTPUT),$(OUTPUT),.) -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete
+ $(Q)rm -f $(OUTPUT)fixdep
$(OUTPUT)fixdep-in.o: FORCE
$(Q)$(MAKE) $(build)=fixdep
diff --git a/tools/build/Makefile.include b/tools/build/Makefile.include
index ad22e4e..d360f39a4 100644
--- a/tools/build/Makefile.include
+++ b/tools/build/Makefile.include
@@ -3,4 +3,7 @@ build := -f $(srctree)/tools/build/Makefile.build dir=. obj
fixdep:
$(Q)$(MAKE) -C $(srctree)/tools/build CFLAGS= LDFLAGS= $(OUTPUT)fixdep
+fixdep-clean:
+ $(Q)$(MAKE) -C $(srctree)/tools/build clean
+
.PHONY: fixdep
diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
index fe465b5..4a82626 100644
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -535,7 +535,7 @@ strip-libs = $(filter-out -l%,$(1))
ifdef CSTRACE_PATH
ifeq (${IS_64_BIT}, 1)
- CSTRACE_LNX = linux64
+ CSTRACE_LNX = linux-arm64
else
CSTRACE_LNX = linux
endif
diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
index 2b8678a..f3f9f14 100644
--- a/tools/perf/Makefile.perf
+++ b/tools/perf/Makefile.perf
@@ -753,13 +753,13 @@ config-clean:
$(call QUIET_CLEAN, config)
$(Q)$(MAKE) -C $(srctree)/tools/build/feature/ $(if $(OUTPUT),OUTPUT=$(OUTPUT)feature/,) clean >/dev/null
-clean:: $(LIBTRACEEVENT)-clean $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clean config-clean
+clean:: $(LIBTRACEEVENT)-clean $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clean config-clean fixdep-clean
$(call QUIET_CLEAN, core-objs) $(RM) $(LIB_FILE) $(OUTPUT)perf-archive $(OUTPUT)perf-with-kcore $(LANG_BINDINGS)
$(Q)find $(if $(OUTPUT),$(OUTPUT),.) -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete
$(Q)$(RM) $(OUTPUT).config-detected
$(call QUIET_CLEAN, core-progs) $(RM) $(ALL_PROGRAMS) perf perf-read-vdso32 perf-read-vdsox32 $(OUTPUT)pmu-events/jevents
$(call QUIET_CLEAN, core-gen) $(RM) *.spec *.pyc *.pyo */*.pyc */*.pyo $(OUTPUT)common-cmds.h TAGS tags cscope* $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)FEATURE-DUMP $(OUTPUT)util/*-bison* $(OUTPUT)util/*-flex* \
- $(OUTPUT)util/intel-pt-decoder/inat-tables.c $(OUTPUT)fixdep \
+ $(OUTPUT)util/intel-pt-decoder/inat-tables.c \
$(OUTPUT)tests/llvm-src-{base,kbuild,prologue,relocation}.c \
$(OUTPUT)pmu-events/pmu-events.c
$(QUIET_SUBDIR0)Documentation $(QUIET_SUBDIR1) clean
diff --git a/tools/perf/util/auxtrace.c b/tools/perf/util/auxtrace.c
index 9113c55..4dbd500 100644
--- a/tools/perf/util/auxtrace.c
+++ b/tools/perf/util/auxtrace.c
@@ -1828,7 +1828,7 @@ static int addr_filter__resolve_kernel_syms(struct addr_filter *filt)
filt->addr = start;
if (filt->range && !filt->size && !filt->sym_to) {
filt->size = size;
- no_size = !size;
+ no_size = !!size;
}
}
@@ -1842,7 +1842,7 @@ static int addr_filter__resolve_kernel_syms(struct addr_filter *filt)
if (err)
return err;
filt->size = start + size - filt->addr;
- no_size = !size;
+ no_size = !!size;
}
/* The very last symbol in kallsyms does not imply a particular size */
diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c
index 5fcd155..d48b9a4 100644
--- a/tools/perf/util/cs-etm.c
+++ b/tools/perf/util/cs-etm.c
@@ -446,8 +446,9 @@ static int cs_etm__setup_queue(struct cs_etm_auxtrace *etm,
if (etm->sampling_mode)
if (etm->timeless_decoding)
etmq->step_through_buffers = true;
- if (etm->timeless_decoding || !etm->have_sched_switch)
- etmq->use_buffer_pid_tid = true;
+
+ if (etm->timeless_decoding || !etm->have_sched_switch)
+ etmq->use_buffer_pid_tid = true;
}
if (!etmq->on_heap &&
@@ -1259,12 +1260,6 @@ static int cs_etm__process_auxtrace_event(struct perf_session *session,
}
-static const char * const cs_etm_global_header_fmts[] = {
- [CS_HEADER_VERSION_0] = " Header version %"PRIx64"\n",
- [CS_PMU_TYPE_CPUS] = " PMU type/num cpus %"PRIx64"\n",
- [CS_ETM_SNAPSHOT] = " Snapshot %"PRIx64"\n",
-};
-
static const char * const cs_etm_priv_fmts[] = {
[CS_ETM_MAGIC] = " Magic number %"PRIx64"\n",
[CS_ETM_CPU] = " CPU %"PRIx64"\n",
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 6a6f44d..aa8a922 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -698,31 +698,18 @@ static int add_exec_to_probe_trace_events(struct probe_trace_event *tevs,
return ret;
}
-static int
-post_process_module_probe_trace_events(struct probe_trace_event *tevs,
- int ntevs, const char *module,
- struct debuginfo *dinfo)
+static int add_module_to_probe_trace_events(struct probe_trace_event *tevs,
+ int ntevs, const char *module)
{
- Dwarf_Addr text_offs = 0;
int i, ret = 0;
char *mod_name = NULL;
- struct map *map;
if (!module)
return 0;
- map = get_target_map(module, false);
- if (!map || debuginfo__get_text_offset(dinfo, &text_offs, true) < 0) {
- pr_warning("Failed to get ELF symbols for %s\n", module);
- return -EINVAL;
- }
-
mod_name = find_module_name(module);
+
for (i = 0; i < ntevs; i++) {
- ret = post_process_probe_trace_point(&tevs[i].point,
- map, (unsigned long)text_offs);
- if (ret < 0)
- break;
tevs[i].point.module =
strdup(mod_name ? mod_name : module);
if (!tevs[i].point.module) {
@@ -732,8 +719,6 @@ post_process_module_probe_trace_events(struct probe_trace_event *tevs,
}
free(mod_name);
- map__put(map);
-
return ret;
}
@@ -791,7 +776,7 @@ arch__post_process_probe_trace_events(struct perf_probe_event *pev __maybe_unuse
static int post_process_probe_trace_events(struct perf_probe_event *pev,
struct probe_trace_event *tevs,
int ntevs, const char *module,
- bool uprobe, struct debuginfo *dinfo)
+ bool uprobe)
{
int ret;
@@ -799,8 +784,7 @@ static int post_process_probe_trace_events(struct perf_probe_event *pev,
ret = add_exec_to_probe_trace_events(tevs, ntevs, module);
else if (module)
/* Currently ref_reloc_sym based probe is not for drivers */
- ret = post_process_module_probe_trace_events(tevs, ntevs,
- module, dinfo);
+ ret = add_module_to_probe_trace_events(tevs, ntevs, module);
else
ret = post_process_kernel_probe_trace_events(tevs, ntevs);
@@ -844,27 +828,30 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
}
}
+ debuginfo__delete(dinfo);
+
if (ntevs > 0) { /* Succeeded to find trace events */
pr_debug("Found %d probe_trace_events.\n", ntevs);
ret = post_process_probe_trace_events(pev, *tevs, ntevs,
- pev->target, pev->uprobes, dinfo);
+ pev->target, pev->uprobes);
if (ret < 0 || ret == ntevs) {
- pr_debug("Post processing failed or all events are skipped. (%d)\n", ret);
clear_probe_trace_events(*tevs, ntevs);
zfree(tevs);
- ntevs = 0;
}
+ if (ret != ntevs)
+ return ret < 0 ? ret : ntevs;
+ ntevs = 0;
+ /* Fall through */
}
- debuginfo__delete(dinfo);
-
if (ntevs == 0) { /* No error but failed to find probe point. */
pr_warning("Probe point '%s' not found.\n",
synthesize_perf_probe_point(&pev->point));
return -ENOENT;
- } else if (ntevs < 0) {
- /* Error path : ntevs < 0 */
- pr_debug("An error occurred in debuginfo analysis (%d).\n", ntevs);
+ }
+ /* Error path : ntevs < 0 */
+ pr_debug("An error occurred in debuginfo analysis (%d).\n", ntevs);
+ if (ntevs < 0) {
if (ntevs == -EBADF)
pr_warning("Warning: No dwarf info found in the vmlinux - "
"please rebuild kernel with CONFIG_DEBUG_INFO=y.\n");
diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index 0d9d6e0..df4debe 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -1501,8 +1501,7 @@ int debuginfo__find_available_vars_at(struct debuginfo *dbg,
}
/* For the kernel module, we need a special code to get a DIE */
-int debuginfo__get_text_offset(struct debuginfo *dbg, Dwarf_Addr *offs,
- bool adjust_offset)
+static int debuginfo__get_text_offset(struct debuginfo *dbg, Dwarf_Addr *offs)
{
int n, i;
Elf32_Word shndx;
@@ -1531,8 +1530,6 @@ 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;
@@ -1546,12 +1543,16 @@ 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;
- /* We always need to relocate the address for aranges */
- if (debuginfo__get_text_offset(dbg, &baseaddr, false) == 0)
- addr += baseaddr;
+retry:
/* 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;
diff --git a/tools/perf/util/probe-finder.h b/tools/perf/util/probe-finder.h
index 2956c51..f1d8558 100644
--- a/tools/perf/util/probe-finder.h
+++ b/tools/perf/util/probe-finder.h
@@ -46,9 +46,6 @@ 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);
--
2.7.4
More information about the linux-yocto
mailing list