static void lttng_session_lazy_sync_event_enablers(struct lttng_kernel_session *session);
static void lttng_session_sync_event_enablers(struct lttng_kernel_session *session);
-static void lttng_event_enabler_destroy(struct lttng_event_enabler *event_enabler);
static void lttng_event_notifier_enabler_destroy(struct lttng_event_notifier_enabler *event_notifier_enabler);
static void lttng_event_notifier_group_sync_enablers(struct lttng_event_notifier_group *event_notifier_group);
* Supports event creation while tracing session is active.
* Needs to be called with sessions mutex held.
*/
-struct lttng_kernel_event_recorder *_lttng_kernel_event_recorder_create(struct lttng_kernel_channel_buffer *chan,
- struct lttng_kernel_abi_event *event_param,
- const struct lttng_kernel_event_desc *event_desc,
- enum lttng_kernel_abi_instrumentation itype)
+struct lttng_kernel_event_recorder *_lttng_kernel_event_recorder_create(struct lttng_event_enabler *event_enabler,
+ const struct lttng_kernel_event_desc *event_desc)
{
+ struct lttng_kernel_channel_buffer *chan = event_enabler->chan;
+ struct lttng_kernel_abi_event *event_param = &event_enabler->base.event_param;
+ enum lttng_kernel_abi_instrumentation itype = event_param->instrumentation;
struct lttng_kernel_session *session = chan->parent.session;
struct lttng_kernel_event_recorder *event_recorder;
struct lttng_kernel_event_recorder_private *event_recorder_priv;
return counter->ops->counter_clear(counter->counter, dim_indexes);
}
-struct lttng_kernel_event_recorder *lttng_kernel_event_recorder_create(struct lttng_kernel_channel_buffer *chan,
- struct lttng_kernel_abi_event *event_param,
- const struct lttng_kernel_event_desc *event_desc,
- enum lttng_kernel_abi_instrumentation itype)
+struct lttng_kernel_event_recorder *lttng_kernel_event_recorder_create(struct lttng_event_enabler *event_enabler,
+ const struct lttng_kernel_event_desc *event_desc)
{
struct lttng_kernel_event_recorder *event;
mutex_lock(&sessions_mutex);
- event = _lttng_kernel_event_recorder_create(chan, event_param, event_desc, itype);
+ event = _lttng_kernel_event_recorder_create(event_enabler, event_desc);
mutex_unlock(&sessions_mutex);
return event;
}
}
int lttng_desc_match_enabler(const struct lttng_kernel_event_desc *desc,
- struct lttng_enabler *enabler)
+ struct lttng_event_enabler_common *enabler)
{
const char *desc_name, *enabler_name;
bool compat = false, entry = false;
int lttng_event_enabler_match_event(struct lttng_event_enabler *event_enabler,
struct lttng_kernel_event_recorder *event_recorder)
{
- struct lttng_enabler *base_enabler = lttng_event_enabler_as_enabler(
+ struct lttng_event_enabler_common *base_enabler = lttng_event_enabler_as_enabler(
event_enabler);
if (base_enabler->event_param.instrumentation != event_recorder->priv->parent.instrumentation)
int lttng_event_notifier_enabler_match_event_notifier(struct lttng_event_notifier_enabler *event_notifier_enabler,
struct lttng_kernel_event_notifier *event_notifier)
{
- struct lttng_enabler *base_enabler = lttng_event_notifier_enabler_as_enabler(
+ struct lttng_event_enabler_common *base_enabler = lttng_event_notifier_enabler_as_enabler(
event_notifier_enabler);
if (base_enabler->event_param.instrumentation != event_notifier->priv->parent.instrumentation)
static
struct lttng_enabler_ref *lttng_enabler_ref(
struct list_head *enablers_ref_list,
- struct lttng_enabler *enabler)
+ struct lttng_event_enabler_common *enabler)
{
struct lttng_enabler_ref *enabler_ref;
* We need to create an event for this
* event probe.
*/
- event_recorder = _lttng_kernel_event_recorder_create(event_enabler->chan,
- NULL, desc, LTTNG_KERNEL_ABI_TRACEPOINT);
+ event_recorder = _lttng_kernel_event_recorder_create(event_enabler, desc);
if (!event_recorder) {
printk(KERN_INFO "LTTng: Unable to create event %s\n",
probe_desc->event_desc[i]->event_name);
{
struct lttng_kernel_channel_buffer *chan = event_enabler->chan;
struct lttng_kernel_session *session = event_enabler->chan->parent.session;
- struct lttng_enabler *base_enabler = lttng_event_enabler_as_enabler(event_enabler);
+ struct lttng_event_enabler_common *base_enabler = lttng_event_enabler_as_enabler(event_enabler);
struct lttng_kernel_event_recorder_private *event_recorder_priv;
if (base_enabler->event_param.instrumentation == LTTNG_KERNEL_ABI_SYSCALL &&
struct lttng_event_notifier_enabler *event_notifier_enabler)
{
struct lttng_event_notifier_group *event_notifier_group = event_notifier_enabler->group;
- struct lttng_enabler *base_enabler = lttng_event_notifier_enabler_as_enabler(event_notifier_enabler);
+ struct lttng_event_enabler_common *base_enabler = lttng_event_notifier_enabler_as_enabler(event_notifier_enabler);
struct lttng_kernel_event_notifier_private *event_notifier_priv;
if (base_enabler->event_param.instrumentation == LTTNG_KERNEL_ABI_SYSCALL &&
event_enabler->chan = chan;
/* ctx left NULL */
event_enabler->base.enabled = 0;
+ return event_enabler;
+}
+
+void lttng_event_enabler_session_add(struct lttng_kernel_session *session,
+ struct lttng_event_enabler *event_enabler)
+{
mutex_lock(&sessions_mutex);
- list_add(&event_enabler->node, &event_enabler->chan->parent.session->priv->enablers_head);
- lttng_session_lazy_sync_event_enablers(event_enabler->chan->parent.session);
+ list_add(&event_enabler->node, &session->priv->enablers_head);
+ event_enabler->published = true;
+ lttng_session_lazy_sync_event_enablers(session);
mutex_unlock(&sessions_mutex);
- return event_enabler;
}
int lttng_event_enabler_enable(struct lttng_event_enabler *event_enabler)
}
static
-int lttng_enabler_attach_filter_bytecode(struct lttng_enabler *enabler,
+int lttng_enabler_attach_filter_bytecode(struct lttng_event_enabler_common *enabler,
struct lttng_kernel_abi_filter_bytecode __user *bytecode)
{
struct lttng_kernel_bytecode_node *bytecode_node;
}
static
-void lttng_enabler_destroy(struct lttng_enabler *enabler)
+void lttng_enabler_destroy(struct lttng_event_enabler_common *enabler)
{
struct lttng_kernel_bytecode_node *filter_node, *tmp_filter_node;
}
}
-static
void lttng_event_enabler_destroy(struct lttng_event_enabler *event_enabler)
{
lttng_enabler_destroy(lttng_event_enabler_as_enabler(event_enabler));
- list_del(&event_enabler->node);
+ if (event_enabler->published)
+ list_del(&event_enabler->node);
kfree(event_enabler);
}
struct lttng_kernel_abi_capture_bytecode __user *bytecode)
{
struct lttng_kernel_bytecode_node *bytecode_node;
- struct lttng_enabler *enabler =
+ struct lttng_event_enabler_common *enabler =
lttng_event_notifier_enabler_as_enabler(event_notifier_enabler);
uint32_t bytecode_len;
int ret;