root/include/linux/simple_ring_buffer.h
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _LINUX_SIMPLE_RING_BUFFER_H
#define _LINUX_SIMPLE_RING_BUFFER_H

#include <linux/list.h>
#include <linux/ring_buffer.h>
#include <linux/ring_buffer_types.h>
#include <linux/types.h>

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