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