|
@@ -17,6 +17,13 @@ struct perf_record_opts;
|
|
|
#define PERF_EVLIST__HLIST_BITS 8
|
|
|
#define PERF_EVLIST__HLIST_SIZE (1 << PERF_EVLIST__HLIST_BITS)
|
|
|
|
|
|
+struct perf_mmap {
|
|
|
+ void *base;
|
|
|
+ int mask;
|
|
|
+ unsigned int prev;
|
|
|
+ union perf_event event_copy;
|
|
|
+};
|
|
|
+
|
|
|
struct perf_evlist {
|
|
|
struct list_head entries;
|
|
|
struct hlist_head heads[PERF_EVLIST__HLIST_SIZE];
|
|
@@ -30,7 +37,6 @@ struct perf_evlist {
|
|
|
pid_t pid;
|
|
|
} workload;
|
|
|
bool overwrite;
|
|
|
- union perf_event event_copy;
|
|
|
struct perf_mmap *mmap;
|
|
|
struct pollfd *pollfd;
|
|
|
struct thread_map *threads;
|
|
@@ -136,4 +142,25 @@ static inline struct perf_evsel *perf_evlist__last(struct perf_evlist *evlist)
|
|
|
}
|
|
|
|
|
|
size_t perf_evlist__fprintf(struct perf_evlist *evlist, FILE *fp);
|
|
|
+
|
|
|
+static inline unsigned int perf_mmap__read_head(struct perf_mmap *mm)
|
|
|
+{
|
|
|
+ struct perf_event_mmap_page *pc = mm->base;
|
|
|
+ int head = pc->data_head;
|
|
|
+ rmb();
|
|
|
+ return head;
|
|
|
+}
|
|
|
+
|
|
|
+static inline void perf_mmap__write_tail(struct perf_mmap *md,
|
|
|
+ unsigned long tail)
|
|
|
+{
|
|
|
+ struct perf_event_mmap_page *pc = md->base;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * ensure all reads are done before we write the tail out.
|
|
|
+ */
|
|
|
+ /* mb(); */
|
|
|
+ pc->data_tail = tail;
|
|
|
+}
|
|
|
+
|
|
|
#endif /* __PERF_EVLIST_H */
|