/* SPDX-License-Identifier: GPL-2.0 */ #ifndef _LINUX_SIMPLE_RING_BUFFER_H #define _LINUX_SIMPLE_RING_BUFFER_H #include #include #include #include /* * Ideally those struct would stay private but the caller needs to know * the allocation size for simple_ring_buffer_init(). */ struct simple_buffer_page { struct list_head link; struct buffer_data_page *page; u64 entries; u32 write; u32 id; }; struct simple_rb_per_cpu { struct simple_buffer_page *tail_page; struct simple_buffer_page *reader_page; struct simple_buffer_page *head_page; struct simple_buffer_page *bpages; struct trace_buffer_meta *meta; u32 nr_pages; #define SIMPLE_RB_UNAVAILABLE 0 #define SIMPLE_RB_READY 1 #define SIMPLE_RB_WRITING 2 u32 status; u64 last_overrun; u64 write_stamp; struct simple_rb_cbs *cbs; }; int simple_ring_buffer_init(struct simple_rb_per_cpu *cpu_buffer, struct simple_buffer_page *bpages, const struct ring_buffer_desc *desc); void simple_ring_buffer_unload(struct simple_rb_per_cpu *cpu_buffer); void *simple_ring_buffer_reserve(struct simple_rb_per_cpu *cpu_buffer, unsigned long length, u64 timestamp); void simple_ring_buffer_commit(struct simple_rb_per_cpu *cpu_buffer); int simple_ring_buffer_enable_tracing(struct simple_rb_per_cpu *cpu_buffer, bool enable); int simple_ring_buffer_reset(struct simple_rb_per_cpu *cpu_buffer); int simple_ring_buffer_swap_reader_page(struct simple_rb_per_cpu *cpu_buffer); int simple_ring_buffer_init_mm(struct simple_rb_per_cpu *cpu_buffer, struct simple_buffer_page *bpages, const struct ring_buffer_desc *desc, void *(*load_page)(unsigned long va), void (*unload_page)(void *va)); void simple_ring_buffer_unload_mm(struct simple_rb_per_cpu *cpu_buffer, void (*unload_page)(void *)); #endif