- if (hlist_empty(&chan->compat_sc_exit_unknown)) {
- const struct lttng_kernel_event_desc *desc =
- &__event_desc___compat_syscall_exit_unknown;
- struct lttng_kernel_event_recorder *event_recorder;
-
- memset(&ev, 0, sizeof(ev));
- strncpy(ev.name, desc->event_name, LTTNG_KERNEL_ABI_SYM_NAME_LEN);
- ev.name[LTTNG_KERNEL_ABI_SYM_NAME_LEN - 1] = '\0';
- ev.instrumentation = LTTNG_KERNEL_ABI_SYSCALL;
- ev.u.syscall.entryexit = LTTNG_KERNEL_ABI_SYSCALL_EXIT;
- ev.u.syscall.abi = LTTNG_KERNEL_ABI_SYSCALL_ABI_COMPAT;
- event_recorder = _lttng_kernel_event_recorder_create(chan, &ev, desc,
- ev.instrumentation);
- WARN_ON_ONCE(!event_recorder);
- if (IS_ERR(event_recorder)) {
- return PTR_ERR(event_recorder);
- }
- hlist_add_head(&event_recorder->priv->parent.u.syscall.node, &chan->compat_sc_exit_unknown);
- }
-
- if (hlist_empty(&chan->sc_exit_unknown)) {
- const struct lttng_kernel_event_desc *desc =
- &__event_desc___syscall_exit_unknown;
- struct lttng_kernel_event_recorder *event_recorder;
-
- memset(&ev, 0, sizeof(ev));
- strncpy(ev.name, desc->event_name, LTTNG_KERNEL_ABI_SYM_NAME_LEN);
- ev.name[LTTNG_KERNEL_ABI_SYM_NAME_LEN - 1] = '\0';
- ev.instrumentation = LTTNG_KERNEL_ABI_SYSCALL;
- ev.u.syscall.entryexit = LTTNG_KERNEL_ABI_SYSCALL_EXIT;
- ev.u.syscall.abi = LTTNG_KERNEL_ABI_SYSCALL_ABI_NATIVE;
- event_recorder = _lttng_kernel_event_recorder_create(chan, &ev, desc,
- ev.instrumentation);
- WARN_ON_ONCE(!event_recorder);
- if (IS_ERR(event_recorder)) {
- return PTR_ERR(event_recorder);
- }
- hlist_add_head(&event_recorder->priv->parent.u.syscall.node, &chan->sc_exit_unknown);
- }
-
- ret = lttng_create_syscall_event_if_missing(sc_table.table, sc_table.len,
- chan->sc_table, event_enabler, SC_TYPE_ENTRY);
- if (ret)
- return ret;
- ret = lttng_create_syscall_event_if_missing(sc_exit_table.table, sc_exit_table.len,
- chan->sc_exit_table, event_enabler, SC_TYPE_EXIT);
- if (ret)
- return ret;
-
-#ifdef CONFIG_COMPAT
- ret = lttng_create_syscall_event_if_missing(compat_sc_table.table, compat_sc_table.len,
- chan->compat_sc_table, event_enabler, SC_TYPE_COMPAT_ENTRY);
- if (ret)
- return ret;
- ret = lttng_create_syscall_event_if_missing(compat_sc_exit_table.table, compat_sc_exit_table.len,
- chan->compat_sc_exit_table, event_enabler, SC_TYPE_COMPAT_EXIT);
- if (ret)
- return ret;
-#endif
-
- if (!chan->sc_filter) {
- chan->sc_filter = kzalloc(sizeof(struct lttng_syscall_filter),
- GFP_KERNEL);
- if (!chan->sc_filter)
- return -ENOMEM;
- }
-
- if (!chan->sys_enter_registered) {
- ret = lttng_wrapper_tracepoint_probe_register("sys_enter",
- (void *) syscall_entry_event_probe, chan);
- if (ret)
- return ret;
- chan->sys_enter_registered = 1;
- }
- /*
- * We change the name of sys_exit tracepoint due to namespace
- * conflict with sys_exit syscall entry.
- */
- if (!chan->sys_exit_registered) {
- ret = lttng_wrapper_tracepoint_probe_register("sys_exit",
- (void *) syscall_exit_event_probe, chan);
- if (ret) {
- WARN_ON_ONCE(lttng_wrapper_tracepoint_probe_unregister("sys_enter",
- (void *) syscall_entry_event_probe, chan));
- return ret;
- }
- chan->sys_exit_registered = 1;
- }
- return ret;
-}
-
-/*
- * Should be called with sessions lock held.
- */
-int lttng_syscalls_register_event_notifier(
- struct lttng_event_notifier_enabler *event_notifier_enabler)
-{
- struct lttng_event_notifier_group *group = event_notifier_enabler->group;
- unsigned int i;
- int ret = 0;
-
- wrapper_vmalloc_sync_mappings();
-
- if (!group->event_notifier_syscall_dispatch) {
- group->event_notifier_syscall_dispatch =
- kzalloc(sizeof(struct hlist_head) * sc_table.len,
- GFP_KERNEL);
- if (!group->event_notifier_syscall_dispatch)
- return -ENOMEM;
-
- /* Initialize all list_head */
- for (i = 0; i < sc_table.len; i++)
- INIT_HLIST_HEAD(&group->event_notifier_syscall_dispatch[i]);
-
- /* Init the unknown syscall notifier list. */
- INIT_HLIST_HEAD(&group->event_notifier_unknown_syscall_dispatch);
- }
-
- if (!group->event_notifier_exit_syscall_dispatch) {
- group->event_notifier_exit_syscall_dispatch =
- kzalloc(sizeof(struct hlist_head) * sc_table.len,
- GFP_KERNEL);
- if (!group->event_notifier_exit_syscall_dispatch)
- return -ENOMEM;
-
- /* Initialize all list_head */
- for (i = 0; i < sc_table.len; i++)
- INIT_HLIST_HEAD(&group->event_notifier_exit_syscall_dispatch[i]);
-
- /* Init the unknown exit syscall notifier list. */
- INIT_HLIST_HEAD(&group->event_notifier_exit_unknown_syscall_dispatch);
- }
-
-#ifdef CONFIG_COMPAT
- if (!group->event_notifier_compat_syscall_dispatch) {
- group->event_notifier_compat_syscall_dispatch =
- kzalloc(sizeof(struct hlist_head) * compat_sc_table.len,
- GFP_KERNEL);
- if (!group->event_notifier_syscall_dispatch)
- return -ENOMEM;
-
- /* Initialize all list_head */
- for (i = 0; i < compat_sc_table.len; i++)
- INIT_HLIST_HEAD(&group->event_notifier_compat_syscall_dispatch[i]);
-
- /* Init the unknown syscall notifier list. */
- INIT_HLIST_HEAD(&group->event_notifier_compat_unknown_syscall_dispatch);
- }
-
- if (!group->event_notifier_exit_compat_syscall_dispatch) {
- group->event_notifier_exit_compat_syscall_dispatch =
- kzalloc(sizeof(struct hlist_head) * compat_sc_exit_table.len,
- GFP_KERNEL);
- if (!group->event_notifier_exit_syscall_dispatch)
- return -ENOMEM;
-
- /* Initialize all list_head */
- for (i = 0; i < compat_sc_exit_table.len; i++)
- INIT_HLIST_HEAD(&group->event_notifier_exit_compat_syscall_dispatch[i]);
-
- /* Init the unknown exit syscall notifier list. */
- INIT_HLIST_HEAD(&group->event_notifier_exit_compat_unknown_syscall_dispatch);
- }
-#endif
-
- if (!group->sc_filter) {
- group->sc_filter = kzalloc(sizeof(struct lttng_syscall_filter),
- GFP_KERNEL);
- if (!group->sc_filter)
- return -ENOMEM;
- }
-
- if (!group->sys_enter_registered) {
- ret = lttng_wrapper_tracepoint_probe_register("sys_enter",
- (void *) syscall_entry_event_notifier_probe, group);
- if (ret)
- return ret;
- group->sys_enter_registered = 1;
- }
-
- if (!group->sys_exit_registered) {
- ret = lttng_wrapper_tracepoint_probe_register("sys_exit",
- (void *) syscall_exit_event_notifier_probe, group);
- if (ret) {
- WARN_ON_ONCE(lttng_wrapper_tracepoint_probe_unregister("sys_enter",
- (void *) syscall_entry_event_notifier_probe, group));
- return ret;
- }
- group->sys_exit_registered = 1;
- }
-
- return ret;
-}