diff options
Diffstat (limited to 'tools/perf/util/evsel.h')
| -rw-r--r-- | tools/perf/util/evsel.h | 57 | 
1 files changed, 54 insertions, 3 deletions
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index 6f94d6dea00..52021c3087d 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -3,7 +3,8 @@  #include <linux/list.h>  #include <stdbool.h> -#include "../../../include/uapi/linux/perf_event.h" +#include <stddef.h> +#include <linux/perf_event.h>  #include "types.h"  #include "xyarray.h"  #include "cgroup.h" @@ -52,6 +53,7 @@ struct perf_evsel {  	struct xyarray		*sample_id;  	u64			*id;  	struct perf_counts	*counts; +	struct perf_counts	*prev_raw_counts;  	int			idx;  	u32			ids;  	struct hists		hists; @@ -72,10 +74,13 @@ struct perf_evsel {  	bool 			needs_swap;  	/* parse modifier helper */  	int			exclude_GH; +	int			nr_members;  	struct perf_evsel	*leader;  	char			*group_name;  }; +#define hists_to_evsel(h) container_of(h, struct perf_evsel, hists) +  struct cpu_map;  struct thread_map;  struct perf_evlist; @@ -92,8 +97,7 @@ void perf_evsel__exit(struct perf_evsel *evsel);  void perf_evsel__delete(struct perf_evsel *evsel);  void perf_evsel__config(struct perf_evsel *evsel, -			struct perf_record_opts *opts, -			struct perf_evsel *first); +			struct perf_record_opts *opts);  bool perf_evsel__is_cache_op_valid(u8 type, u8 op); @@ -110,14 +114,30 @@ extern const char *perf_evsel__sw_names[PERF_COUNT_SW_MAX];  int __perf_evsel__hw_cache_type_op_res_name(u8 type, u8 op, u8 result,  					    char *bf, size_t size);  const char *perf_evsel__name(struct perf_evsel *evsel); +const char *perf_evsel__group_name(struct perf_evsel *evsel); +int perf_evsel__group_desc(struct perf_evsel *evsel, char *buf, size_t size);  int perf_evsel__alloc_fd(struct perf_evsel *evsel, int ncpus, int nthreads);  int perf_evsel__alloc_id(struct perf_evsel *evsel, int ncpus, int nthreads);  int perf_evsel__alloc_counts(struct perf_evsel *evsel, int ncpus);  void perf_evsel__free_fd(struct perf_evsel *evsel);  void perf_evsel__free_id(struct perf_evsel *evsel); +void perf_evsel__free_counts(struct perf_evsel *evsel);  void perf_evsel__close_fd(struct perf_evsel *evsel, int ncpus, int nthreads); +void __perf_evsel__set_sample_bit(struct perf_evsel *evsel, +				  enum perf_event_sample_format bit); +void __perf_evsel__reset_sample_bit(struct perf_evsel *evsel, +				    enum perf_event_sample_format bit); + +#define perf_evsel__set_sample_bit(evsel, bit) \ +	__perf_evsel__set_sample_bit(evsel, PERF_SAMPLE_##bit) + +#define perf_evsel__reset_sample_bit(evsel, bit) \ +	__perf_evsel__reset_sample_bit(evsel, PERF_SAMPLE_##bit) + +void perf_evsel__set_sample_id(struct perf_evsel *evsel); +  int perf_evsel__set_filter(struct perf_evsel *evsel, int ncpus, int nthreads,  			   const char *filter); @@ -225,4 +245,35 @@ static inline struct perf_evsel *perf_evsel__next(struct perf_evsel *evsel)  {  	return list_entry(evsel->node.next, struct perf_evsel, node);  } + +static inline bool perf_evsel__is_group_leader(const struct perf_evsel *evsel) +{ +	return evsel->leader == evsel; +} + +struct perf_attr_details { +	bool freq; +	bool verbose; +	bool event_group; +}; + +int perf_evsel__fprintf(struct perf_evsel *evsel, +			struct perf_attr_details *details, FILE *fp); + +bool perf_evsel__fallback(struct perf_evsel *evsel, int err, +			  char *msg, size_t msgsize); +int perf_evsel__open_strerror(struct perf_evsel *evsel, +			      struct perf_target *target, +			      int err, char *msg, size_t size); + +static inline int perf_evsel__group_idx(struct perf_evsel *evsel) +{ +	return evsel->idx - evsel->leader->idx; +} + +#define for_each_group_member(_evsel, _leader) 					\ +for ((_evsel) = list_entry((_leader)->node.next, struct perf_evsel, node); 	\ +     (_evsel) && (_evsel)->leader == (_leader);					\ +     (_evsel) = list_entry((_evsel)->node.next, struct perf_evsel, node)) +  #endif /* __PERF_EVSEL_H */  |