X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=include%2Flttng%2Fevents.h;h=22f654be96d4a92ad5c68b80d24fcb372ad0bfc8;hb=853f5b15987181812b9973d86607cb9d76c850b9;hp=a04d0f2a9de586e522854d263fea35ca38998547;hpb=9857164a67f1a037f96011acbb2d533025d5221f;p=lttng-modules.git diff --git a/include/lttng/events.h b/include/lttng/events.h index a04d0f2a..22f654be 100644 --- a/include/lttng/events.h +++ b/include/lttng/events.h @@ -16,7 +16,8 @@ #include #include #include -#include +#include + #include #include #include @@ -25,7 +26,7 @@ #define lttng_is_signed_type(type) (((type) -1) < (type) 1) -struct lttng_channel; +struct lttng_kernel_channel_buffer; struct lttng_kernel_session; struct lttng_kernel_ring_buffer_ctx; @@ -49,11 +50,6 @@ enum lttng_kernel_string_encoding { NR_LTTNG_KERNEL_STRING_ENCODING, }; -enum channel_type { - PER_CPU_CHANNEL, - METADATA_CHANNEL, -}; - struct lttng_kernel_enum_value { unsigned long long value; unsigned int signedness:1; @@ -80,13 +76,15 @@ struct lttng_kernel_type_integer { unsigned int size; /* in bits */ unsigned short alignment; /* in bits */ unsigned int signedness:1, - reverse_byte_order:1; + reverse_byte_order:1, + user:1; /* fetch from user-space */ unsigned int base; /* 2, 8, 10, 16, for pretty print */ }; struct lttng_kernel_type_string { struct lttng_kernel_type_common parent; enum lttng_kernel_string_encoding encoding; + unsigned int user:1; /* fetch from user-space */ }; struct lttng_kernel_type_enum { @@ -99,7 +97,7 @@ struct lttng_kernel_type_array { struct lttng_kernel_type_common parent; const struct lttng_kernel_type_common *elem_type; unsigned int length; /* Num. elems. */ - unsigned int alignment; + unsigned int alignment; /* Alignment in bytes before elements. */ enum lttng_kernel_string_encoding encoding; }; @@ -107,29 +105,30 @@ struct lttng_kernel_type_sequence { struct lttng_kernel_type_common parent; const char *length_name; /* Length field name. If NULL, use previous field. */ const struct lttng_kernel_type_common *elem_type; - unsigned int alignment; /* Alignment before elements. */ + unsigned int alignment; /* Alignment in bytes before elements. */ enum lttng_kernel_string_encoding encoding; }; struct lttng_kernel_type_struct { struct lttng_kernel_type_common parent; unsigned int nr_fields; - const struct lttng_kernel_event_field **fields; /* Array of pointers to fields. */ - unsigned int alignment; + const struct lttng_kernel_event_field * const *fields; /* Array of pointers to fields. */ + unsigned int alignment; /* Alignment in bits */ }; struct lttng_kernel_type_variant { struct lttng_kernel_type_common parent; const char *tag_name; /* Tag field name. If NULL, use previous field. */ - const struct lttng_kernel_event_field **choices; /* Array of pointers to fields. */ + const struct lttng_kernel_event_field * const *choices; /* Array of pointers to fields. */ unsigned int nr_choices; - unsigned int alignment; + unsigned int alignment; /* Alignment in bytes */ }; struct lttng_kernel_enum_desc { const char *name; - const struct lttng_kernel_enum_entry **entries; + const struct lttng_kernel_enum_entry * const *entries; unsigned int nr_entries; + const struct lttng_kernel_probe_desc *probe_desc; }; /* Event field description */ @@ -138,7 +137,6 @@ struct lttng_kernel_event_field { const char *name; const struct lttng_kernel_type_common *type; unsigned int nowrite:1, /* do not write into trace */ - user:1, /* fetch from user-space */ nofilter:1; /* do not consider for filter */ }; @@ -146,7 +144,7 @@ struct lttng_kernel_event_field { #define PARAMS(args...) args #endif -#define lttng_kernel_static_type_integer(_size, _alignment, _signedness, _byte_order, _base) \ +#define _lttng_kernel_static_type_integer(_size, _alignment, _signedness, _byte_order, _user, _base) \ ((const struct lttng_kernel_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_type_integer, { \ .parent = { \ .type = lttng_kernel_type_integer, \ @@ -155,15 +153,27 @@ struct lttng_kernel_event_field { .alignment = (_alignment), \ .signedness = (_signedness), \ .reverse_byte_order = (_byte_order) != __BYTE_ORDER, \ + .user = (_user), \ .base = (_base), \ })) -#define lttng_kernel_static_type_integer_from_type(_type, _byte_order, _base) \ - lttng_kernel_static_type_integer(sizeof(_type) * CHAR_BIT, \ +#define lttng_kernel_static_type_integer(_size, _alignment, _signedness, _byte_order, _base) \ + _lttng_kernel_static_type_integer(_size, _alignment, _signedness, _byte_order, 0, _base) + +#define lttng_kernel_static_type_user_integer(_size, _alignment, _signedness, _byte_order, _base) \ + _lttng_kernel_static_type_integer(_size, _alignment, _signedness, _byte_order, 1, _base) + +#define _lttng_kernel_static_type_integer_from_type(_type, _byte_order, _user, _base) \ + _lttng_kernel_static_type_integer(sizeof(_type) * CHAR_BIT, \ lttng_alignof(_type) * CHAR_BIT, \ lttng_is_signed_type(_type), \ - _byte_order, \ - _base) + _byte_order, _user, _base) + +#define lttng_kernel_static_type_integer_from_type(_type, _byte_order, _base) \ + _lttng_kernel_static_type_integer_from_type(_type, _byte_order, 0, _base) + +#define lttng_kernel_static_type_user_integer_from_type(_type, _byte_order, _base) \ + _lttng_kernel_static_type_integer_from_type(_type, _byte_order, 1, _base) #define lttng_kernel_static_type_enum(_desc, _container_type) \ ((const struct lttng_kernel_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_type_enum, { \ @@ -203,12 +213,13 @@ struct lttng_kernel_event_field { .elem_type = (_elem_type), \ })) -#define lttng_kernel_static_type_string(_encoding) \ +#define lttng_kernel_static_type_string(_encoding, _user) \ ((const struct lttng_kernel_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_type_string, { \ .parent = { \ .type = lttng_kernel_type_string, \ }, \ .encoding = lttng_kernel_string_encoding_##_encoding, \ + .user = (_user), \ })) #define lttng_kernel_static_type_struct_init(_nr_fields, _fields, _alignment) \ @@ -237,12 +248,11 @@ struct lttng_kernel_event_field { .alignment = (_alignment), \ })) -#define lttng_kernel_static_event_field(_name, _type, _nowrite, _user, _nofilter) \ +#define lttng_kernel_static_event_field(_name, _type, _nowrite, _nofilter) \ __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_event_field, { \ .name = (_name), \ .type = (_type), \ .nowrite = (_nowrite), \ - .user = (_user), \ .nofilter = (_nofilter), \ }) @@ -302,19 +312,24 @@ struct lttng_kernel_probe_ctx { uint8_t interruptible; }; +struct lttng_kernel_tracepoint_class { + void (*probe_callback)(void); + const struct lttng_kernel_event_field * const *fields; /* event payload */ + unsigned int nr_fields; + const struct lttng_kernel_probe_desc *probe_desc; +}; + struct lttng_kernel_event_desc { const char *event_name; /* lttng-modules name */ const char *event_kname; /* Linux kernel name (tracepoints) */ const struct lttng_kernel_probe_desc *probe_desc; - void (*probe_callback)(void); - const struct lttng_kernel_event_field **fields; /* event payload */ - unsigned int nr_fields; + const struct lttng_kernel_tracepoint_class *tp_class; struct module *owner; }; struct lttng_kernel_probe_desc { const char *provider_name; - const struct lttng_kernel_event_desc **event_desc; + const struct lttng_kernel_event_desc * const *event_desc; unsigned int nr_events; struct list_head head; /* chain registered probes */ struct list_head lazy_init_head; @@ -356,7 +371,7 @@ struct lttng_kernel_event_recorder { struct lttng_kernel_event_common parent; struct lttng_kernel_event_recorder_private *priv; /* Private event record interface */ - struct lttng_channel *chan; + struct lttng_kernel_channel_buffer *chan; }; struct lttng_kernel_notification_ctx { @@ -382,46 +397,45 @@ struct lttng_kernel_channel_buffer_ops { int (*event_reserve)(struct lttng_kernel_ring_buffer_ctx *ctx); void (*event_commit)(struct lttng_kernel_ring_buffer_ctx *ctx); void (*event_write)(struct lttng_kernel_ring_buffer_ctx *ctx, const void *src, - size_t len); + size_t len, size_t alignment); void (*event_write_from_user)(struct lttng_kernel_ring_buffer_ctx *ctx, - const void *src, size_t len); + const void *src, size_t len, size_t alignment); void (*event_memset)(struct lttng_kernel_ring_buffer_ctx *ctx, int c, size_t len); void (*event_strcpy)(struct lttng_kernel_ring_buffer_ctx *ctx, const char *src, size_t len); void (*event_strcpy_from_user)(struct lttng_kernel_ring_buffer_ctx *ctx, const char __user *src, size_t len); + void (*event_pstrcpy_pad)(struct lttng_kernel_ring_buffer_ctx *ctx, + const char *src, size_t len); + void (*event_pstrcpy_pad_from_user)(struct lttng_kernel_ring_buffer_ctx *ctx, + const char __user *src, size_t len); + void (*lost_event_too_big)(struct lttng_kernel_channel_buffer *lttng_channel); +}; + +enum lttng_kernel_channel_type { + LTTNG_KERNEL_CHANNEL_TYPE_BUFFER = 0, }; -struct lttng_channel { - unsigned int id; - struct channel *chan; /* Channel buffers */ +struct lttng_kernel_channel_common_private; + +/* Use container_of() to get child. */ +struct lttng_kernel_channel_common { + struct lttng_kernel_channel_common_private *priv; /* Private channel interface. */ + + enum lttng_kernel_channel_type type; + int enabled; - struct lttng_kernel_ctx *ctx; - /* Event ID management */ struct lttng_kernel_session *session; - struct file *file; /* File associated to channel */ - unsigned int free_event_id; /* Next event ID to allocate */ - struct list_head list; /* Channel list */ +}; + +struct lttng_kernel_channel_buffer_private; + +struct lttng_kernel_channel_buffer { + struct lttng_kernel_channel_common parent; + struct lttng_kernel_channel_buffer_private *priv; + struct lttng_kernel_channel_buffer_ops *ops; - struct lttng_transport *transport; - struct hlist_head *sc_table; /* for syscall tracing */ - struct hlist_head *compat_sc_table; - struct hlist_head *sc_exit_table; /* for syscall exit tracing */ - struct hlist_head *compat_sc_exit_table; - struct hlist_head sc_unknown; /* for unknown syscalls */ - struct hlist_head sc_compat_unknown; - struct hlist_head sc_exit_unknown; - struct hlist_head compat_sc_exit_unknown; - struct lttng_syscall_filter *sc_filter; - int header_type; /* 0: unset, 1: compact, 2: large */ - enum channel_type channel_type; - int syscall_all_entry; - int syscall_all_exit; - unsigned int metadata_dumped:1, - sys_enter_registered:1, - sys_exit_registered:1, - tstate:1; /* Transient enable state */ }; #define LTTNG_DYNAMIC_LEN_STACK_SIZE 128