};
-struct lttng_kernel_channel_common_private {
- struct lttng_kernel_channel_common *pub;
-
- struct file *file; /* File associated to channel */
+struct lttng_kernel_syscall_table {
unsigned int sys_enter_registered:1,
- sys_exit_registered:1,
- tstate:1; /* Transient enable state */
+ sys_exit_registered:1;
+
+ struct hlist_head *syscall_dispatch; /* for syscall tracing */
+ struct hlist_head *compat_syscall_dispatch;
+ struct hlist_head *syscall_exit_dispatch; /* for syscall exit tracing */
+ struct hlist_head *compat_syscall_exit_dispatch;
+
+ /*
+ * Combining all unknown syscall events works as long as they
+ * are only matched by "all" syscalls enablers, but will require
+ * a design change when we allow matching by syscall number, for
+ * instance by allocating sc_tables accomodating NR_syscalls
+ * entries.
+ */
+ struct hlist_head unknown_syscall_dispatch; /* for unknown syscalls */
+ struct hlist_head compat_unknown_syscall_dispatch;
+ struct hlist_head unknown_syscall_exit_dispatch;
+ struct hlist_head compat_unknown_syscall_exit_dispatch;
- 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 syscall_all_entry;
int syscall_all_exit;
};
+struct lttng_kernel_channel_common_private {
+ struct lttng_kernel_channel_common *pub;
+
+ struct file *file; /* File associated to channel */
+ unsigned int tstate:1; /* Transient enable state */
+
+ struct lttng_kernel_syscall_table syscall_table;
+};
+
struct lttng_kernel_channel_buffer_private {
struct lttng_kernel_channel_common_private parent;
LTTNG_KERNEL_BYTECODE_TYPE_CAPTURE,
};
+enum lttng_kernel_event_enabler_type {
+ LTTNG_EVENT_ENABLER_TYPE_RECORDER,
+ LTTNG_EVENT_ENABLER_TYPE_NOTIFIER,
+};
+
struct lttng_kernel_bytecode_node {
enum lttng_kernel_bytecode_type type;
struct list_head node;
* backward reference.
*/
struct lttng_event_enabler_common {
+ enum lttng_kernel_event_enabler_type enabler_type;
enum lttng_enabler_format_type format_type;
/* head list of struct lttng_kernel_bytecode_node */
uint64_t user_token; /* User-provided token. */
};
-struct lttng_event_enabler {
+struct lttng_event_recorder_enabler {
struct lttng_event_enabler_common parent;
struct list_head node; /* per-session list of enablers */
bool published; /* published in per-session list. */
struct lttng_kernel_ring_buffer *buf; /* Ring buffer for event notifier group. */
wait_queue_head_t read_wait;
struct irq_work wakeup_pending; /* Pending wakeup irq work. */
- struct lttng_kernel_event_notifier *sc_unknown; /* for unknown syscalls */
- struct lttng_kernel_event_notifier *sc_compat_unknown;
-
- struct lttng_syscall_filter *sc_filter;
-
- struct hlist_head *event_notifier_syscall_dispatch;
- struct hlist_head *event_notifier_compat_syscall_dispatch;
- struct hlist_head *event_notifier_exit_syscall_dispatch;
- struct hlist_head *event_notifier_exit_compat_syscall_dispatch;
-
- struct hlist_head event_notifier_unknown_syscall_dispatch;
- struct hlist_head event_notifier_compat_unknown_syscall_dispatch;
- struct hlist_head event_notifier_exit_unknown_syscall_dispatch;
- struct hlist_head event_notifier_exit_compat_unknown_syscall_dispatch;
-
- int syscall_all_entry;
- int syscall_all_exit;
- unsigned int sys_enter_registered:1, sys_exit_registered:1;
+ struct lttng_kernel_syscall_table syscall_table;
struct lttng_counter *error_counter;
size_t error_counter_len;
void *event_filter_ctx);
static inline
-struct lttng_event_enabler_common *lttng_event_enabler_as_enabler(
- struct lttng_event_enabler *event_enabler)
+struct lttng_event_enabler_common *lttng_event_recorder_enabler_as_enabler(
+ struct lttng_event_recorder_enabler *event_recorder_enabler)
{
- return &event_enabler->parent;
+ return &event_recorder_enabler->parent;
}
static inline
}
#endif
-struct lttng_event_enabler *lttng_event_enabler_create(
+struct lttng_event_recorder_enabler *lttng_event_recorder_enabler_create(
enum lttng_enabler_format_type format_type,
struct lttng_kernel_abi_event *event_param,
struct lttng_kernel_channel_buffer *chan);
void lttng_event_enabler_session_add(struct lttng_kernel_session *session,
- struct lttng_event_enabler *event_enabler);
-void lttng_event_enabler_destroy(struct lttng_event_enabler *event_enabler);
+ struct lttng_event_recorder_enabler *event_enabler);
-int lttng_event_enabler_enable(struct lttng_event_enabler *event_enabler);
-int lttng_event_enabler_disable(struct lttng_event_enabler *event_enabler);
struct lttng_event_notifier_enabler *lttng_event_notifier_enabler_create(
struct lttng_event_notifier_group *event_notifier_group,
enum lttng_enabler_format_type format_type,
struct lttng_kernel_abi_event_notifier *event_notifier_param);
-
-int lttng_event_notifier_enabler_enable(
- struct lttng_event_notifier_enabler *event_notifier_enabler);
-int lttng_event_notifier_enabler_disable(
- struct lttng_event_notifier_enabler *event_notifier_enabler);
-
-int lttng_event_enabler_attach_filter_bytecode(struct lttng_event_enabler *event_enabler,
- struct lttng_kernel_abi_filter_bytecode __user *bytecode);
-int lttng_event_notifier_enabler_attach_filter_bytecode(
- struct lttng_event_notifier_enabler *event_notifier_enabler,
- struct lttng_kernel_abi_filter_bytecode __user *bytecode);
int lttng_event_notifier_enabler_attach_capture_bytecode(
struct lttng_event_notifier_enabler *event_notifier_enabler,
struct lttng_kernel_abi_capture_bytecode __user *bytecode);
+int lttng_event_enabler_enable(struct lttng_event_enabler_common *event_enabler);
+int lttng_event_enabler_disable(struct lttng_event_enabler_common *event_enabler);
+int lttng_event_enabler_attach_filter_bytecode(struct lttng_event_enabler_common *event_enabler,
+ struct lttng_kernel_abi_filter_bytecode __user *bytecode);
+void lttng_event_enabler_destroy(struct lttng_event_enabler_common *event_enabler);
+
int lttng_desc_match_enabler(const struct lttng_kernel_event_desc *desc,
struct lttng_event_enabler_common *enabler);
struct list_head *enabler_bytecode_runtime_head);
#if defined(CONFIG_HAVE_SYSCALL_TRACEPOINTS)
-int lttng_syscalls_register_event(struct lttng_event_enabler *event_enabler);
+int lttng_syscalls_register_event(struct lttng_event_recorder_enabler *event_enabler);
int lttng_syscalls_unregister_channel(struct lttng_kernel_channel_buffer *chan);
int lttng_syscalls_destroy_event(struct lttng_kernel_channel_buffer *chan);
-int lttng_syscall_filter_enable_event(
- struct lttng_kernel_channel_buffer *chan,
- struct lttng_kernel_event_recorder *event);
-int lttng_syscall_filter_disable_event(
- struct lttng_kernel_channel_buffer *chan,
- struct lttng_kernel_event_recorder *event);
+int lttng_syscall_filter_enable_event_recorder(struct lttng_kernel_event_recorder *event_recorder);
+int lttng_syscall_filter_disable_event_recorder(struct lttng_kernel_event_recorder *event_recorder);
long lttng_channel_syscall_mask(struct lttng_kernel_channel_buffer *channel,
struct lttng_kernel_abi_syscall_mask __user *usyscall_mask);
int lttng_syscall_filter_disable_event_notifier(struct lttng_kernel_event_notifier *event_notifier);
#else
static inline int lttng_syscalls_register_event(
- struct lttng_event_enabler *event_enabler)
+ struct lttng_event_recorder_enabler *event_enabler)
{
return -ENOSYS;
}
return 0;
}
-static inline int lttng_syscall_filter_enable_event(struct lttng_kernel_channel_buffer *chan,
- struct lttng_kernel_event_recorder *event);
+static inline int lttng_syscall_filter_enable_event_recorder(struct lttng_kernel_event_recorder *event_recorder)
{
return -ENOSYS;
}
-static inline int lttng_syscall_filter_disable_event(struct lttng_kernel_channel_buffer *chan,
- struct lttng_kernel_event_recorder *event);
+static inline int lttng_syscall_filter_disable_event_recorder(struct lttng_kernel_event_recorder *event_recorder)
{
return -ENOSYS;
}
return 0;
}
-static inline int lttng_syscall_filter_enable_event_notifier(
- struct lttng_event_notifier_group *group,
- const char *name)
+static inline int lttng_syscall_filter_enable_event_notifier(struct lttng_kernel_event_notifier *event_notifier)
{
return -ENOSYS;
}
-static inline int lttng_syscall_filter_disable_event_notifier(
- struct lttng_event_notifier_group *group,
- const char *name)
+static inline int lttng_syscall_filter_disable_event_notifier(struct lttng_kernel_event_notifier *event_notifier)
{
return -ENOSYS;
}
unsigned int read_timer_interval);
void lttng_metadata_channel_destroy(struct lttng_kernel_channel_buffer *chan);
-struct lttng_kernel_event_recorder *lttng_kernel_event_recorder_create(struct lttng_event_enabler *event_enabler,
+struct lttng_kernel_event_recorder *lttng_kernel_event_recorder_create(struct lttng_event_recorder_enabler *event_enabler,
const struct lttng_kernel_event_desc *event_desc);
-struct lttng_kernel_event_recorder *_lttng_kernel_event_recorder_create(struct lttng_event_enabler *event_enabler,
+struct lttng_kernel_event_recorder *_lttng_kernel_event_recorder_create(struct lttng_event_recorder_enabler *event_enabler,
const struct lttng_kernel_event_desc *event_desc);
struct lttng_kernel_event_recorder *lttng_event_compat_old_create(struct lttng_kernel_channel_buffer *chan,
struct lttng_kernel_abi_old_event *old_event_param,