INIT_LIST_HEAD(&event_notifier_group->enablers_head);
INIT_LIST_HEAD(&event_notifier_group->event_notifiers_head);
- for (i = 0; i < LTTNG_EVENT_NOTIFIER_HT_SIZE; i++)
- INIT_HLIST_HEAD(&event_notifier_group->event_notifiers_ht.table[i]);
+ for (i = 0; i < LTTNG_EVENT_HT_SIZE; i++)
+ INIT_HLIST_HEAD(&event_notifier_group->events_ht.table[i]);
list_add(&event_notifier_group->node, &event_notifier_groups);
struct lttng_kernel_session *session = chan->parent.session;
struct lttng_kernel_event_recorder *event_recorder;
struct lttng_kernel_event_recorder_private *event_recorder_priv;
+ struct lttng_kernel_event_common_private *event_priv;
const char *event_name;
struct hlist_head *head;
int ret;
head = utils_borrow_hash_table_bucket(session->priv->events_ht.table,
LTTNG_EVENT_HT_SIZE, event_name);
- lttng_hlist_for_each_entry(event_recorder_priv, head, hlist) {
- WARN_ON_ONCE(!event_recorder_priv->parent.desc);
- if (!strncmp(event_recorder_priv->parent.desc->event_name, event_name,
+ lttng_hlist_for_each_entry(event_priv, head, hlist_node) {
+ event_recorder_priv = container_of(event_priv, struct lttng_kernel_event_recorder_private, parent);
+
+ WARN_ON_ONCE(!event_priv->desc);
+ if (!strncmp(event_priv->desc->event_name, event_name,
LTTNG_KERNEL_ABI_SYM_NAME_LEN - 1)
&& chan == event_recorder_priv->pub->chan) {
ret = -EEXIST;
if (ret) {
goto statedump_error;
}
- hlist_add_head(&event_recorder->priv->hlist, head);
+ hlist_add_head(&event_recorder->priv->parent.hlist_node, head);
list_add(&event_recorder->priv->node, &chan->parent.session->priv->events);
return event_recorder;
return ERR_PTR(ret);
}
-struct lttng_kernel_event_notifier *_lttng_event_notifier_create(
- const struct lttng_kernel_event_desc *event_desc,
- uint64_t token, uint64_t error_counter_index,
- struct lttng_event_notifier_group *event_notifier_group,
- struct lttng_kernel_abi_event_notifier *event_notifier_param,
- enum lttng_kernel_abi_instrumentation itype)
+struct lttng_kernel_event_notifier *_lttng_event_notifier_create(struct lttng_event_notifier_enabler *event_enabler,
+ const struct lttng_kernel_event_desc *event_desc)
{
+ struct lttng_event_notifier_group *event_notifier_group = event_enabler->group;
+ struct lttng_kernel_abi_event *event_param = &event_enabler->parent.event_param;
+ uint64_t token = event_enabler->parent.user_token;
+ enum lttng_kernel_abi_instrumentation itype = event_param->instrumentation;
struct lttng_kernel_event_notifier *event_notifier;
struct lttng_kernel_event_notifier_private *event_notifier_priv;
+ struct lttng_kernel_event_common_private *event_priv;
struct lttng_counter *error_counter;
const char *event_name;
struct hlist_head *head;
case LTTNG_KERNEL_ABI_UPROBE:
lttng_fallthrough;
case LTTNG_KERNEL_ABI_SYSCALL:
- event_name = event_notifier_param->event.name;
+ event_name = event_param->name;
break;
case LTTNG_KERNEL_ABI_KRETPROBE:
goto type_error;
}
- head = utils_borrow_hash_table_bucket(event_notifier_group->event_notifiers_ht.table,
- LTTNG_EVENT_NOTIFIER_HT_SIZE, event_name);
- lttng_hlist_for_each_entry(event_notifier_priv, head, hlist) {
- WARN_ON_ONCE(!event_notifier_priv->parent.desc);
- if (!strncmp(event_notifier_priv->parent.desc->event_name, event_name,
+ head = utils_borrow_hash_table_bucket(event_notifier_group->events_ht.table,
+ LTTNG_EVENT_HT_SIZE, event_name);
+ lttng_hlist_for_each_entry(event_priv, head, hlist_node) {
+ event_notifier_priv = container_of(event_priv, struct lttng_kernel_event_notifier_private, parent);
+
+ WARN_ON_ONCE(!event_priv->desc);
+ if (!strncmp(event_priv->desc->event_name, event_name,
LTTNG_KERNEL_ABI_SYM_NAME_LEN - 1)
&& event_notifier_group == event_notifier_priv->group
- && token == event_notifier_priv->parent.user_token) {
+ && token == event_priv->user_token) {
ret = -EEXIST;
goto exist;
}
event_notifier->parent.type = LTTNG_KERNEL_EVENT_TYPE_NOTIFIER;
event_notifier->priv->group = event_notifier_group;
- event_notifier->priv->parent.user_token = token;
- event_notifier->priv->error_counter_index = error_counter_index;
+ event_notifier->priv->parent.user_token = event_enabler->parent.user_token;
+ event_notifier->priv->error_counter_index = event_enabler->error_counter_index;
event_notifier->priv->num_captures = 0;
event_notifier->priv->parent.instrumentation = itype;
event_notifier->notification_send = lttng_event_notifier_notification_send;
* registration.
*/
smp_wmb();
- ret = lttng_kprobes_register_event(event_notifier_param->event.u.kprobe.symbol_name,
- event_notifier_param->event.u.kprobe.symbol_name,
- event_notifier_param->event.u.kprobe.offset,
- event_notifier_param->event.u.kprobe.addr,
+ ret = lttng_kprobes_register_event(event_param->u.kprobe.symbol_name,
+ event_param->u.kprobe.symbol_name,
+ event_param->u.kprobe.offset,
+ event_param->u.kprobe.addr,
&event_notifier->parent);
if (ret) {
ret = -EINVAL;
event_notifier->parent.enabled = 0;
event_notifier->priv->parent.registered = 0;
event_notifier->priv->parent.desc = event_desc;
- switch (event_notifier_param->event.u.syscall.entryexit) {
+ switch (event_param->u.syscall.entryexit) {
case LTTNG_KERNEL_ABI_SYSCALL_ENTRYEXIT:
ret = -EINVAL;
goto register_error;
event_notifier->priv->parent.u.syscall.entryexit = LTTNG_SYSCALL_EXIT;
break;
}
- switch (event_notifier_param->event.u.syscall.abi) {
+ switch (event_param->u.syscall.abi) {
case LTTNG_KERNEL_ABI_SYSCALL_ABI_ALL:
ret = -EINVAL;
goto register_error;
*/
smp_wmb();
- ret = lttng_uprobes_register_event(event_notifier_param->event.name,
- event_notifier_param->event.u.uprobe.fd,
+ ret = lttng_uprobes_register_event(event_param->name,
+ event_param->u.uprobe.fd,
&event_notifier->parent);
if (ret)
goto register_error;
}
list_add(&event_notifier->priv->node, &event_notifier_group->event_notifiers_head);
- hlist_add_head(&event_notifier->priv->hlist, head);
+ hlist_add_head(&event_notifier->priv->parent.hlist_node, head);
/*
* Clear the error counter bucket. The sessiond keeps track of which
return event;
}
-struct lttng_kernel_event_notifier *lttng_event_notifier_create(
- const struct lttng_kernel_event_desc *event_desc,
- uint64_t id, uint64_t error_counter_index,
- struct lttng_event_notifier_group *event_notifier_group,
- struct lttng_kernel_abi_event_notifier *event_notifier_param,
- enum lttng_kernel_abi_instrumentation itype)
+struct lttng_kernel_event_notifier *lttng_event_notifier_create(struct lttng_event_notifier_enabler *event_enabler,
+ const struct lttng_kernel_event_desc *event_desc)
{
struct lttng_kernel_event_notifier *event_notifier;
mutex_lock(&sessions_mutex);
- event_notifier = _lttng_event_notifier_create(event_desc, id,
- error_counter_index, event_notifier_group,
- event_notifier_param, itype);
+ event_notifier = _lttng_event_notifier_create(event_enabler, event_desc);
mutex_unlock(&sessions_mutex);
return event_notifier;
}
for (i = 0; i < probe_desc->nr_events; i++) {
int found = 0;
struct hlist_head *head;
- struct lttng_kernel_event_recorder_private *event_recorder_private;
+ struct lttng_kernel_event_recorder_private *event_recorder_priv;
struct lttng_kernel_event_recorder *event_recorder;
+ struct lttng_kernel_event_common_private *event_priv;
desc = probe_desc->event_desc[i];
if (!lttng_desc_match_enabler(desc,
head = utils_borrow_hash_table_bucket(
session->priv->events_ht.table, LTTNG_EVENT_HT_SIZE,
desc->event_name);
- lttng_hlist_for_each_entry(event_recorder_private, head, hlist) {
- if (event_recorder_private->parent.desc == desc
- && event_recorder_private->pub->chan == event_enabler->chan)
+ lttng_hlist_for_each_entry(event_priv, head, hlist_node) {
+ event_recorder_priv = container_of(event_priv, struct lttng_kernel_event_recorder_private, parent);
+ if (event_priv->desc == desc
+ && event_recorder_priv->pub->chan == event_enabler->chan)
found = 1;
}
if (found)
for (i = 0; i < probe_desc->nr_events; i++) {
int found = 0;
struct hlist_head *head;
- struct lttng_kernel_event_notifier_private *event_notifier_priv;
struct lttng_kernel_event_notifier *event_notifier;
+ struct lttng_kernel_event_common_private *event_priv;
desc = probe_desc->event_desc[i];
if (!lttng_desc_match_enabler(desc,
* Check if already created.
*/
head = utils_borrow_hash_table_bucket(
- event_notifier_group->event_notifiers_ht.table,
- LTTNG_EVENT_NOTIFIER_HT_SIZE, desc->event_name);
- lttng_hlist_for_each_entry(event_notifier_priv, head, hlist) {
- if (event_notifier_priv->parent.desc == desc
- && event_notifier_priv->parent.user_token == event_notifier_enabler->parent.user_token)
+ event_notifier_group->events_ht.table,
+ LTTNG_EVENT_HT_SIZE, desc->event_name);
+ lttng_hlist_for_each_entry(event_priv, head, hlist_node) {
+ if (event_priv->desc == desc
+ && event_priv->user_token == event_notifier_enabler->parent.user_token)
found = 1;
}
if (found)
/*
* We need to create a event_notifier for this event probe.
*/
- event_notifier = _lttng_event_notifier_create(desc,
- event_notifier_enabler->parent.user_token,
- event_notifier_enabler->error_counter_index,
- event_notifier_group, NULL,
- LTTNG_KERNEL_ABI_TRACEPOINT);
+ event_notifier = _lttng_event_notifier_create(event_notifier_enabler, desc);
if (IS_ERR(event_notifier)) {
printk(KERN_INFO "Unable to create event_notifier %s\n",
probe_desc->event_desc[i]->event_name);
struct lttng_event_notifier_enabler *event_notifier_enabler =
container_of(event_enabler, struct lttng_event_notifier_enabler, parent);
- list_del(&event_notifier_enabler->node);
lttng_enabler_destroy(event_enabler);
+ if (event_notifier_enabler->published)
+ list_del(&event_notifier_enabler->node);
kfree(event_notifier_enabler);
break;
}
}
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)
+ struct lttng_kernel_abi_event_notifier *event_notifier_param,
+ struct lttng_event_notifier_group *event_notifier_group)
{
struct lttng_event_notifier_enabler *event_notifier_enabler;
event_notifier_enabler->parent.enabled = 0;
event_notifier_enabler->parent.user_token = event_notifier_param->event.token;
event_notifier_enabler->group = event_notifier_group;
+ return event_notifier_enabler;
+}
+void lttng_event_notifier_enabler_group_add(struct lttng_event_notifier_group *event_notifier_group,
+ struct lttng_event_notifier_enabler *event_notifier_enabler)
+{
mutex_lock(&sessions_mutex);
list_add(&event_notifier_enabler->node, &event_notifier_enabler->group->enablers_head);
+ event_notifier_enabler->published = true;
lttng_event_notifier_group_sync_enablers(event_notifier_enabler->group);
-
mutex_unlock(&sessions_mutex);
-
- return event_notifier_enabler;
}
int lttng_event_notifier_enabler_enable(