2013-12-03 17:09:23 +04:00
2013-12-03 17:09:24 +04:00
# include <stdio.h>
# include <unistd.h>
# include <stdlib.h>
# include <errno.h>
# include <sys/types.h>
# include <sys/stat.h>
# include <fcntl.h>
# include <linux/kernel.h>
2015-09-07 11:38:06 +03:00
# include <linux/err.h>
2013-12-03 17:09:23 +04:00
# include <traceevent/event-parse.h>
2015-09-02 10:56:34 +03:00
# include <api/fs/tracing_path.h>
2016-02-14 19:03:43 +03:00
# include <api/fs/fs.h>
2013-12-03 17:09:23 +04:00
# include "trace-event.h"
2015-07-22 22:14:29 +03:00
# include "machine.h"
2013-12-03 17:09:24 +04:00
# include "util.h"
/*
* global trace_event object used by trace_event__tp_format
*
* TODO There ' s no cleanup call for this . Add some sort of
* __exit function support and call trace_event__cleanup
* there .
*/
static struct trace_event tevent ;
2015-07-22 22:14:29 +03:00
static bool tevent_initialized ;
2013-12-03 17:09:23 +04:00
int trace_event__init ( struct trace_event * t )
{
struct pevent * pevent = pevent_alloc ( ) ;
if ( pevent ) {
t - > plugin_list = traceevent_load_plugins ( pevent ) ;
t - > pevent = pevent ;
}
return pevent ? 0 : - 1 ;
}
2015-07-22 22:14:29 +03:00
static int trace_event__init2 ( void )
{
int be = traceevent_host_bigendian ( ) ;
struct pevent * pevent ;
if ( trace_event__init ( & tevent ) )
return - 1 ;
pevent = tevent . pevent ;
pevent_set_flag ( pevent , PEVENT_NSEC_OUTPUT ) ;
pevent_set_file_bigendian ( pevent , be ) ;
pevent_set_host_bigendian ( pevent , be ) ;
tevent_initialized = true ;
return 0 ;
}
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 <adrian.hunter@intel.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Stephane Eranian <eranian@google.com>
Fixes: c3168b0db93a ("perf symbols: Provide libtraceevent callback to resolve kernel symbols")
Link: http://lkml.kernel.org/n/tip-vxlhh95v2em9zdbgj3jm7xi5@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2015-07-24 18:13:05 +03:00
int trace_event__register_resolver ( struct machine * machine ,
pevent_func_resolver_t * func )
2015-07-22 22:14:29 +03:00
{
if ( ! tevent_initialized & & trace_event__init2 ( ) )
return - 1 ;
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 <adrian.hunter@intel.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Stephane Eranian <eranian@google.com>
Fixes: c3168b0db93a ("perf symbols: Provide libtraceevent callback to resolve kernel symbols")
Link: http://lkml.kernel.org/n/tip-vxlhh95v2em9zdbgj3jm7xi5@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2015-07-24 18:13:05 +03:00
return pevent_set_function_resolver ( tevent . pevent , func , machine ) ;
2015-07-22 22:14:29 +03:00
}
2013-12-03 17:09:23 +04:00
void trace_event__cleanup ( struct trace_event * t )
{
2014-01-15 05:45:28 +04:00
traceevent_unload_plugins ( t - > plugin_list , t - > pevent ) ;
2013-12-03 17:09:23 +04:00
pevent_free ( t - > pevent ) ;
}
2013-12-03 17:09:24 +04:00
2015-09-07 11:38:06 +03:00
/*
* Returns pointer with encoded error via < linux / err . h > interface .
*/
2013-12-03 17:09:24 +04:00
static struct event_format *
tp_format ( const char * sys , const char * name )
{
struct pevent * pevent = tevent . pevent ;
struct event_format * event = NULL ;
char path [ PATH_MAX ] ;
size_t size ;
char * data ;
2015-09-07 11:38:06 +03:00
int err ;
2013-12-03 17:09:24 +04:00
scnprintf ( path , PATH_MAX , " %s/%s/%s/format " ,
tracing_events_path , sys , name ) ;
2015-09-07 11:38:06 +03:00
err = filename__read_str ( path , & data , & size ) ;
if ( err )
return ERR_PTR ( err ) ;
2013-12-03 17:09:24 +04:00
pevent_parse_format ( pevent , & event , data , size , sys ) ;
free ( data ) ;
return event ;
}
2015-09-07 11:38:06 +03:00
/*
* Returns pointer with encoded error via < linux / err . h > interface .
*/
2013-12-03 17:09:24 +04:00
struct event_format *
trace_event__tp_format ( const char * sys , const char * name )
{
2015-07-22 22:14:29 +03:00
if ( ! tevent_initialized & & trace_event__init2 ( ) )
2015-09-07 11:38:06 +03:00
return ERR_PTR ( - ENOMEM ) ;
2013-12-03 17:09:24 +04:00
return tp_format ( sys , name ) ;
}
2016-07-10 14:07:54 +03:00
struct event_format * trace_event__tp_format_id ( int id )
{
if ( ! tevent_initialized & & trace_event__init2 ( ) )
return ERR_PTR ( - ENOMEM ) ;
return pevent_find_event ( tevent . pevent , id ) ;
}