mmap.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #ifndef __PERF_MMAP_H
  2. #define __PERF_MMAP_H 1
  3. #include <linux/compiler.h>
  4. #include <linux/refcount.h>
  5. #include <linux/types.h>
  6. #include <asm/barrier.h>
  7. #include <stdbool.h>
  8. #include "auxtrace.h"
  9. #include "event.h"
  10. /**
  11. * struct perf_mmap - perf's ring buffer mmap details
  12. *
  13. * @refcnt - e.g. code using PERF_EVENT_IOC_SET_OUTPUT to share this
  14. */
  15. struct perf_mmap {
  16. void *base;
  17. int mask;
  18. int fd;
  19. refcount_t refcnt;
  20. u64 prev;
  21. u64 start;
  22. u64 end;
  23. bool overwrite;
  24. struct auxtrace_mmap auxtrace_mmap;
  25. char event_copy[PERF_SAMPLE_MAX_SIZE] __aligned(8);
  26. };
  27. /*
  28. * State machine of bkw_mmap_state:
  29. *
  30. * .________________(forbid)_____________.
  31. * | V
  32. * NOTREADY --(0)--> RUNNING --(1)--> DATA_PENDING --(2)--> EMPTY
  33. * ^ ^ | ^ |
  34. * | |__(forbid)____/ |___(forbid)___/|
  35. * | |
  36. * \_________________(3)_______________/
  37. *
  38. * NOTREADY : Backward ring buffers are not ready
  39. * RUNNING : Backward ring buffers are recording
  40. * DATA_PENDING : We are required to collect data from backward ring buffers
  41. * EMPTY : We have collected data from backward ring buffers.
  42. *
  43. * (0): Setup backward ring buffer
  44. * (1): Pause ring buffers for reading
  45. * (2): Read from ring buffers
  46. * (3): Resume ring buffers for recording
  47. */
  48. enum bkw_mmap_state {
  49. BKW_MMAP_NOTREADY,
  50. BKW_MMAP_RUNNING,
  51. BKW_MMAP_DATA_PENDING,
  52. BKW_MMAP_EMPTY,
  53. };
  54. struct mmap_params {
  55. int prot, mask;
  56. struct auxtrace_mmap_params auxtrace_mp;
  57. };
  58. int perf_mmap__mmap(struct perf_mmap *map, struct mmap_params *mp, int fd);
  59. void perf_mmap__munmap(struct perf_mmap *map);
  60. void perf_mmap__get(struct perf_mmap *map);
  61. void perf_mmap__put(struct perf_mmap *map);
  62. void perf_mmap__consume(struct perf_mmap *map);
  63. static inline u64 perf_mmap__read_head(struct perf_mmap *mm)
  64. {
  65. struct perf_event_mmap_page *pc = mm->base;
  66. u64 head = READ_ONCE(pc->data_head);
  67. rmb();
  68. return head;
  69. }
  70. static inline void perf_mmap__write_tail(struct perf_mmap *md, u64 tail)
  71. {
  72. struct perf_event_mmap_page *pc = md->base;
  73. /*
  74. * ensure all reads are done before we write the tail out.
  75. */
  76. mb();
  77. pc->data_tail = tail;
  78. }
  79. union perf_event *perf_mmap__read_forward(struct perf_mmap *map);
  80. union perf_event *perf_mmap__read_event(struct perf_mmap *map);
  81. int perf_mmap__push(struct perf_mmap *md, void *to,
  82. int push(void *to, void *buf, size_t size));
  83. size_t perf_mmap__mmap_len(struct perf_mmap *map);
  84. int perf_mmap__read_init(struct perf_mmap *md);
  85. void perf_mmap__read_done(struct perf_mmap *map);
  86. #endif /*__PERF_MMAP_H */