0001
0002 #ifndef _LINUX_RING_BUFFER_H
0003 #define _LINUX_RING_BUFFER_H
0004
0005 #include <linux/mm.h>
0006 #include <linux/seq_file.h>
0007 #include <linux/poll.h>
0008
0009 struct trace_buffer;
0010 struct ring_buffer_iter;
0011
0012
0013
0014
0015 struct ring_buffer_event {
0016 u32 type_len:5, time_delta:27;
0017
0018 u32 array[];
0019 };
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055 enum ring_buffer_type {
0056 RINGBUF_TYPE_DATA_TYPE_LEN_MAX = 28,
0057 RINGBUF_TYPE_PADDING,
0058 RINGBUF_TYPE_TIME_EXTEND,
0059 RINGBUF_TYPE_TIME_STAMP,
0060 };
0061
0062 unsigned ring_buffer_event_length(struct ring_buffer_event *event);
0063 void *ring_buffer_event_data(struct ring_buffer_event *event);
0064 u64 ring_buffer_event_time_stamp(struct trace_buffer *buffer,
0065 struct ring_buffer_event *event);
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081 void ring_buffer_discard_commit(struct trace_buffer *buffer,
0082 struct ring_buffer_event *event);
0083
0084
0085
0086
0087 struct trace_buffer *
0088 __ring_buffer_alloc(unsigned long size, unsigned flags, struct lock_class_key *key);
0089
0090
0091
0092
0093
0094
0095 #define ring_buffer_alloc(size, flags) \
0096 ({ \
0097 static struct lock_class_key __key; \
0098 __ring_buffer_alloc((size), (flags), &__key); \
0099 })
0100
0101 int ring_buffer_wait(struct trace_buffer *buffer, int cpu, int full);
0102 __poll_t ring_buffer_poll_wait(struct trace_buffer *buffer, int cpu,
0103 struct file *filp, poll_table *poll_table);
0104
0105
0106 #define RING_BUFFER_ALL_CPUS -1
0107
0108 void ring_buffer_free(struct trace_buffer *buffer);
0109
0110 int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size, int cpu);
0111
0112 void ring_buffer_change_overwrite(struct trace_buffer *buffer, int val);
0113
0114 struct ring_buffer_event *ring_buffer_lock_reserve(struct trace_buffer *buffer,
0115 unsigned long length);
0116 int ring_buffer_unlock_commit(struct trace_buffer *buffer,
0117 struct ring_buffer_event *event);
0118 int ring_buffer_write(struct trace_buffer *buffer,
0119 unsigned long length, void *data);
0120
0121 void ring_buffer_nest_start(struct trace_buffer *buffer);
0122 void ring_buffer_nest_end(struct trace_buffer *buffer);
0123
0124 struct ring_buffer_event *
0125 ring_buffer_peek(struct trace_buffer *buffer, int cpu, u64 *ts,
0126 unsigned long *lost_events);
0127 struct ring_buffer_event *
0128 ring_buffer_consume(struct trace_buffer *buffer, int cpu, u64 *ts,
0129 unsigned long *lost_events);
0130
0131 struct ring_buffer_iter *
0132 ring_buffer_read_prepare(struct trace_buffer *buffer, int cpu, gfp_t flags);
0133 void ring_buffer_read_prepare_sync(void);
0134 void ring_buffer_read_start(struct ring_buffer_iter *iter);
0135 void ring_buffer_read_finish(struct ring_buffer_iter *iter);
0136
0137 struct ring_buffer_event *
0138 ring_buffer_iter_peek(struct ring_buffer_iter *iter, u64 *ts);
0139 void ring_buffer_iter_advance(struct ring_buffer_iter *iter);
0140 void ring_buffer_iter_reset(struct ring_buffer_iter *iter);
0141 int ring_buffer_iter_empty(struct ring_buffer_iter *iter);
0142 bool ring_buffer_iter_dropped(struct ring_buffer_iter *iter);
0143
0144 unsigned long ring_buffer_size(struct trace_buffer *buffer, int cpu);
0145
0146 void ring_buffer_reset_cpu(struct trace_buffer *buffer, int cpu);
0147 void ring_buffer_reset_online_cpus(struct trace_buffer *buffer);
0148 void ring_buffer_reset(struct trace_buffer *buffer);
0149
0150 #ifdef CONFIG_RING_BUFFER_ALLOW_SWAP
0151 int ring_buffer_swap_cpu(struct trace_buffer *buffer_a,
0152 struct trace_buffer *buffer_b, int cpu);
0153 #else
0154 static inline int
0155 ring_buffer_swap_cpu(struct trace_buffer *buffer_a,
0156 struct trace_buffer *buffer_b, int cpu)
0157 {
0158 return -ENODEV;
0159 }
0160 #endif
0161
0162 bool ring_buffer_empty(struct trace_buffer *buffer);
0163 bool ring_buffer_empty_cpu(struct trace_buffer *buffer, int cpu);
0164
0165 void ring_buffer_record_disable(struct trace_buffer *buffer);
0166 void ring_buffer_record_enable(struct trace_buffer *buffer);
0167 void ring_buffer_record_off(struct trace_buffer *buffer);
0168 void ring_buffer_record_on(struct trace_buffer *buffer);
0169 bool ring_buffer_record_is_on(struct trace_buffer *buffer);
0170 bool ring_buffer_record_is_set_on(struct trace_buffer *buffer);
0171 void ring_buffer_record_disable_cpu(struct trace_buffer *buffer, int cpu);
0172 void ring_buffer_record_enable_cpu(struct trace_buffer *buffer, int cpu);
0173
0174 u64 ring_buffer_oldest_event_ts(struct trace_buffer *buffer, int cpu);
0175 unsigned long ring_buffer_bytes_cpu(struct trace_buffer *buffer, int cpu);
0176 unsigned long ring_buffer_entries(struct trace_buffer *buffer);
0177 unsigned long ring_buffer_overruns(struct trace_buffer *buffer);
0178 unsigned long ring_buffer_entries_cpu(struct trace_buffer *buffer, int cpu);
0179 unsigned long ring_buffer_overrun_cpu(struct trace_buffer *buffer, int cpu);
0180 unsigned long ring_buffer_commit_overrun_cpu(struct trace_buffer *buffer, int cpu);
0181 unsigned long ring_buffer_dropped_events_cpu(struct trace_buffer *buffer, int cpu);
0182 unsigned long ring_buffer_read_events_cpu(struct trace_buffer *buffer, int cpu);
0183
0184 u64 ring_buffer_time_stamp(struct trace_buffer *buffer);
0185 void ring_buffer_normalize_time_stamp(struct trace_buffer *buffer,
0186 int cpu, u64 *ts);
0187 void ring_buffer_set_clock(struct trace_buffer *buffer,
0188 u64 (*clock)(void));
0189 void ring_buffer_set_time_stamp_abs(struct trace_buffer *buffer, bool abs);
0190 bool ring_buffer_time_stamp_abs(struct trace_buffer *buffer);
0191
0192 size_t ring_buffer_nr_pages(struct trace_buffer *buffer, int cpu);
0193 size_t ring_buffer_nr_dirty_pages(struct trace_buffer *buffer, int cpu);
0194
0195 void *ring_buffer_alloc_read_page(struct trace_buffer *buffer, int cpu);
0196 void ring_buffer_free_read_page(struct trace_buffer *buffer, int cpu, void *data);
0197 int ring_buffer_read_page(struct trace_buffer *buffer, void **data_page,
0198 size_t len, int cpu, int full);
0199
0200 struct trace_seq;
0201
0202 int ring_buffer_print_entry_header(struct trace_seq *s);
0203 int ring_buffer_print_page_header(struct trace_seq *s);
0204
0205 enum ring_buffer_flags {
0206 RB_FL_OVERWRITE = 1 << 0,
0207 };
0208
0209 #ifdef CONFIG_RING_BUFFER
0210 int trace_rb_cpu_prepare(unsigned int cpu, struct hlist_node *node);
0211 #else
0212 #define trace_rb_cpu_prepare NULL
0213 #endif
0214
0215 #endif