Skip to contentSkip to conversation

perf python: Remove dependency on 'machine' methods

tip:perf/core tip-bot for Arnaldo Carvalho de Melo 1 participant 1 message Jul 31, 2015 perf events

lore
Share & tools
lore
#0 lore raw
Commit-ID:  959c2199d4c0e330d17f1f5234527e87132d5e07
Gitweb:     http://git.kernel.org/tip/959c2199d4c0e330d17f1f5234527e87132d5e07
Author:     Arnaldo Carvalho de Melo <[email protected]>
AuthorDate: Fri, 24 Jul 2015 12:13:05 -0300
Committer:  Arnaldo Carvalho de Melo <[email protected]>
CommitDate: Wed, 29 Jul 2015 10:51:44 -0300

perf python: Remove dependency on 'machine' methods

The python binding still doesn't provide symbol resolving facilities, but the recent addition of the trace_event__register_resolver() function made it add as a dependency the machine__resolve_kernel_addr() method, that in turn drags all the symbol resolving code.

The problem:

[root@zoo ~]# perf test -v python
17: Try 'import perf' in python, checking link problems :
--- start ---
test child forked, pid 6853
Traceback (most recent call last):

    File "<stdin>", line 1, in <module>

ImportError: /tmp/build/perf/python/perf.so: undefined symbol: machine__resolve_kernel_addr test child finished with -1
---- end ----
Try 'import perf' in python, checking link problems: FAILED!
[root@zoo ~]#

Fix it by requiring this function to receive the resolver as a parameter, just like pevent_register_function_resolver(), i.e. do not explicitely refer to an object file not included in tools/perf/util/python-ext-sources.

[root@zoo ~]# perf test python
17: Try 'import perf' in python, checking link problems : Ok
[root@zoo ~]#

Cc Adrian Hunter <[email protected]>
Cc Borislav Petkov <[email protected]>
Cc David Ahern <[email protected]>
Cc Frederic Weisbecker <[email protected]>
Cc Jiri Olsa <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Stephane Eranian <[email protected]>
Fixes c3168b0db93a ("perf symbols: Provide libtraceevent callback to resolve kernel symbols")
---
 tools/perf/builtin-trace.c    | 2 +-
 tools/perf/util/trace-event.c | 7 +++----
 tools/perf/util/trace-event.h | 3 ++-
 3 files changed, 6 insertions(+), 6 deletions(-)
tools/perf/builtin-trace.c +1 -1
index 282841b1..06cfa93 100644
@@ -1489,7 +1489,7 @@ static int trace__symbols_init(struct trace *trace, struct perf_evlist *evlist)
 	if (trace->host == NULL)
 		return -ENOMEM;
 
-	if (trace_event__register_resolver(trace->host) < 0)
+	if (trace_event__register_resolver(trace->host, machine__resolve_kernel_addr) < 0)
 		return -errno;
 
 	err = __machine__synthesize_threads(trace->host, &trace->tool, &trace->opts.target,
tools/perf/util/trace-event.c +3 -4
index 667bd10..b90e646 100644
@@ -50,14 +50,13 @@ static int trace_event__init2(void)
 	return 0;
 }
 
-int trace_event__register_resolver(struct machine *machine)
+int trace_event__register_resolver(struct machine *machine,
+				   pevent_func_resolver_t *func)
 {
 	if (!tevent_initialized && trace_event__init2())
 		return -1;
 
-	return pevent_set_function_resolver(tevent.pevent,
-					    machine__resolve_kernel_addr,
-					    machine);
+	return pevent_set_function_resolver(tevent.pevent, func, machine);
 }
 
 void trace_event__cleanup(struct trace_event *t)
tools/perf/util/trace-event.h +2 -1
index 568128c..da6cc4c 100644
@@ -18,7 +18,8 @@ struct trace_event {
 
 int trace_event__init(struct trace_event *t);
 void trace_event__cleanup(struct trace_event *t);
-int trace_event__register_resolver(struct machine *machine);
+int trace_event__register_resolver(struct machine *machine,
+				   pevent_func_resolver_t *func);
 struct event_format*
 trace_event__tp_format(const char *sys, const char *name);