xref: /linux/include/linux/simple_ring_buffer.h (revision e4bf304f000e6fcceaf60b1455a5124b783b3a66)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _LINUX_SIMPLE_RING_BUFFER_H
3 #define _LINUX_SIMPLE_RING_BUFFER_H
4 
5 #include <linux/list.h>
6 #include <linux/ring_buffer.h>
7 #include <linux/ring_buffer_types.h>
8 #include <linux/types.h>
9 
10 /*
11  * Ideally those struct would stay private but the caller needs to know
12  * the allocation size for simple_ring_buffer_init().
13  */
14 struct simple_buffer_page {
15 	struct list_head	link;
16 	struct buffer_data_page	*page;
17 	u64			entries;
18 	u32			write;
19 	u32			id;
20 };
21 
22 struct simple_rb_per_cpu {
23 	struct simple_buffer_page	*tail_page;
24 	struct simple_buffer_page	*reader_page;
25 	struct simple_buffer_page	*head_page;
26 	struct simple_buffer_page	*bpages;
27 	struct trace_buffer_meta	*meta;
28 	u32				nr_pages;
29 
30 #define SIMPLE_RB_UNAVAILABLE	0
31 #define SIMPLE_RB_READY		1
32 #define SIMPLE_RB_WRITING	2
33 	u32				status;
34 
35 	u64				last_overrun;
36 	u64				write_stamp;
37 
38 	struct simple_rb_cbs		*cbs;
39 };
40 
41 int simple_ring_buffer_init(struct simple_rb_per_cpu *cpu_buffer, struct simple_buffer_page *bpages,
42 			    const struct ring_buffer_desc *desc);
43 
44 void simple_ring_buffer_unload(struct simple_rb_per_cpu *cpu_buffer);
45 
46 void *simple_ring_buffer_reserve(struct simple_rb_per_cpu *cpu_buffer, unsigned long length,
47 				 u64 timestamp);
48 
49 void simple_ring_buffer_commit(struct simple_rb_per_cpu *cpu_buffer);
50 
51 int simple_ring_buffer_enable_tracing(struct simple_rb_per_cpu *cpu_buffer, bool enable);
52 
53 int simple_ring_buffer_reset(struct simple_rb_per_cpu *cpu_buffer);
54 
55 int simple_ring_buffer_swap_reader_page(struct simple_rb_per_cpu *cpu_buffer);
56 
57 int simple_ring_buffer_init_mm(struct simple_rb_per_cpu *cpu_buffer,
58 			       struct simple_buffer_page *bpages,
59 			       const struct ring_buffer_desc *desc,
60 			       void *(*load_page)(unsigned long va),
61 			       void (*unload_page)(void *va));
62 
63 void simple_ring_buffer_unload_mm(struct simple_rb_per_cpu *cpu_buffer,
64 				  void (*unload_page)(void *));
65 #endif
66