1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifndef __PERF_SESSION_H 2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define __PERF_SESSION_H 3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "hist.h" 5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "event.h" 6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "header.h" 7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "machine.h" 8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "symbol.h" 9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "thread.h" 10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <linux/rbtree.h> 11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <linux/perf_event.h> 12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct sample_queue; 14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct ip_callchain; 15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct thread; 16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct ordered_samples { 18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u64 last_flush; 19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u64 next_flush; 20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u64 max_timestamp; 21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct list_head samples; 22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct list_head sample_cache; 23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct list_head to_free; 24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct sample_queue *sample_buffer; 25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct sample_queue *last_sample; 26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int sample_buffer_idx; 27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng unsigned int nr_samples; 28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct perf_session { 31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_header header; 32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng unsigned long size; 33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct machines machines; 34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_evlist *evlist; 35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct pevent *pevent; 36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct events_stats stats; 37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int fd; 38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bool fd_pipe; 39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bool repipe; 40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct ordered_samples ordered_samples; 41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char filename[1]; 42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PRINT_IP_OPT_IP (1<<0) 45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PRINT_IP_OPT_SYM (1<<1) 46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PRINT_IP_OPT_DSO (1<<2) 47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PRINT_IP_OPT_SYMOFFSET (1<<3) 48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PRINT_IP_OPT_ONELINE (1<<4) 49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct perf_tool; 51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct perf_session *perf_session__new(const char *filename, int mode, 53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bool force, bool repipe, 54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_tool *tool); 55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid perf_session__delete(struct perf_session *session); 56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid perf_event_header__bswap(struct perf_event_header *self); 58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint __perf_session__process_events(struct perf_session *self, 60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u64 data_offset, u64 data_size, u64 size, 61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_tool *tool); 62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint perf_session__process_events(struct perf_session *self, 63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_tool *tool); 64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint perf_session_queue_event(struct perf_session *s, union perf_event *event, 66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_sample *sample, u64 file_offset); 67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid perf_tool__fill_defaults(struct perf_tool *tool); 69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint perf_session__resolve_callchain(struct perf_session *self, struct perf_evsel *evsel, 71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct thread *thread, 72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct ip_callchain *chain, 73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct symbol **parent); 74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbool perf_session__has_traces(struct perf_session *self, const char *msg); 76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid mem_bswap_64(void *src, int byte_size); 78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid mem_bswap_32(void *src, int byte_size); 79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid perf_event__attr_swap(struct perf_event_attr *attr); 80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint perf_session__create_kernel_maps(struct perf_session *self); 82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid perf_session__set_id_hdr_size(struct perf_session *session); 84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline 86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct machine *perf_session__find_machine(struct perf_session *self, pid_t pid) 87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return machines__find(&self->machines, pid); 89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline 92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct machine *perf_session__findnew_machine(struct perf_session *self, pid_t pid) 93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return machines__findnew(&self->machines, pid); 95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct thread *perf_session__findnew(struct perf_session *self, pid_t pid); 98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengsize_t perf_session__fprintf(struct perf_session *self, FILE *fp); 99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengsize_t perf_session__fprintf_dsos(struct perf_session *self, FILE *fp); 101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengsize_t perf_session__fprintf_dsos_buildid(struct perf_session *session, FILE *fp, 103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bool (fn)(struct dso *dso, int parm), int parm); 104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengsize_t perf_session__fprintf_nr_events(struct perf_session *session, FILE *fp); 106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct perf_evsel *perf_session__find_first_evtype(struct perf_session *session, 108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng unsigned int type); 109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid perf_evsel__print_ip(struct perf_evsel *evsel, union perf_event *event, 111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_sample *sample, struct machine *machine, 112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng unsigned int print_opts, unsigned int stack_depth); 113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint perf_session__cpu_bitmap(struct perf_session *session, 115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const char *cpu_list, unsigned long *cpu_bitmap); 116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid perf_session__fprintf_info(struct perf_session *s, FILE *fp, bool full); 118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct perf_evsel_str_handler; 120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint __perf_session__set_tracepoints_handlers(struct perf_session *session, 122e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const struct perf_evsel_str_handler *assocs, 123e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng size_t nr_assocs); 124e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 125e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define perf_session__set_tracepoints_handlers(session, array) \ 126e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng __perf_session__set_tracepoints_handlers(session, array, ARRAY_SIZE(array)) 127e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 128e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern volatile int session_done; 129e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 130e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define session_done() (*(volatile int *)(&session_done)) 131e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif /* __PERF_SESSION_H */ 132