#include <linux/version.h>
#include <linux/list.h>
#include <linux/kprobes.h>
+#include <linux/kref.h>
#include "wrapper/uuid.h"
#include "lttng-abi.h"
+#include "lttng-abi-old.h"
-#undef is_signed_type
-#define is_signed_type(type) (((type)(-1)) < 0)
+#define lttng_is_signed_type(type) (((type)(-1)) < 0)
struct lttng_channel;
struct lttng_session;
+struct lttng_metadata_cache;
struct lib_ring_buffer_ctx;
struct perf_event;
struct perf_event_attr;
+struct lib_ring_buffer_config;
/* Type description */
NR_STRING_ENCODINGS,
};
+enum channel_type {
+ PER_CPU_CHANNEL,
+ METADATA_CHANNEL,
+};
+
struct lttng_enum_entry {
unsigned long long start, end; /* start and end are inclusive */
const char *string;
{ \
.size = sizeof(_type) * CHAR_BIT, \
.alignment = lttng_alignof(_type) * CHAR_BIT, \
- .signedness = is_signed_type(_type), \
+ .signedness = lttng_is_signed_type(_type), \
.reverse_byte_order = _byte_order != __BYTE_ORDER, \
.base = _base, \
.encoding = lttng_encode_##_encoding, \
};
struct lttng_event_desc {
- const char *name;
+ const char *name; /* lttng-modules name */
+ const char *kname; /* Linux kernel name (tracepoints) */
void *probe_callback;
const struct lttng_event_ctx *ctx; /* context */
const struct lttng_event_field *fields; /* event payload */
const void *src, size_t len);
void (*event_memset)(struct lib_ring_buffer_ctx *ctx,
int c, size_t len);
+ void (*event_strcpy)(struct lib_ring_buffer_ctx *ctx, const char *src,
+ size_t len);
+ void (*event_strcpy_from_user)(struct lib_ring_buffer_ctx *ctx,
+ const char __user *src, size_t len);
/*
* packet_avail_size returns the available size in the current
* packet. Note that the size returned is only a hint, since it
wait_queue_head_t *(*get_hp_wait_queue)(struct channel *chan);
int (*is_finalized)(struct channel *chan);
int (*is_disabled)(struct channel *chan);
+ int (*timestamp_begin) (const struct lib_ring_buffer_config *config,
+ struct lib_ring_buffer *bufb,
+ uint64_t *timestamp_begin);
+ int (*timestamp_end) (const struct lib_ring_buffer_config *config,
+ struct lib_ring_buffer *bufb,
+ uint64_t *timestamp_end);
+ int (*events_discarded) (const struct lib_ring_buffer_config *config,
+ struct lib_ring_buffer *bufb,
+ uint64_t *events_discarded);
+ int (*content_size) (const struct lib_ring_buffer_config *config,
+ struct lib_ring_buffer *bufb,
+ uint64_t *content_size);
+ int (*packet_size) (const struct lib_ring_buffer_config *config,
+ struct lib_ring_buffer *bufb,
+ uint64_t *packet_size);
+ int (*stream_id) (const struct lib_ring_buffer_config *config,
+ struct lib_ring_buffer *bufb,
+ uint64_t *stream_id);
+ int (*current_timestamp) (const struct lib_ring_buffer_config *config,
+ struct lib_ring_buffer *bufb,
+ uint64_t *ts);
};
struct lttng_transport {
struct lttng_event *sc_compat_unknown;
struct lttng_event *sc_exit; /* for syscall exit */
int header_type; /* 0: unset, 1: compact, 2: large */
+ enum channel_type channel_type;
unsigned int metadata_dumped:1;
};
+struct lttng_metadata_stream {
+ void *priv; /* Ring buffer private data */
+ struct lttng_metadata_cache *metadata_cache;
+ unsigned int metadata_in; /* Bytes read from the cache */
+ unsigned int metadata_out; /* Bytes consumed from stream */
+ int finalized; /* Has channel been finalized */
+ wait_queue_head_t read_wait; /* Reader buffer-level wait queue */
+ struct list_head list; /* Stream list */
+ struct lttng_transport *transport;
+};
+
struct lttng_session {
int active; /* Is trace session active ? */
int been_active; /* Has trace session been active ? */
struct file *file; /* File associated to session */
- struct lttng_channel *metadata; /* Metadata channel */
struct list_head chan; /* Channel list head */
struct list_head events; /* Event list head */
struct list_head list; /* Session list */
unsigned int free_chan_id; /* Next chan ID to allocate */
uuid_le uuid; /* Trace session unique ID */
+ struct lttng_metadata_cache *metadata_cache;
unsigned int metadata_dumped:1;
};
+struct lttng_metadata_cache {
+ char *data; /* Metadata cache */
+ unsigned int cache_alloc; /* Metadata allocated size (bytes) */
+ unsigned int metadata_written; /* Number of bytes written in metadata cache */
+ struct kref refcount; /* Metadata cache usage */
+ struct list_head metadata_stream; /* Metadata stream list */
+};
+
struct lttng_session *lttng_session_create(void);
int lttng_session_enable(struct lttng_session *session);
int lttng_session_disable(struct lttng_session *session);
void lttng_session_destroy(struct lttng_session *session);
+void metadata_cache_destroy(struct kref *kref);
struct lttng_channel *lttng_channel_create(struct lttng_session *session,
const char *transport_name,
void *buf_addr,
size_t subbuf_size, size_t num_subbuf,
unsigned int switch_timer_interval,
- unsigned int read_timer_interval);
+ unsigned int read_timer_interval,
+ enum channel_type channel_type);
struct lttng_channel *lttng_global_channel_create(struct lttng_session *session,
int overwrite, void *buf_addr,
size_t subbuf_size, size_t num_subbuf,
unsigned int switch_timer_interval,
unsigned int read_timer_interval);
+void lttng_metadata_channel_destroy(struct lttng_channel *chan);
struct lttng_event *lttng_event_create(struct lttng_channel *chan,
struct lttng_kernel_event *event_param,
void *filter,
const struct lttng_event_desc *internal_desc);
+struct lttng_event *lttng_event_compat_old_create(struct lttng_channel *chan,
+ struct lttng_kernel_old_event *old_event_param,
+ void *filter,
+ const struct lttng_event_desc *internal_desc);
int lttng_channel_enable(struct lttng_channel *channel);
int lttng_channel_disable(struct lttng_channel *channel);
void synchronize_trace(void);
int lttng_abi_init(void);
+int lttng_abi_compat_old_init(void);
void lttng_abi_exit(void);
+void lttng_abi_compat_old_exit(void);
int lttng_probe_register(struct lttng_probe_desc *desc);
void lttng_probe_unregister(struct lttng_probe_desc *desc);
int lttng_probes_init(void);
void lttng_probes_exit(void);
+int lttng_metadata_output_channel(struct lttng_metadata_stream *stream,
+ struct channel *chan);
+
#if defined(CONFIG_HAVE_SYSCALL_TRACEPOINTS)
int lttng_syscalls_register(struct lttng_channel *chan, void *filter);
int lttng_syscalls_unregister(struct lttng_channel *chan);