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