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 | |