X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=lttng-events.h;h=118ea3b0db52d82e6072e17aa901c1850e22e43c;hb=7cb18afaf252ce42658beb6d38b9a1fed2395a28;hp=af5aa65be8fe0edcf0b519cca3466f9113583613;hpb=3a523f5b6b4f8ca82412cb45f2d2ad9c44e7d249;p=lttng-modules.git diff --git a/lttng-events.h b/lttng-events.h index af5aa65b..118ea3b0 100644 --- a/lttng-events.h +++ b/lttng-events.h @@ -26,17 +26,20 @@ #include #include #include +#include #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 */ @@ -58,6 +61,11 @@ enum lttng_string_encodings { 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; @@ -70,7 +78,7 @@ struct lttng_enum_entry { { \ .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, \ @@ -159,10 +167,12 @@ struct lttng_ctx { struct lttng_ctx_field *fields; unsigned int nr_fields; unsigned int allocated_fields; + size_t largest_align; /* in bytes */ }; 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 */ @@ -227,6 +237,10 @@ struct lttng_channel_ops { 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 @@ -237,6 +251,27 @@ struct lttng_channel_ops { 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 { @@ -246,6 +281,8 @@ struct lttng_transport { struct lttng_channel_ops ops; }; +struct lttng_syscall_filter; + struct lttng_channel { unsigned int id; struct channel *chan; /* Channel buffers */ @@ -260,47 +297,83 @@ struct lttng_channel { struct lttng_transport *transport; struct lttng_event **sc_table; /* for syscall tracing */ struct lttng_event **compat_sc_table; + struct lttng_event **sc_exit_table; /* for syscall exit tracing */ + struct lttng_event **compat_sc_exit_table; struct lttng_event *sc_unknown; /* for unknown syscalls */ struct lttng_event *sc_compat_unknown; - struct lttng_event *sc_exit; /* for syscall exit */ + struct lttng_event *sc_exit_unknown; + struct lttng_event *compat_sc_exit_unknown; + struct lttng_syscall_filter *sc_filter; int header_type; /* 0: unset, 1: compact, 2: large */ - unsigned int metadata_dumped:1; + enum channel_type channel_type; + unsigned int metadata_dumped:1, + sys_enter_registered:1, + sys_exit_registered:1, + syscall_all: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 mutex lock; }; 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 */ + uuid_le uuid; /* Trace session unique ID (copy) */ +}; + 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); @@ -312,7 +385,9 @@ void lttng_transport_unregister(struct lttng_transport *transport); 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); @@ -321,9 +396,19 @@ void lttng_event_put(const struct lttng_event_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); +int lttng_syscall_filter_enable(struct lttng_channel *chan, + const char *name); +int lttng_syscall_filter_disable(struct lttng_channel *chan, + const char *name); +long lttng_channel_syscall_mask(struct lttng_channel *channel, + struct lttng_kernel_syscall_mask __user *usyscall_mask); +int lttng_abi_syscall_list(void); #else static inline int lttng_syscalls_register(struct lttng_channel *chan, void *filter) { @@ -334,9 +419,37 @@ static inline int lttng_syscalls_unregister(struct lttng_channel *chan) { return 0; } + +static inline +int lttng_syscall_filter_enable(struct lttng_channel *chan, + const char *name) +{ + return -ENOSYS; +} + +static inline +int lttng_syscall_filter_disable(struct lttng_channel *chan, + const char *name) +{ + return -ENOSYS; +} + +static inline +long lttng_channel_syscall_mask(struct lttng_channel *channel, + struct lttng_kernel_syscall_mask __user *usyscall_mask) +{ + return -ENOSYS; +} + +static inline +int lttng_abi_syscall_list(void) +{ + return -ENOSYS; +} #endif struct lttng_ctx_field *lttng_append_context(struct lttng_ctx **ctx); +void lttng_context_update(struct lttng_ctx *ctx); int lttng_find_context(struct lttng_ctx *ctx, const char *name); void lttng_remove_context_field(struct lttng_ctx **ctx, struct lttng_ctx_field *field); @@ -367,6 +480,9 @@ int lttng_add_perf_counter_to_ctx(uint32_t type, } #endif +int lttng_logger_init(void); +void lttng_logger_exit(void); + extern int lttng_statedump_start(struct lttng_session *session); #ifdef CONFIG_KPROBES @@ -460,6 +576,7 @@ void lttng_ftrace_destroy_private(struct lttng_event *event) int lttng_calibrate(struct lttng_kernel_calibrate *calibrate); extern const struct file_operations lttng_tracepoint_list_fops; +extern const struct file_operations lttng_syscall_list_fops; #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) #define TRACEPOINT_HAS_DATA_ARG