ring_buffer.h 5.7 KB
Newer Older
S
Steven Rostedt 已提交
1 2 3 4 5 6 7 8 9 10
#ifndef _LINUX_RING_BUFFER_H
#define _LINUX_RING_BUFFER_H

#include <linux/mm.h>
#include <linux/seq_file.h>

struct ring_buffer;
struct ring_buffer_iter;

/*
W
Wenji Huang 已提交
11
 * Don't refer to this struct directly, use functions below.
S
Steven Rostedt 已提交
12 13 14 15 16 17 18 19 20
 */
struct ring_buffer_event {
	u32		type:2, len:3, time_delta:27;
	u32		array[];
};

/**
 * enum ring_buffer_type - internal ring buffer types
 *
21 22 23 24
 * @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
S
Steven Rostedt 已提交
25
 *				  padding is needed
26 27
 *				 If time_delta is non zero:
 *				  everything else same as RINGBUF_TYPE_DATA
S
Steven Rostedt 已提交
28 29 30 31 32 33
 *
 * @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
L
Lai Jiangshan 已提交
34 35
 *				 array[0]    = tv_nsec
 *				 array[1..2] = tv_sec
S
Steven Rostedt 已提交
36 37 38 39 40
 *				 size = 16 bytes
 *
 * @RINGBUF_TYPE_DATA:		Data record
 *				 If len is zero:
 *				  array[0] holds the actual length
L
Lai Jiangshan 已提交
41 42
 *				  array[1..(length+3)/4] holds data
 *				  size = 4 + 4 + length (bytes)
S
Steven Rostedt 已提交
43 44
 *				 else
 *				  length = len << 2
L
Lai Jiangshan 已提交
45 46
 *				  array[0..(length+3)/4-1] holds data
 *				  size = 4 + length (bytes)
S
Steven Rostedt 已提交
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
 */
enum ring_buffer_type {
	RINGBUF_TYPE_PADDING,
	RINGBUF_TYPE_TIME_EXTEND,
	/* FIXME: RINGBUF_TYPE_TIME_STAMP not implemented */
	RINGBUF_TYPE_TIME_STAMP,
	RINGBUF_TYPE_DATA,
};

unsigned ring_buffer_event_length(struct ring_buffer_event *event);
void *ring_buffer_event_data(struct ring_buffer_event *event);

/**
 * ring_buffer_event_time_delta - return the delta timestamp of the event
 * @event: the event to get the delta timestamp of
 *
 * The delta timestamp is the 27 bit timestamp since the last event.
 */
static inline unsigned
ring_buffer_event_time_delta(struct ring_buffer_event *event)
{
	return event->time_delta;
}

71 72 73 74 75 76 77 78 79 80 81 82
/*
 * ring_buffer_event_discard can discard any event in the ring buffer.
 *   it is up to the caller to protect against a reader from
 *   consuming it or a writer from wrapping and replacing it.
 *
 * No external protection is needed if this is called before
 * the event is commited. But in that case it would be better to
 * use ring_buffer_discard_commit.
 *
 * Note, if an event that has not been committed is discarded
 * with ring_buffer_event_discard, it must still be committed.
 */
83 84
void ring_buffer_event_discard(struct ring_buffer_event *event);

85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
/*
 * 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);

S
Steven Rostedt 已提交
102 103 104 105 106 107 108 109 110
/*
 * size is in bytes for each per CPU buffer.
 */
struct ring_buffer *
ring_buffer_alloc(unsigned long size, unsigned flags);
void ring_buffer_free(struct ring_buffer *buffer);

int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size);

111 112
struct ring_buffer_event *ring_buffer_lock_reserve(struct ring_buffer *buffer,
						   unsigned long length);
S
Steven Rostedt 已提交
113
int ring_buffer_unlock_commit(struct ring_buffer *buffer,
114
			      struct ring_buffer_event *event);
S
Steven Rostedt 已提交
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
int ring_buffer_write(struct ring_buffer *buffer,
		      unsigned long length, void *data);

struct ring_buffer_event *
ring_buffer_peek(struct ring_buffer *buffer, int cpu, u64 *ts);
struct ring_buffer_event *
ring_buffer_consume(struct ring_buffer *buffer, int cpu, u64 *ts);

struct ring_buffer_iter *
ring_buffer_read_start(struct ring_buffer *buffer, int cpu);
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);

int ring_buffer_swap_cpu(struct ring_buffer *buffer_a,
			 struct ring_buffer *buffer_b, int cpu);

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);
152 153
unsigned long ring_buffer_entries_cpu(struct ring_buffer *buffer, int cpu);
unsigned long ring_buffer_overrun_cpu(struct ring_buffer *buffer, int cpu);
S
Steven Rostedt 已提交
154

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));
S
Steven Rostedt 已提交
160

161 162 163
size_t ring_buffer_page_len(void *page);


S
Steven Rostedt 已提交
164 165
void *ring_buffer_alloc_read_page(struct ring_buffer *buffer);
void ring_buffer_free_read_page(struct ring_buffer *buffer, void *data);
166 167
int ring_buffer_read_page(struct ring_buffer *buffer, void **data_page,
			  size_t len, int cpu, int full);
S
Steven Rostedt 已提交
168

169 170 171 172 173
struct trace_seq;

int ring_buffer_print_entry_header(struct trace_seq *s);
int ring_buffer_print_page_header(struct trace_seq *s);

S
Steven Rostedt 已提交
174 175 176 177 178
enum ring_buffer_flags {
	RB_FL_OVERWRITE		= 1 << 0,
};

#endif /* _LINUX_RING_BUFFER_H */