 da3789628f
			
		
	
	
	da3789628f
	
	
	
		
			
			The pevent thing is per perf.data file, so I made it stop being static and become a perf_session member, so tools processing perf.data files use perf_session and _there_ we read the trace events description into session->pevent and then change everywhere to stop using that single global pevent variable and use the per session one. Note that it _doesn't_ fall backs to trace__event_id, as we're not interested at all in what is present in the /sys/kernel/debug/tracing/events in the workstation doing the analysis, just in what is in the perf.data file. This patch also introduces perf_session__set_tracepoints_handlers that is the perf perf.data/session way to associate handlers to tracepoint events by resolving their IDs using the events descriptions stored in a perf.data file. Make 'perf sched' use it. Reported-by: Dmitry Antipov <dmitry.antipov@linaro.org> Tested-by: Dmitry Antipov <dmitry.antipov@linaro.org> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Namhyung Kim <namhyung@gmail.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: linaro-dev@lists.linaro.org Cc: patches@linaro.org Link: http://lkml.kernel.org/r/20120625232016.GA28525@infradead.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
		
			
				
	
	
		
			132 lines
		
	
	
	
		
			4.2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
	
		
			4.2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef __PERF_EVLIST_H
 | |
| #define __PERF_EVLIST_H 1
 | |
| 
 | |
| #include <linux/list.h>
 | |
| #include <stdio.h>
 | |
| #include "../perf.h"
 | |
| #include "event.h"
 | |
| #include "util.h"
 | |
| #include <unistd.h>
 | |
| 
 | |
| struct pollfd;
 | |
| struct thread_map;
 | |
| struct cpu_map;
 | |
| struct perf_record_opts;
 | |
| 
 | |
| #define PERF_EVLIST__HLIST_BITS 8
 | |
| #define PERF_EVLIST__HLIST_SIZE (1 << PERF_EVLIST__HLIST_BITS)
 | |
| 
 | |
| struct perf_evlist {
 | |
| 	struct list_head entries;
 | |
| 	struct hlist_head heads[PERF_EVLIST__HLIST_SIZE];
 | |
| 	int		 nr_entries;
 | |
| 	int		 nr_fds;
 | |
| 	int		 nr_mmaps;
 | |
| 	int		 mmap_len;
 | |
| 	struct {
 | |
| 		int	cork_fd;
 | |
| 		pid_t	pid;
 | |
| 	} workload;
 | |
| 	bool		 overwrite;
 | |
| 	union perf_event event_copy;
 | |
| 	struct perf_mmap *mmap;
 | |
| 	struct pollfd	 *pollfd;
 | |
| 	struct thread_map *threads;
 | |
| 	struct cpu_map	  *cpus;
 | |
| 	struct perf_evsel *selected;
 | |
| };
 | |
| 
 | |
| struct perf_evsel_str_handler {
 | |
| 	const char *name;
 | |
| 	void	   *handler;
 | |
| };
 | |
| 
 | |
| struct perf_evsel;
 | |
| 
 | |
| struct perf_evlist *perf_evlist__new(struct cpu_map *cpus,
 | |
| 				     struct thread_map *threads);
 | |
| void perf_evlist__init(struct perf_evlist *evlist, struct cpu_map *cpus,
 | |
| 		       struct thread_map *threads);
 | |
| void perf_evlist__exit(struct perf_evlist *evlist);
 | |
| void perf_evlist__delete(struct perf_evlist *evlist);
 | |
| 
 | |
| 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_attrs(struct perf_evlist *evlist,
 | |
| 			   struct perf_event_attr *attrs, size_t nr_attrs);
 | |
| int __perf_evlist__add_default_attrs(struct perf_evlist *evlist,
 | |
| 				     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);
 | |
| int perf_evlist__set_tracepoints_handlers(struct perf_evlist *evlist,
 | |
| 					  const struct perf_evsel_str_handler *assocs,
 | |
| 					  size_t nr_assocs);
 | |
| 
 | |
| #define perf_evlist__add_attrs_array(evlist, array) \
 | |
| 	perf_evlist__add_attrs(evlist, array, ARRAY_SIZE(array))
 | |
| #define perf_evlist__add_default_attrs(evlist, array) \
 | |
| 	__perf_evlist__add_default_attrs(evlist, array, ARRAY_SIZE(array))
 | |
| 
 | |
| #define perf_evlist__add_tracepoints_array(evlist, array) \
 | |
| 	perf_evlist__add_tracepoints(evlist, array, ARRAY_SIZE(array))
 | |
| 
 | |
| #define perf_evlist__set_tracepoints_handlers_array(evlist, array) \
 | |
| 	perf_evlist__set_tracepoints_handlers(evlist, array, ARRAY_SIZE(array))
 | |
| 
 | |
| struct perf_evsel *
 | |
| perf_evlist__find_tracepoint_by_id(struct perf_evlist *evlist, int id);
 | |
| 
 | |
| void perf_evlist__id_add(struct perf_evlist *evlist, struct perf_evsel *evsel,
 | |
| 			 int cpu, int thread, u64 id);
 | |
| 
 | |
| void perf_evlist__add_pollfd(struct perf_evlist *evlist, int fd);
 | |
| 
 | |
| struct perf_evsel *perf_evlist__id2evsel(struct perf_evlist *evlist, u64 id);
 | |
| 
 | |
| union perf_event *perf_evlist__mmap_read(struct perf_evlist *self, int idx);
 | |
| 
 | |
| int perf_evlist__open(struct perf_evlist *evlist, bool group);
 | |
| 
 | |
| void perf_evlist__config_attrs(struct perf_evlist *evlist,
 | |
| 			       struct perf_record_opts *opts);
 | |
| 
 | |
| int perf_evlist__prepare_workload(struct perf_evlist *evlist,
 | |
| 				  struct perf_record_opts *opts,
 | |
| 				  const char *argv[]);
 | |
| int perf_evlist__start_workload(struct perf_evlist *evlist);
 | |
| 
 | |
| int perf_evlist__mmap(struct perf_evlist *evlist, unsigned int pages,
 | |
| 		      bool overwrite);
 | |
| void perf_evlist__munmap(struct perf_evlist *evlist);
 | |
| 
 | |
| void perf_evlist__disable(struct perf_evlist *evlist);
 | |
| void perf_evlist__enable(struct perf_evlist *evlist);
 | |
| 
 | |
| void perf_evlist__set_selected(struct perf_evlist *evlist,
 | |
| 			       struct perf_evsel *evsel);
 | |
| 
 | |
| static inline void perf_evlist__set_maps(struct perf_evlist *evlist,
 | |
| 					 struct cpu_map *cpus,
 | |
| 					 struct thread_map *threads)
 | |
| {
 | |
| 	evlist->cpus	= cpus;
 | |
| 	evlist->threads	= threads;
 | |
| }
 | |
| 
 | |
| int perf_evlist__create_maps(struct perf_evlist *evlist,
 | |
| 			     struct perf_target *target);
 | |
| void perf_evlist__delete_maps(struct perf_evlist *evlist);
 | |
| int perf_evlist__set_filters(struct perf_evlist *evlist);
 | |
| 
 | |
| u64 perf_evlist__sample_type(const struct perf_evlist *evlist);
 | |
| bool perf_evlist__sample_id_all(const const struct perf_evlist *evlist);
 | |
| u16 perf_evlist__id_hdr_size(const struct perf_evlist *evlist);
 | |
| 
 | |
| bool perf_evlist__valid_sample_type(const struct perf_evlist *evlist);
 | |
| bool perf_evlist__valid_sample_id_all(const struct perf_evlist *evlist);
 | |
| 
 | |
| void perf_evlist__splice_list_tail(struct perf_evlist *evlist,
 | |
| 				   struct list_head *list,
 | |
| 				   int nr_entries);
 | |
| 
 | |
| #endif /* __PERF_EVLIST_H */
 |