1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __ORDERED_EVENTS_H 3 #define __ORDERED_EVENTS_H 4 5 #include <linux/types.h> 6 7 struct perf_sample; 8 9 struct ordered_event { 10 u64 timestamp; 11 u64 file_offset; 12 const char *file_path; 13 union perf_event *event; 14 struct list_head list; 15 }; 16 17 enum oe_flush { 18 OE_FLUSH__NONE, 19 OE_FLUSH__FINAL, 20 OE_FLUSH__ROUND, 21 OE_FLUSH__HALF, 22 OE_FLUSH__TOP, 23 OE_FLUSH__TIME, 24 }; 25 26 struct ordered_events; 27 28 typedef int (*ordered_events__deliver_t)(struct ordered_events *oe, 29 struct ordered_event *event); 30 31 struct ordered_events_buffer { 32 struct list_head list; 33 struct ordered_event event[]; 34 }; 35 36 struct ordered_events { 37 u64 last_flush; 38 u64 next_flush; 39 u64 max_timestamp; 40 u64 max_alloc_size; 41 u64 cur_alloc_size; 42 struct list_head events; 43 struct list_head cache; 44 struct list_head to_free; 45 struct ordered_events_buffer *buffer; 46 struct ordered_event *last; 47 ordered_events__deliver_t deliver; 48 int buffer_idx; 49 unsigned int nr_events; 50 enum oe_flush last_flush_type; 51 u32 nr_unordered_events; 52 bool copy_on_queue; 53 void *data; 54 }; 55 56 int ordered_events__queue(struct ordered_events *oe, union perf_event *event, 57 u64 timestamp, u64 file_offset, const char *file_path); 58 void ordered_events__delete(struct ordered_events *oe, struct ordered_event *event); 59 int ordered_events__flush(struct ordered_events *oe, enum oe_flush how); 60 int ordered_events__flush_time(struct ordered_events *oe, u64 timestamp); 61 void ordered_events__init(struct ordered_events *oe, ordered_events__deliver_t deliver, 62 void *data); 63 void ordered_events__free(struct ordered_events *oe); 64 void ordered_events__reinit(struct ordered_events *oe); 65 u64 ordered_events__first_time(struct ordered_events *oe); 66 67 static inline 68 void ordered_events__set_alloc_size(struct ordered_events *oe, u64 size) 69 { 70 oe->max_alloc_size = size; 71 } 72 73 static inline 74 void ordered_events__set_copy_on_queue(struct ordered_events *oe, bool copy) 75 { 76 oe->copy_on_queue = copy; 77 } 78 79 static inline u64 ordered_events__last_flush_time(struct ordered_events *oe) 80 { 81 return oe->last_flush; 82 } 83 84 #endif /* __ORDERED_EVENTS_H */ 85