- event_recorder = _lttng_kernel_event_recorder_create(chan, &ev, desc, ev.instrumentation);
- WARN_ON_ONCE(!event_recorder);
- if (IS_ERR(event_recorder)) {
- /*
- * If something goes wrong in event registration
- * after the first one, we have no choice but to
- * leave the previous events in there, until
- * deleted by session teardown.
- */
- return PTR_ERR(event_recorder);
- }
- hlist_add_head(&event_recorder->priv->parent.u.syscall.node, &chan_table[i]);
- }
- return 0;
-}
-
-/*
- * Should be called with sessions lock held.
- */
-int lttng_syscalls_register_event(struct lttng_event_enabler *event_enabler)
-{
- struct lttng_channel *chan = event_enabler->chan;
- struct lttng_kernel_abi_event ev;
- int ret;
-
- wrapper_vmalloc_sync_mappings();
-
- if (!chan->sc_table) {
- /* create syscall table mapping syscall to events */
- chan->sc_table = kzalloc(sizeof(struct lttng_kernel_event_recorder *)
- * sc_table.len, GFP_KERNEL);
- if (!chan->sc_table)
- return -ENOMEM;
- }
- if (!chan->sc_exit_table) {
- /* create syscall table mapping syscall to events */
- chan->sc_exit_table = kzalloc(sizeof(struct lttng_kernel_event_recorder *)
- * sc_exit_table.len, GFP_KERNEL);
- if (!chan->sc_exit_table)
- return -ENOMEM;
- }
-
-
-#ifdef CONFIG_COMPAT
- if (!chan->compat_sc_table) {
- /* create syscall table mapping compat syscall to events */
- chan->compat_sc_table = kzalloc(sizeof(struct lttng_kernel_event_recorder *)
- * compat_sc_table.len, GFP_KERNEL);
- if (!chan->compat_sc_table)
- return -ENOMEM;
- }
-
- if (!chan->compat_sc_exit_table) {
- /* create syscall table mapping compat syscall to events */
- chan->compat_sc_exit_table = kzalloc(sizeof(struct lttng_kernel_event_recorder *)
- * compat_sc_exit_table.len, GFP_KERNEL);
- if (!chan->compat_sc_exit_table)
- return -ENOMEM;
- }
-#endif
- if (hlist_empty(&chan->sc_unknown)) {
- const struct lttng_kernel_event_desc *desc =
- &__event_desc___syscall_entry_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_ENTRY;
- 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_unknown);
- }
-
- if (hlist_empty(&chan->sc_compat_unknown)) {
- const struct lttng_kernel_event_desc *desc =
- &__event_desc___compat_syscall_entry_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_ENTRY;
- 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);