diff options
Diffstat (limited to 'tools/perf/lib/include')
| -rw-r--r-- | tools/perf/lib/include/internal/evlist.h | 43 | ||||
| -rw-r--r-- | tools/perf/lib/include/internal/evsel.h | 1 | ||||
| -rw-r--r-- | tools/perf/lib/include/internal/mmap.h | 45 | ||||
| -rw-r--r-- | tools/perf/lib/include/internal/tests.h | 20 | ||||
| -rw-r--r-- | tools/perf/lib/include/perf/core.h | 3 | ||||
| -rw-r--r-- | tools/perf/lib/include/perf/evlist.h | 15 | ||||
| -rw-r--r-- | tools/perf/lib/include/perf/evsel.h | 2 | ||||
| -rw-r--r-- | tools/perf/lib/include/perf/mmap.h | 15 | 
8 files changed, 127 insertions, 17 deletions
diff --git a/tools/perf/lib/include/internal/evlist.h b/tools/perf/lib/include/internal/evlist.h index 9f440ab12b76..a2fbccf1922f 100644 --- a/tools/perf/lib/include/internal/evlist.h +++ b/tools/perf/lib/include/internal/evlist.h @@ -11,6 +11,7 @@  struct perf_cpu_map;  struct perf_thread_map; +struct perf_mmap_param;  struct perf_evlist {  	struct list_head	 entries; @@ -22,12 +23,36 @@ struct perf_evlist {  	size_t			 mmap_len;  	struct fdarray		 pollfd;  	struct hlist_head	 heads[PERF_EVLIST__HLIST_SIZE]; +	struct perf_mmap	*mmap; +	struct perf_mmap	*mmap_ovw; +	struct perf_mmap	*mmap_first; +	struct perf_mmap	*mmap_ovw_first; +}; + +typedef void +(*perf_evlist_mmap__cb_idx_t)(struct perf_evlist*, struct perf_mmap_param*, int, bool); +typedef struct perf_mmap* +(*perf_evlist_mmap__cb_get_t)(struct perf_evlist*, bool, int); +typedef int +(*perf_evlist_mmap__cb_mmap_t)(struct perf_mmap*, struct perf_mmap_param*, int, int); + +struct perf_evlist_mmap_ops { +	perf_evlist_mmap__cb_idx_t	idx; +	perf_evlist_mmap__cb_get_t	get; +	perf_evlist_mmap__cb_mmap_t	mmap;  };  int perf_evlist__alloc_pollfd(struct perf_evlist *evlist);  int perf_evlist__add_pollfd(struct perf_evlist *evlist, int fd,  			    void *ptr, short revent); +int perf_evlist__mmap_ops(struct perf_evlist *evlist, +			  struct perf_evlist_mmap_ops *ops, +			  struct perf_mmap_param *mp); + +void perf_evlist__init(struct perf_evlist *evlist); +void perf_evlist__exit(struct perf_evlist *evlist); +  /**   * __perf_evlist__for_each_entry - iterate thru all the evsels   * @list: list_head instance to iterate @@ -60,6 +85,24 @@ int perf_evlist__add_pollfd(struct perf_evlist *evlist, int fd,  #define perf_evlist__for_each_entry_reverse(evlist, evsel) \  	__perf_evlist__for_each_entry_reverse(&(evlist)->entries, evsel) +/** + * __perf_evlist__for_each_entry_safe - safely iterate thru all the evsels + * @list: list_head instance to iterate + * @tmp: struct evsel temp iterator + * @evsel: struct evsel iterator + */ +#define __perf_evlist__for_each_entry_safe(list, tmp, evsel) \ +	list_for_each_entry_safe(evsel, tmp, list, node) + +/** + * perf_evlist__for_each_entry_safe - safely iterate thru all the evsels + * @evlist: evlist instance to iterate + * @evsel: struct evsel iterator + * @tmp: struct evsel temp iterator + */ +#define perf_evlist__for_each_entry_safe(evlist, tmp, evsel) \ +	__perf_evlist__for_each_entry_safe(&(evlist)->entries, tmp, evsel) +  static inline struct perf_evsel *perf_evlist__first(struct perf_evlist *evlist)  {  	return list_entry(evlist->entries.next, struct perf_evsel, node); diff --git a/tools/perf/lib/include/internal/evsel.h b/tools/perf/lib/include/internal/evsel.h index a69b8299c36f..1ffd083b235e 100644 --- a/tools/perf/lib/include/internal/evsel.h +++ b/tools/perf/lib/include/internal/evsel.h @@ -50,6 +50,7 @@ struct perf_evsel {  	bool			 system_wide;  }; +void perf_evsel__init(struct perf_evsel *evsel, struct perf_event_attr *attr);  int perf_evsel__alloc_fd(struct perf_evsel *evsel, int ncpus, int nthreads);  void perf_evsel__close_fd(struct perf_evsel *evsel);  void perf_evsel__free_fd(struct perf_evsel *evsel); diff --git a/tools/perf/lib/include/internal/mmap.h b/tools/perf/lib/include/internal/mmap.h index ba1e519c15b9..be7556e0a2b2 100644 --- a/tools/perf/lib/include/internal/mmap.h +++ b/tools/perf/lib/include/internal/mmap.h @@ -10,23 +10,46 @@  /* perf sample has 16 bits size limit */  #define PERF_SAMPLE_MAX_SIZE (1 << 16) +struct perf_mmap; + +typedef void (*libperf_unmap_cb_t)(struct perf_mmap *map); +  /**   * struct perf_mmap - perf's ring buffer mmap details   *   * @refcnt - e.g. code using PERF_EVENT_IOC_SET_OUTPUT to share this   */  struct perf_mmap { -	void		*base; -	int		 mask; -	int		 fd; -	int		 cpu; -	refcount_t	 refcnt; -	u64		 prev; -	u64		 start; -	u64		 end; -	bool		 overwrite; -	u64		 flush; -	char		 event_copy[PERF_SAMPLE_MAX_SIZE] __aligned(8); +	void			*base; +	int			 mask; +	int			 fd; +	int			 cpu; +	refcount_t		 refcnt; +	u64			 prev; +	u64			 start; +	u64			 end; +	bool			 overwrite; +	u64			 flush; +	libperf_unmap_cb_t	 unmap_cb; +	char			 event_copy[PERF_SAMPLE_MAX_SIZE] __aligned(8); +	struct perf_mmap	*next; +}; + +struct perf_mmap_param { +	int	prot; +	int	mask;  }; +size_t perf_mmap__mmap_len(struct perf_mmap *map); + +void perf_mmap__init(struct perf_mmap *map, struct perf_mmap *prev, +		     bool overwrite, libperf_unmap_cb_t unmap_cb); +int perf_mmap__mmap(struct perf_mmap *map, struct perf_mmap_param *mp, +		    int fd, int cpu); +void perf_mmap__munmap(struct perf_mmap *map); +void perf_mmap__get(struct perf_mmap *map); +void perf_mmap__put(struct perf_mmap *map); + +u64 perf_mmap__read_head(struct perf_mmap *map); +  #endif /* __LIBPERF_INTERNAL_MMAP_H */ diff --git a/tools/perf/lib/include/internal/tests.h b/tools/perf/lib/include/internal/tests.h index b7a20cd24ee1..2093e8868a67 100644 --- a/tools/perf/lib/include/internal/tests.h +++ b/tools/perf/lib/include/internal/tests.h @@ -4,14 +4,28 @@  #include <stdio.h> -#define __T_START fprintf(stdout, "- running %s...", __FILE__) -#define __T_OK    fprintf(stdout, "OK\n") -#define __T_FAIL  fprintf(stdout, "FAIL\n") +int tests_failed; + +#define __T_START					\ +do {							\ +	fprintf(stdout, "- running %s...", __FILE__);	\ +	fflush(NULL);					\ +	tests_failed = 0;				\ +} while (0) + +#define __T_END								\ +do {									\ +	if (tests_failed)						\ +		fprintf(stdout, "  FAILED (%d)\n", tests_failed);	\ +	else								\ +		fprintf(stdout, "OK\n");				\ +} while (0)  #define __T(text, cond)                                                          \  do {                                                                             \  	if (!(cond)) {                                                           \  		fprintf(stderr, "FAILED %s:%d %s\n", __FILE__, __LINE__, text);  \ +		tests_failed++;                                                  \  		return -1;                                                       \  	}                                                                        \  } while (0) diff --git a/tools/perf/lib/include/perf/core.h b/tools/perf/lib/include/perf/core.h index cfd70e720c1c..a3f6d68edad7 100644 --- a/tools/perf/lib/include/perf/core.h +++ b/tools/perf/lib/include/perf/core.h @@ -9,9 +9,12 @@  #endif  enum libperf_print_level { +	LIBPERF_ERR,  	LIBPERF_WARN,  	LIBPERF_INFO,  	LIBPERF_DEBUG, +	LIBPERF_DEBUG2, +	LIBPERF_DEBUG3,  };  typedef int (*libperf_print_fn_t)(enum libperf_print_level level, diff --git a/tools/perf/lib/include/perf/evlist.h b/tools/perf/lib/include/perf/evlist.h index 8a2ce0757ab2..0a7479dc13bf 100644 --- a/tools/perf/lib/include/perf/evlist.h +++ b/tools/perf/lib/include/perf/evlist.h @@ -3,13 +3,13 @@  #define __LIBPERF_EVLIST_H  #include <perf/core.h> +#include <stdbool.h>  struct perf_evlist;  struct perf_evsel;  struct perf_cpu_map;  struct perf_thread_map; -LIBPERF_API void perf_evlist__init(struct perf_evlist *evlist);  LIBPERF_API void perf_evlist__add(struct perf_evlist *evlist,  				  struct perf_evsel *evsel);  LIBPERF_API void perf_evlist__remove(struct perf_evlist *evlist, @@ -32,5 +32,18 @@ LIBPERF_API void perf_evlist__set_maps(struct perf_evlist *evlist,  				       struct perf_cpu_map *cpus,  				       struct perf_thread_map *threads);  LIBPERF_API int perf_evlist__poll(struct perf_evlist *evlist, int timeout); +LIBPERF_API int perf_evlist__filter_pollfd(struct perf_evlist *evlist, +					   short revents_and_mask); + +LIBPERF_API int perf_evlist__mmap(struct perf_evlist *evlist, int pages); +LIBPERF_API void perf_evlist__munmap(struct perf_evlist *evlist); + +LIBPERF_API struct perf_mmap *perf_evlist__next_mmap(struct perf_evlist *evlist, +						     struct perf_mmap *map, +						     bool overwrite); +#define perf_evlist__for_each_mmap(evlist, pos, overwrite)		\ +	for ((pos) = perf_evlist__next_mmap((evlist), NULL, overwrite);	\ +	     (pos) != NULL;						\ +	     (pos) = perf_evlist__next_mmap((evlist), (pos), overwrite))  #endif /* __LIBPERF_EVLIST_H */ diff --git a/tools/perf/lib/include/perf/evsel.h b/tools/perf/lib/include/perf/evsel.h index 4388667f265c..557f5815a9c9 100644 --- a/tools/perf/lib/include/perf/evsel.h +++ b/tools/perf/lib/include/perf/evsel.h @@ -21,8 +21,6 @@ struct perf_counts_values {  	};  }; -LIBPERF_API void perf_evsel__init(struct perf_evsel *evsel, -				  struct perf_event_attr *attr);  LIBPERF_API struct perf_evsel *perf_evsel__new(struct perf_event_attr *attr);  LIBPERF_API void perf_evsel__delete(struct perf_evsel *evsel);  LIBPERF_API int perf_evsel__open(struct perf_evsel *evsel, struct perf_cpu_map *cpus, diff --git a/tools/perf/lib/include/perf/mmap.h b/tools/perf/lib/include/perf/mmap.h new file mode 100644 index 000000000000..9508ad90d8b9 --- /dev/null +++ b/tools/perf/lib/include/perf/mmap.h @@ -0,0 +1,15 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __LIBPERF_MMAP_H +#define __LIBPERF_MMAP_H + +#include <perf/core.h> + +struct perf_mmap; +union perf_event; + +LIBPERF_API void perf_mmap__consume(struct perf_mmap *map); +LIBPERF_API int perf_mmap__read_init(struct perf_mmap *map); +LIBPERF_API void perf_mmap__read_done(struct perf_mmap *map); +LIBPERF_API union perf_event *perf_mmap__read_event(struct perf_mmap *map); + +#endif /* __LIBPERF_MMAP_H */  | 
