1
0

session.h 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef __PERF_SESSION_H
  3. #define __PERF_SESSION_H
  4. #include "trace-event.h"
  5. #include "event.h"
  6. #include "header.h"
  7. #include "machine.h"
  8. #include "data.h"
  9. #include "ordered-events.h"
  10. #include "util/compress.h"
  11. #include <linux/kernel.h>
  12. #include <linux/rbtree.h>
  13. #include <linux/perf_event.h>
  14. struct ip_callchain;
  15. struct symbol;
  16. struct thread;
  17. struct auxtrace;
  18. struct itrace_synth_opts;
  19. struct decomp_data {
  20. struct decomp *decomp;
  21. struct decomp *decomp_last;
  22. struct zstd_data *zstd_decomp;
  23. };
  24. /**
  25. * struct perf_session- A Perf session holds the main state when the program is
  26. * working with live perf events or reading data from an input file.
  27. *
  28. * The rough organization of a perf_session is:
  29. * ```
  30. * +--------------+ +-----------+ +------------+
  31. * | Session |1..* ----->| Machine |1..* ----->| Thread |
  32. * +--------------+ +-----------+ +------------+
  33. * ```
  34. */
  35. struct perf_session {
  36. /**
  37. * @header: The read version of a perf_file_header, or captures global
  38. * information from a live session.
  39. */
  40. struct perf_header header;
  41. /** @machines: Machines within the session a host and 0 or more guests. */
  42. struct machines machines;
  43. /** @evlist: List of evsels/events of the session. */
  44. struct evlist *evlist;
  45. /** @auxtrace: callbacks to allow AUX area data decoding. */
  46. const struct auxtrace *auxtrace;
  47. /** @itrace_synth_opts: AUX area tracing synthesis options. */
  48. struct itrace_synth_opts *itrace_synth_opts;
  49. /** @auxtrace_index: index of AUX area tracing events within a perf.data file. */
  50. struct list_head auxtrace_index;
  51. #ifdef HAVE_LIBTRACEEVENT
  52. /** @tevent: handles for libtraceevent and plugins. */
  53. struct trace_event tevent;
  54. #endif
  55. /** @time_conv: Holds contents of last PERF_RECORD_TIME_CONV event. */
  56. struct perf_record_time_conv time_conv;
  57. /** @trace_event_repipe: When set causes read trace events to be written to stdout. */
  58. bool trace_event_repipe;
  59. /**
  60. * @one_mmap: The reader will use a single mmap by default. There may be
  61. * multiple data files in particular for aux events. If this is true
  62. * then the single big mmap for the data file can be assumed.
  63. */
  64. bool one_mmap;
  65. /** @one_mmap_addr: Address of initial perf data file reader mmap. */
  66. void *one_mmap_addr;
  67. /** @one_mmap_offset: File offset in perf.data file when mapped. */
  68. u64 one_mmap_offset;
  69. /** @ordered_events: Used to turn unordered events into ordered ones. */
  70. struct ordered_events ordered_events;
  71. /** @data: Optional perf data file being read from. */
  72. struct perf_data *data;
  73. /** @tool: callbacks for event handling. */
  74. const struct perf_tool *tool;
  75. /**
  76. * @bytes_transferred: Used by perf record to count written bytes before
  77. * compression.
  78. */
  79. u64 bytes_transferred;
  80. /**
  81. * @bytes_compressed: Used by perf record to count written bytes after
  82. * compression.
  83. */
  84. u64 bytes_compressed;
  85. /** @zstd_data: Owner of global compression state, buffers, etc. */
  86. struct zstd_data zstd_data;
  87. struct decomp_data decomp_data;
  88. struct decomp_data *active_decomp;
  89. };
  90. struct decomp {
  91. struct decomp *next;
  92. u64 file_pos;
  93. const char *file_path;
  94. size_t mmap_len;
  95. u64 head;
  96. size_t size;
  97. char data[];
  98. };
  99. struct perf_tool;
  100. struct perf_session *__perf_session__new(struct perf_data *data,
  101. struct perf_tool *tool,
  102. bool trace_event_repipe,
  103. struct perf_env *host_env);
  104. static inline struct perf_session *perf_session__new(struct perf_data *data,
  105. struct perf_tool *tool)
  106. {
  107. return __perf_session__new(data, tool, /*trace_event_repipe=*/false, /*host_env=*/NULL);
  108. }
  109. void perf_session__delete(struct perf_session *session);
  110. void perf_event_header__bswap(struct perf_event_header *hdr);
  111. int perf_session__peek_event(struct perf_session *session, off_t file_offset,
  112. void *buf, size_t buf_sz,
  113. union perf_event **event_ptr,
  114. struct perf_sample *sample);
  115. typedef int (*peek_events_cb_t)(struct perf_session *session,
  116. union perf_event *event, u64 offset,
  117. void *data);
  118. int perf_session__peek_events(struct perf_session *session, u64 offset,
  119. u64 size, peek_events_cb_t cb, void *data);
  120. int perf_session__process_events(struct perf_session *session);
  121. int perf_session__queue_event(struct perf_session *s, union perf_event *event,
  122. u64 timestamp, u64 file_offset, const char *file_path);
  123. int perf_session__resolve_callchain(struct perf_session *session,
  124. struct evsel *evsel,
  125. struct thread *thread,
  126. struct ip_callchain *chain,
  127. struct symbol **parent);
  128. bool perf_session__has_traces(struct perf_session *session, const char *msg);
  129. bool perf_session__has_switch_events(struct perf_session *session);
  130. void perf_event__attr_swap(struct perf_event_attr *attr);
  131. int perf_session__create_kernel_maps(struct perf_session *session);
  132. void perf_session__set_id_hdr_size(struct perf_session *session);
  133. static inline
  134. struct machine *perf_session__find_machine(struct perf_session *session, pid_t pid)
  135. {
  136. return machines__find(&session->machines, pid);
  137. }
  138. static inline
  139. struct machine *perf_session__findnew_machine(struct perf_session *session, pid_t pid)
  140. {
  141. return machines__findnew(&session->machines, pid);
  142. }
  143. struct thread *perf_session__findnew(struct perf_session *session, pid_t pid);
  144. int perf_session__register_idle_thread(struct perf_session *session);
  145. size_t perf_session__fprintf(struct perf_session *session, FILE *fp);
  146. size_t perf_session__fprintf_dsos(struct perf_session *session, FILE *fp);
  147. size_t perf_session__fprintf_dsos_buildid(struct perf_session *session, FILE *fp,
  148. bool (fn)(struct dso *dso, int parm), int parm);
  149. size_t perf_session__fprintf_nr_events(struct perf_session *session, FILE *fp);
  150. void perf_session__dump_kmaps(struct perf_session *session);
  151. struct evsel *perf_session__find_first_evtype(struct perf_session *session,
  152. unsigned int type);
  153. int perf_session__cpu_bitmap(struct perf_session *session,
  154. const char *cpu_list, unsigned long *cpu_bitmap);
  155. void perf_session__fprintf_info(struct perf_session *s, FILE *fp, bool full);
  156. struct evsel_str_handler;
  157. #define perf_session__set_tracepoints_handlers(session, array) \
  158. __evlist__set_tracepoints_handlers(session->evlist, array, ARRAY_SIZE(array))
  159. extern volatile int session_done;
  160. #define session_done() READ_ONCE(session_done)
  161. int perf_session__deliver_synth_event(struct perf_session *session,
  162. union perf_event *event,
  163. struct perf_sample *sample);
  164. int perf_session__deliver_synth_attr_event(struct perf_session *session,
  165. const struct perf_event_attr *attr,
  166. u64 id);
  167. int perf_session__dsos_hit_all(struct perf_session *session);
  168. int perf_event__process_id_index(const struct perf_tool *tool,
  169. struct perf_session *session,
  170. union perf_event *event);
  171. int perf_event__process_finished_round(const struct perf_tool *tool,
  172. union perf_event *event,
  173. struct ordered_events *oe);
  174. struct perf_env *perf_session__env(struct perf_session *session);
  175. uint16_t perf_session__e_machine(struct perf_session *session, uint32_t *e_flags);
  176. #endif /* __PERF_SESSION_H */