Blame view
include/linux/ring_buffer.h
5.83 KB
7a8e76a38
|
1 2 |
#ifndef _LINUX_RING_BUFFER_H #define _LINUX_RING_BUFFER_H |
1744a21d5
|
3 |
#include <linux/kmemcheck.h> |
7a8e76a38
|
4 5 6 7 8 9 10 |
#include <linux/mm.h> #include <linux/seq_file.h> struct ring_buffer; struct ring_buffer_iter; /* |
c3706f005
|
11 |
* Don't refer to this struct directly, use functions below. |
7a8e76a38
|
12 13 |
*/ struct ring_buffer_event { |
1744a21d5
|
14 |
kmemcheck_bitfield_begin(bitfield); |
334d4169a
|
15 |
u32 type_len:5, time_delta:27; |
1744a21d5
|
16 |
kmemcheck_bitfield_end(bitfield); |
7a8e76a38
|
17 18 19 20 21 22 |
u32 array[]; }; /** * enum ring_buffer_type - internal ring buffer types * |
2d622719f
|
23 24 25 26 |
* @RINGBUF_TYPE_PADDING: Left over page padding or discarded event * If time_delta is 0: * array is ignored * size is variable depending on how much |
7a8e76a38
|
27 |
* padding is needed |
2d622719f
|
28 |
* If time_delta is non zero: |
334d4169a
|
29 30 |
* array[0] holds the actual length * size = 4 + length (bytes) |
7a8e76a38
|
31 32 33 34 35 36 |
* * @RINGBUF_TYPE_TIME_EXTEND: Extend the time delta * array[0] = time delta (28 .. 59) * size = 8 bytes * * @RINGBUF_TYPE_TIME_STAMP: Sync time stamp with external clock |
361b73d5c
|
37 38 |
* array[0] = tv_nsec * array[1..2] = tv_sec |
7a8e76a38
|
39 40 |
* size = 16 bytes * |
334d4169a
|
41 42 43 |
* <= @RINGBUF_TYPE_DATA_TYPE_LEN_MAX: * Data record * If type_len is zero: |
7a8e76a38
|
44 |
* array[0] holds the actual length |
361b73d5c
|
45 |
* array[1..(length+3)/4] holds data |
334d4169a
|
46 |
* size = 4 + length (bytes) |
7a8e76a38
|
47 |
* else |
334d4169a
|
48 |
* length = type_len << 2 |
361b73d5c
|
49 50 |
* array[0..(length+3)/4-1] holds data * size = 4 + length (bytes) |
7a8e76a38
|
51 52 |
*/ enum ring_buffer_type { |
334d4169a
|
53 |
RINGBUF_TYPE_DATA_TYPE_LEN_MAX = 28, |
7a8e76a38
|
54 55 56 57 |
RINGBUF_TYPE_PADDING, RINGBUF_TYPE_TIME_EXTEND, /* FIXME: RINGBUF_TYPE_TIME_STAMP not implemented */ RINGBUF_TYPE_TIME_STAMP, |
7a8e76a38
|
58 59 60 61 |
}; unsigned ring_buffer_event_length(struct ring_buffer_event *event); void *ring_buffer_event_data(struct ring_buffer_event *event); |
fa1b47dd8
|
62 |
/* |
fa1b47dd8
|
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
* ring_buffer_discard_commit will remove an event that has not * ben committed yet. If this is used, then ring_buffer_unlock_commit * must not be called on the discarded event. This function * will try to remove the event from the ring buffer completely * if another event has not been written after it. * * Example use: * * if (some_condition) * ring_buffer_discard_commit(buffer, event); * else * ring_buffer_unlock_commit(buffer, event); */ void ring_buffer_discard_commit(struct ring_buffer *buffer, struct ring_buffer_event *event); /* |
7a8e76a38
|
80 81 82 |
* size is in bytes for each per CPU buffer. */ struct ring_buffer * |
1f8a6a10f
|
83 84 85 86 87 88 89 90 91 92 93 94 |
__ring_buffer_alloc(unsigned long size, unsigned flags, struct lock_class_key *key); /* * Because the ring buffer is generic, if other users of the ring buffer get * traced by ftrace, it can produce lockdep warnings. We need to keep each * ring buffer's lock class separate. */ #define ring_buffer_alloc(size, flags) \ ({ \ static struct lock_class_key __key; \ __ring_buffer_alloc((size), (flags), &__key); \ }) |
7a8e76a38
|
95 96 97 |
void ring_buffer_free(struct ring_buffer *buffer); int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size); |
0a9877514
|
98 99 |
struct ring_buffer_event *ring_buffer_lock_reserve(struct ring_buffer *buffer, unsigned long length); |
7a8e76a38
|
100 |
int ring_buffer_unlock_commit(struct ring_buffer *buffer, |
0a9877514
|
101 |
struct ring_buffer_event *event); |
7a8e76a38
|
102 103 104 105 |
int ring_buffer_write(struct ring_buffer *buffer, unsigned long length, void *data); struct ring_buffer_event * |
66a8cb95e
|
106 107 |
ring_buffer_peek(struct ring_buffer *buffer, int cpu, u64 *ts, unsigned long *lost_events); |
7a8e76a38
|
108 |
struct ring_buffer_event * |
66a8cb95e
|
109 110 |
ring_buffer_consume(struct ring_buffer *buffer, int cpu, u64 *ts, unsigned long *lost_events); |
7a8e76a38
|
111 112 |
struct ring_buffer_iter * |
72c9ddfd4
|
113 114 115 |
ring_buffer_read_prepare(struct ring_buffer *buffer, int cpu); void ring_buffer_read_prepare_sync(void); void ring_buffer_read_start(struct ring_buffer_iter *iter); |
7a8e76a38
|
116 117 118 119 120 121 122 123 124 125 126 127 128 |
void ring_buffer_read_finish(struct ring_buffer_iter *iter); struct ring_buffer_event * ring_buffer_iter_peek(struct ring_buffer_iter *iter, u64 *ts); struct ring_buffer_event * ring_buffer_read(struct ring_buffer_iter *iter, u64 *ts); void ring_buffer_iter_reset(struct ring_buffer_iter *iter); int ring_buffer_iter_empty(struct ring_buffer_iter *iter); unsigned long ring_buffer_size(struct ring_buffer *buffer); void ring_buffer_reset_cpu(struct ring_buffer *buffer, int cpu); void ring_buffer_reset(struct ring_buffer *buffer); |
85bac32c4
|
129 |
#ifdef CONFIG_RING_BUFFER_ALLOW_SWAP |
7a8e76a38
|
130 131 |
int ring_buffer_swap_cpu(struct ring_buffer *buffer_a, struct ring_buffer *buffer_b, int cpu); |
85bac32c4
|
132 133 134 135 136 137 138 139 |
#else static inline int ring_buffer_swap_cpu(struct ring_buffer *buffer_a, struct ring_buffer *buffer_b, int cpu) { return -ENODEV; } #endif |
7a8e76a38
|
140 141 142 143 144 145 146 147 148 149 150 |
int ring_buffer_empty(struct ring_buffer *buffer); int ring_buffer_empty_cpu(struct ring_buffer *buffer, int cpu); void ring_buffer_record_disable(struct ring_buffer *buffer); void ring_buffer_record_enable(struct ring_buffer *buffer); void ring_buffer_record_disable_cpu(struct ring_buffer *buffer, int cpu); void ring_buffer_record_enable_cpu(struct ring_buffer *buffer, int cpu); unsigned long ring_buffer_entries(struct ring_buffer *buffer); unsigned long ring_buffer_overruns(struct ring_buffer *buffer); |
e09373f22
|
151 152 |
unsigned long ring_buffer_entries_cpu(struct ring_buffer *buffer, int cpu); unsigned long ring_buffer_overrun_cpu(struct ring_buffer *buffer, int cpu); |
f0d2c681a
|
153 |
unsigned long ring_buffer_commit_overrun_cpu(struct ring_buffer *buffer, int cpu); |
7a8e76a38
|
154 |
|
37886f6a9
|
155 156 157 158 159 |
u64 ring_buffer_time_stamp(struct ring_buffer *buffer, int cpu); void ring_buffer_normalize_time_stamp(struct ring_buffer *buffer, int cpu, u64 *ts); void ring_buffer_set_clock(struct ring_buffer *buffer, u64 (*clock)(void)); |
7a8e76a38
|
160 |
|
ef7a4a161
|
161 |
size_t ring_buffer_page_len(void *page); |
8789a9e7d
|
162 163 |
void *ring_buffer_alloc_read_page(struct ring_buffer *buffer); void ring_buffer_free_read_page(struct ring_buffer *buffer, void *data); |
ef7a4a161
|
164 165 |
int ring_buffer_read_page(struct ring_buffer *buffer, void **data_page, size_t len, int cpu, int full); |
8789a9e7d
|
166 |
|
d1b182a8d
|
167 168 169 170 |
struct trace_seq; int ring_buffer_print_entry_header(struct trace_seq *s); int ring_buffer_print_page_header(struct trace_seq *s); |
7a8e76a38
|
171 172 173 174 175 |
enum ring_buffer_flags { RB_FL_OVERWRITE = 1 << 0, }; #endif /* _LINUX_RING_BUFFER_H */ |