perf evlist: Introduce add_tracepoints method
Convenient way of asking for tracepoint events to be added to an existing evlist. Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/n/tip-0ylj4wrg54791u0baqb9swbb@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
		
					parent
					
						
							
								50d08e47bc
							
						
					
				
			
			
				commit
				
					
						a8c9ae18d8
					
				
			
		
					 3 changed files with 63 additions and 2 deletions
				
			
		| 
						 | 
					@ -6,12 +6,13 @@
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Released under the GPL v2. (and only v2, not any later version)
 | 
					 * Released under the GPL v2. (and only v2, not any later version)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					#include "util.h"
 | 
				
			||||||
 | 
					#include "debugfs.h"
 | 
				
			||||||
#include <poll.h>
 | 
					#include <poll.h>
 | 
				
			||||||
#include "cpumap.h"
 | 
					#include "cpumap.h"
 | 
				
			||||||
#include "thread_map.h"
 | 
					#include "thread_map.h"
 | 
				
			||||||
#include "evlist.h"
 | 
					#include "evlist.h"
 | 
				
			||||||
#include "evsel.h"
 | 
					#include "evsel.h"
 | 
				
			||||||
#include "util.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "parse-events.h"
 | 
					#include "parse-events.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -134,6 +135,60 @@ out_delete_partial_list:
 | 
				
			||||||
	return -1;
 | 
						return -1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int trace_event__id(const char *evname)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char *filename, *colon;
 | 
				
			||||||
 | 
						int err = -1, fd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (asprintf(&filename, "%s/%s/id", tracing_events_path, evname) < 0)
 | 
				
			||||||
 | 
							return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						colon = strrchr(filename, ':');
 | 
				
			||||||
 | 
						if (colon != NULL)
 | 
				
			||||||
 | 
							*colon = '/';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fd = open(filename, O_RDONLY);
 | 
				
			||||||
 | 
						if (fd >= 0) {
 | 
				
			||||||
 | 
							char id[16];
 | 
				
			||||||
 | 
							if (read(fd, id, sizeof(id)) > 0)
 | 
				
			||||||
 | 
								err = atoi(id);
 | 
				
			||||||
 | 
							close(fd);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						free(filename);
 | 
				
			||||||
 | 
						return err;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int perf_evlist__add_tracepoints(struct perf_evlist *evlist,
 | 
				
			||||||
 | 
									 const char *tracepoints[],
 | 
				
			||||||
 | 
									 size_t nr_tracepoints)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int err;
 | 
				
			||||||
 | 
						size_t i;
 | 
				
			||||||
 | 
						struct perf_event_attr *attrs = zalloc(nr_tracepoints * sizeof(*attrs));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (attrs == NULL)
 | 
				
			||||||
 | 
							return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 0; i < nr_tracepoints; i++) {
 | 
				
			||||||
 | 
							err = trace_event__id(tracepoints[i]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (err < 0)
 | 
				
			||||||
 | 
								goto out_free_attrs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							attrs[i].type	       = PERF_TYPE_TRACEPOINT;
 | 
				
			||||||
 | 
							attrs[i].config	       = err;
 | 
				
			||||||
 | 
						        attrs[i].sample_type   = (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME |
 | 
				
			||||||
 | 
										  PERF_SAMPLE_CPU);
 | 
				
			||||||
 | 
							attrs[i].sample_period = 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = perf_evlist__add_attrs(evlist, attrs, nr_tracepoints);
 | 
				
			||||||
 | 
					out_free_attrs:
 | 
				
			||||||
 | 
						free(attrs);
 | 
				
			||||||
 | 
						return err;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void perf_evlist__disable(struct perf_evlist *evlist)
 | 
					void perf_evlist__disable(struct perf_evlist *evlist)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int cpu, thread;
 | 
						int cpu, thread;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -43,10 +43,15 @@ void perf_evlist__add(struct perf_evlist *evlist, struct perf_evsel *entry);
 | 
				
			||||||
int perf_evlist__add_default(struct perf_evlist *evlist);
 | 
					int perf_evlist__add_default(struct perf_evlist *evlist);
 | 
				
			||||||
int perf_evlist__add_attrs(struct perf_evlist *evlist,
 | 
					int perf_evlist__add_attrs(struct perf_evlist *evlist,
 | 
				
			||||||
			   struct perf_event_attr *attrs, size_t nr_attrs);
 | 
								   struct perf_event_attr *attrs, size_t nr_attrs);
 | 
				
			||||||
 | 
					int perf_evlist__add_tracepoints(struct perf_evlist *evlist,
 | 
				
			||||||
 | 
									 const char *tracepoints[], size_t nr_tracepoints);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define perf_evlist__add_attrs_array(evlist, array) \
 | 
					#define perf_evlist__add_attrs_array(evlist, array) \
 | 
				
			||||||
	perf_evlist__add_attrs(evlist, array, ARRAY_SIZE(array))
 | 
						perf_evlist__add_attrs(evlist, array, ARRAY_SIZE(array))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define perf_evlist__add_tracepoints_array(evlist, array) \
 | 
				
			||||||
 | 
						perf_evlist__add_tracepoints(evlist, array, ARRAY_SIZE(array))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void perf_evlist__id_add(struct perf_evlist *evlist, struct perf_evsel *evsel,
 | 
					void perf_evlist__id_add(struct perf_evlist *evlist, struct perf_evsel *evsel,
 | 
				
			||||||
			 int cpu, int thread, u64 id);
 | 
								 int cpu, int thread, u64 id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,7 +27,8 @@ build_tmp = getenv('PYTHON_EXTBUILD_TMP')
 | 
				
			||||||
perf = Extension('perf',
 | 
					perf = Extension('perf',
 | 
				
			||||||
		  sources = ['util/python.c', 'util/ctype.c', 'util/evlist.c',
 | 
							  sources = ['util/python.c', 'util/ctype.c', 'util/evlist.c',
 | 
				
			||||||
			     'util/evsel.c', 'util/cpumap.c', 'util/thread_map.c',
 | 
								     'util/evsel.c', 'util/cpumap.c', 'util/thread_map.c',
 | 
				
			||||||
			     'util/util.c', 'util/xyarray.c', 'util/cgroup.c'],
 | 
								     'util/util.c', 'util/xyarray.c', 'util/cgroup.c',
 | 
				
			||||||
 | 
								     'util/debugfs.c'],
 | 
				
			||||||
		  include_dirs = ['util/include'],
 | 
							  include_dirs = ['util/include'],
 | 
				
			||||||
		  extra_compile_args = cflags,
 | 
							  extra_compile_args = cflags,
 | 
				
			||||||
                 )
 | 
					                 )
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue