struct lttng_kernel_type_sequence {
struct lttng_kernel_type_common parent;
- const char *length_name; /* Length field name. */
+ 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. */
enum lttng_kernel_string_encoding encoding;
struct lttng_kernel_type_variant {
struct lttng_kernel_type_common parent;
- const char *tag_name;
+ const char *tag_name; /* Tag field name. If NULL, use previous field. */
const struct lttng_kernel_event_field **choices; /* Array of pointers to fields. */
unsigned int nr_choices;
unsigned int alignment;
_fields \
)
-#define lttng_kernel_static_ctx_field(_event_field, _get_size, _get_size_arg, _record, _get_value, _destroy, _priv) \
+#define lttng_kernel_static_ctx_field(_event_field, _get_size, _record, _get_value, _destroy, _priv) \
__LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_ctx_field, { \
.event_field = (_event_field), \
.get_size = (_get_size), \
- .get_size_arg = (_get_size_arg), \
.record = (_record), \
.get_value = (_get_value), \
.destroy = (_destroy), \
} \
}),
-union lttng_ctx_value {
- int64_t s64;
- const char *str;
- double d;
+struct lttng_ctx_value {
+ union {
+ int64_t s64;
+ const char *str;
+ double d;
+ } u;
};
/*
};
struct lttng_probe_ctx {
- struct lttng_kernel_event_recorder *event;
- struct lttng_kernel_event_notifier *event_notifier; // Not sure if we will ever need it.
+ struct lttng_kernel_event_common *event;
uint8_t interruptible;
};
struct lttng_kernel_ctx_field {
const struct lttng_kernel_event_field *event_field;
- size_t (*get_size)(size_t offset);
- size_t (*get_size_arg)(size_t offset, struct lttng_kernel_ctx_field *field,
- struct lib_ring_buffer_ctx *ctx,
- struct lttng_channel *chan);
- void (*record)(struct lttng_kernel_ctx_field *field,
- struct lib_ring_buffer_ctx *ctx,
- struct lttng_channel *chan);
- void (*get_value)(struct lttng_kernel_ctx_field *field,
- struct lttng_probe_ctx *lttng_probe_ctx,
- union lttng_ctx_value *value);
- void (*destroy)(struct lttng_kernel_ctx_field *field);
+ size_t (*get_size)(void *priv, struct lttng_probe_ctx *probe_ctx,
+ size_t offset);
+ void (*record)(void *priv, struct lttng_probe_ctx *probe_ctx,
+ struct lib_ring_buffer_ctx *ctx,
+ struct lttng_channel *chan);
+ void (*get_value)(void *priv, struct lttng_probe_ctx *probe_ctx,
+ struct lttng_ctx_value *value);
+ void (*destroy)(void *priv);
void *priv;
};
const struct lttng_kernel_event_field **fields; /* event payload */
unsigned int nr_fields;
struct module *owner;
- void *event_notifier_callback;
};
struct lttng_kernel_probe_desc {
struct lttng_krp; /* Kretprobe handling */
-enum lttng_bytecode_node_type {
- LTTNG_BYTECODE_NODE_TYPE_FILTER,
- LTTNG_BYTECODE_NODE_TYPE_CAPTURE,
+enum lttng_kernel_bytecode_type {
+ LTTNG_KERNEL_BYTECODE_TYPE_FILTER,
+ LTTNG_KERNEL_BYTECODE_TYPE_CAPTURE,
};
struct lttng_bytecode_node {
- enum lttng_bytecode_node_type type;
+ enum lttng_kernel_bytecode_type type;
struct list_head node;
struct lttng_enabler *enabler;
struct {
} bc;
};
-/*
- * Bytecode interpreter return value masks.
- */
-enum lttng_bytecode_interpreter_ret {
- LTTNG_INTERPRETER_DISCARD = 0,
- LTTNG_INTERPRETER_RECORD_FLAG = (1ULL << 0),
- /* Other bits are kept for future use. */
-};
-
struct lttng_interpreter_output;
struct lttng_bytecode_runtime {
/* Associated bytecode */
+ enum lttng_kernel_bytecode_type type;
struct lttng_bytecode_node *bc;
- union {
- uint64_t (*filter)(void *filter_data,
+ int (*interpreter_func)(struct lttng_bytecode_runtime *kernel_bytecode,
+ const char *interpreter_stack_data,
struct lttng_probe_ctx *lttng_probe_ctx,
- const char *filter_stack_data);
- uint64_t (*capture)(void *filter_data,
- struct lttng_probe_ctx *lttng_probe_ctx,
- const char *capture_stack_data,
- struct lttng_interpreter_output *output);
- } interpreter_funcs;
+ void *caller_ctx);
int link_failed;
struct list_head node; /* list of bytecode runtime in event */
struct lttng_kernel_ctx *ctx;
};
struct lttng_uprobe_handler {
- union {
- struct lttng_kernel_event_recorder *event;
- struct lttng_kernel_event_notifier *event_notifier;
- } u;
+ struct lttng_kernel_event_common *event;
loff_t offset;
struct uprobe_consumer up_consumer;
struct list_head node;
LTTNG_SYSCALL_ABI_COMPAT,
};
+/*
+ * Result of the run_filter() callback.
+ */
+enum lttng_kernel_event_filter_result {
+ LTTNG_KERNEL_EVENT_FILTER_ACCEPT = 0,
+ LTTNG_KERNEL_EVENT_FILTER_REJECT = 1,
+};
+
struct lttng_kernel_event_common_private;
enum lttng_kernel_event_type {
int enabled;
int eval_filter; /* Need to evaluate filters */
- int (*run_filter)(struct lttng_kernel_event_common *event,
+ int (*run_filter)(const struct lttng_kernel_event_common *event,
const char *stack_data,
+ struct lttng_probe_ctx *probe_ctx,
void *filter_ctx);
};
int eval_capture; /* Need to evaluate capture */
void (*notification_send)(struct lttng_kernel_event_notifier *event_notifier,
- struct lttng_probe_ctx *probe_ctx,
const char *stack_data,
+ struct lttng_probe_ctx *probe_ctx,
struct lttng_kernel_notification_ctx *notif_ctx);
};
LTTNG_ENABLER_FORMAT_NAME,
};
-/*
- * Enabler field, within whatever object is enabling an event. Target of
- * backward reference.
- */
-struct lttng_enabler {
- enum lttng_enabler_format_type format_type;
-
- /* head list of struct lttng_bytecode_node */
- struct list_head filter_bytecode_head;
-
- struct lttng_kernel_abi_event event_param;
- unsigned int enabled:1;
-
- uint64_t user_token; /* User-provided token. */
-};
-
-struct lttng_event_enabler {
- struct lttng_enabler base;
- struct list_head node; /* per-session list of enablers */
- struct lttng_channel *chan;
-};
-
-struct lttng_event_notifier_enabler {
- struct lttng_enabler base;
- uint64_t error_counter_index;
- struct list_head node; /* List of event_notifier enablers */
- struct lttng_event_notifier_group *group;
-
- /* head list of struct lttng_bytecode_node */
- struct list_head capture_bytecode_head;
- uint64_t num_captures;
-};
-
-
-static inline
-struct lttng_enabler *lttng_event_enabler_as_enabler(
- struct lttng_event_enabler *event_enabler)
-{
- return &event_enabler->base;
-}
-
-static inline
-struct lttng_enabler *lttng_event_notifier_enabler_as_enabler(
- struct lttng_event_notifier_enabler *event_notifier_enabler)
-{
- return &event_notifier_enabler->base;
-}
-
struct lttng_channel_ops {
struct channel *(*channel_create)(const char *name,
void *priv,
struct lib_ring_buffer *(*buffer_read_open)(struct channel *chan);
int (*buffer_has_read_closed_stream)(struct channel *chan);
void (*buffer_read_close)(struct lib_ring_buffer *buf);
- int (*event_reserve)(struct lib_ring_buffer_ctx *ctx,
- uint32_t event_id);
+ int (*event_reserve)(struct lib_ring_buffer_ctx *ctx);
void (*event_commit)(struct lib_ring_buffer_ctx *ctx);
void (*event_write)(struct lib_ring_buffer_ctx *ctx, const void *src,
size_t len);
int lttng_channel_enable(struct lttng_channel *channel);
int lttng_channel_disable(struct lttng_channel *channel);
-int lttng_event_enable(struct lttng_kernel_event_recorder *event);
-int lttng_event_disable(struct lttng_kernel_event_recorder *event);
-
-int lttng_event_notifier_enable(struct lttng_kernel_event_notifier *event_notifier);
-int lttng_event_notifier_disable(struct lttng_kernel_event_notifier *event_notifier);
+int lttng_event_enable(struct lttng_kernel_event_common *event);
+int lttng_event_disable(struct lttng_kernel_event_common *event);
void lttng_transport_register(struct lttng_transport *transport);
void lttng_transport_unregister(struct lttng_transport *transport);
struct lttng_kernel_ctx *ctx,
struct list_head *instance_bytecode_runtime_head,
struct list_head *enabler_bytecode_runtime_head);
-void lttng_free_event_filter_runtime(struct lttng_kernel_event_recorder *event);
-void lttng_free_event_notifier_filter_runtime(struct lttng_kernel_event_notifier *event_notifier);
+void lttng_free_event_filter_runtime(struct lttng_kernel_event_common *event);
int lttng_probes_init(void);
}
#endif
-int lttng_event_add_callsite(struct lttng_kernel_event_recorder *event,
- struct lttng_kernel_abi_event_callsite __user *callsite);
-
-int lttng_event_notifier_add_callsite(struct lttng_kernel_event_notifier *event_notifier,
+int lttng_event_add_callsite(struct lttng_kernel_event_common *event,
struct lttng_kernel_abi_event_callsite __user *callsite);
#ifdef CONFIG_UPROBES
int lttng_uprobes_register_event(const char *name,
int fd, struct lttng_kernel_event_recorder *event);
-int lttng_uprobes_event_add_callsite(struct lttng_kernel_event_recorder *event,
+int lttng_uprobes_event_add_callsite(struct lttng_kernel_event_common *event,
struct lttng_kernel_abi_event_callsite __user *callsite);
void lttng_uprobes_unregister_event(struct lttng_kernel_event_recorder *event);
void lttng_uprobes_destroy_event_private(struct lttng_kernel_event_recorder *event);
int lttng_uprobes_register_event_notifier(const char *name,
int fd, struct lttng_kernel_event_notifier *event_notifier);
-int lttng_uprobes_event_notifier_add_callsite(struct lttng_kernel_event_notifier *event_notifier,
- struct lttng_kernel_abi_event_callsite __user *callsite);
void lttng_uprobes_unregister_event_notifier(struct lttng_kernel_event_notifier *event_notifier);
void lttng_uprobes_destroy_event_notifier_private(struct lttng_kernel_event_notifier *event_notifier);
#else
}
static inline
-int lttng_uprobes_event_add_callsite(struct lttng_kernel_event_recorder *event,
+int lttng_uprobes_event_add_callsite(struct lttng_kernel_event_common *event,
struct lttng_kernel_abi_event_callsite __user *callsite)
{
return -ENOSYS;
return -ENOSYS;
}
-static inline
-int lttng_uprobes_event_notifier_add_callsite(struct lttng_kernel_event_notifier *event_notifier,
- struct lttng_kernel_abi_event_callsite __user *callsite)
-{
- return -ENOSYS;
-}
-
static inline
void lttng_uprobes_unregister_event_notifier(struct lttng_kernel_event_notifier *event_notifier)
{
struct lttng_kernel_event_recorder *event_exit);
void lttng_kretprobes_unregister(struct lttng_kernel_event_recorder *event);
void lttng_kretprobes_destroy_private(struct lttng_kernel_event_recorder *event);
-int lttng_kretprobes_event_enable_state(struct lttng_kernel_event_recorder *event,
+int lttng_kretprobes_event_enable_state(struct lttng_kernel_event_common *event,
int enable);
#else
static inline
}
static inline
-int lttng_kretprobes_event_enable_state(struct lttng_kernel_event_recorder *event,
+int lttng_kretprobes_event_enable_state(struct lttng_kernel_event_common *event,
int enable)
{
return -ENOSYS;