linux/include/linux/ring_buffer.h
<<
>>
Prefs
   1#ifndef _LINUX_RING_BUFFER_H
   2#define _LINUX_RING_BUFFER_H
   3
   4#include <linux/mm.h>
   5#include <linux/seq_file.h>
   6
   7struct ring_buffer;
   8struct ring_buffer_iter;
   9
  10/*
  11 * Don't reference this struct directly, use functions below.
  12 */
  13struct ring_buffer_event {
  14        u32             type:2, len:3, time_delta:27;
  15        u32             array[];
  16};
  17
  18/**
  19 * enum ring_buffer_type - internal ring buffer types
  20 *
  21 * @RINGBUF_TYPE_PADDING:       Left over page padding
  22 *                               array is ignored
  23 *                               size is variable depending on how much
  24 *                                padding is needed
  25 *
  26 * @RINGBUF_TYPE_TIME_EXTEND:   Extend the time delta
  27 *                               array[0] = time delta (28 .. 59)
  28 *                               size = 8 bytes
  29 *
  30 * @RINGBUF_TYPE_TIME_STAMP:    Sync time stamp with external clock
  31 *                               array[0]    = tv_nsec
  32 *                               array[1..2] = tv_sec
  33 *                               size = 16 bytes
  34 *
  35 * @RINGBUF_TYPE_DATA:          Data record
  36 *                               If len is zero:
  37 *                                array[0] holds the actual length
  38 *                                array[1..(length+3)/4] holds data
  39 *                                size = 4 + 4 + length (bytes)
  40 *                               else
  41 *                                length = len << 2
  42 *                                array[0..(length+3)/4-1] holds data
  43 *                                size = 4 + length (bytes)
  44 */
  45enum ring_buffer_type {
  46        RINGBUF_TYPE_PADDING,
  47        RINGBUF_TYPE_TIME_EXTEND,
  48        /* FIXME: RINGBUF_TYPE_TIME_STAMP not implemented */
  49        RINGBUF_TYPE_TIME_STAMP,
  50        RINGBUF_TYPE_DATA,
  51};
  52
  53unsigned ring_buffer_event_length(struct ring_buffer_event *event);
  54void *ring_buffer_event_data(struct ring_buffer_event *event);
  55
  56/**
  57 * ring_buffer_event_time_delta - return the delta timestamp of the event
  58 * @event: the event to get the delta timestamp of
  59 *
  60 * The delta timestamp is the 27 bit timestamp since the last event.
  61 */
  62static inline unsigned
  63ring_buffer_event_time_delta(struct ring_buffer_event *event)
  64{
  65        return event->time_delta;
  66}
  67
  68/*
  69 * size is in bytes for each per CPU buffer.
  70 */
  71struct ring_buffer *
  72ring_buffer_alloc(unsigned long size, unsigned flags);
  73void ring_buffer_free(struct ring_buffer *buffer);
  74
  75int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size);
  76
  77struct ring_buffer_event *
  78ring_buffer_lock_reserve(struct ring_buffer *buffer,
  79                         unsigned long length,
  80                         unsigned long *flags);
  81int ring_buffer_unlock_commit(struct ring_buffer *buffer,
  82                              struct ring_buffer_event *event,
  83                              unsigned long flags);
  84int ring_buffer_write(struct ring_buffer *buffer,
  85                      unsigned long length, void *data);
  86
  87struct ring_buffer_event *
  88ring_buffer_peek(struct ring_buffer *buffer, int cpu, u64 *ts);
  89struct ring_buffer_event *
  90ring_buffer_consume(struct ring_buffer *buffer, int cpu, u64 *ts);
  91
  92struct ring_buffer_iter *
  93ring_buffer_read_start(struct ring_buffer *buffer, int cpu);
  94void ring_buffer_read_finish(struct ring_buffer_iter *iter);
  95
  96struct ring_buffer_event *
  97ring_buffer_iter_peek(struct ring_buffer_iter *iter, u64 *ts);
  98struct ring_buffer_event *
  99ring_buffer_read(struct ring_buffer_iter *iter, u64 *ts);
 100void ring_buffer_iter_reset(struct ring_buffer_iter *iter);
 101int ring_buffer_iter_empty(struct ring_buffer_iter *iter);
 102
 103unsigned long ring_buffer_size(struct ring_buffer *buffer);
 104
 105void ring_buffer_reset_cpu(struct ring_buffer *buffer, int cpu);
 106void ring_buffer_reset(struct ring_buffer *buffer);
 107
 108int ring_buffer_swap_cpu(struct ring_buffer *buffer_a,
 109                         struct ring_buffer *buffer_b, int cpu);
 110
 111int ring_buffer_empty(struct ring_buffer *buffer);
 112int ring_buffer_empty_cpu(struct ring_buffer *buffer, int cpu);
 113
 114void ring_buffer_record_disable(struct ring_buffer *buffer);
 115void ring_buffer_record_enable(struct ring_buffer *buffer);
 116void ring_buffer_record_disable_cpu(struct ring_buffer *buffer, int cpu);
 117void ring_buffer_record_enable_cpu(struct ring_buffer *buffer, int cpu);
 118
 119unsigned long ring_buffer_entries(struct ring_buffer *buffer);
 120unsigned long ring_buffer_overruns(struct ring_buffer *buffer);
 121unsigned long ring_buffer_entries_cpu(struct ring_buffer *buffer, int cpu);
 122unsigned long ring_buffer_overrun_cpu(struct ring_buffer *buffer, int cpu);
 123
 124u64 ring_buffer_time_stamp(int cpu);
 125void ring_buffer_normalize_time_stamp(int cpu, u64 *ts);
 126
 127void tracing_on(void);
 128void tracing_off(void);
 129void tracing_off_permanent(void);
 130
 131void *ring_buffer_alloc_read_page(struct ring_buffer *buffer);
 132void ring_buffer_free_read_page(struct ring_buffer *buffer, void *data);
 133int ring_buffer_read_page(struct ring_buffer *buffer,
 134                          void **data_page, int cpu, int full);
 135
 136enum ring_buffer_flags {
 137        RB_FL_OVERWRITE         = 1 << 0,
 138};
 139
 140#endif /* _LINUX_RING_BUFFER_H */
 141
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.