X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Flttng-abi.c;h=caec803fe51e018f470ce03bb7003fbbaa73517f;hb=refs%2Fheads%2Fmaster;hp=7eafe2d09ff1403738ce00442ac18f458dd73606;hpb=44b1abdc77d0587d2b800584b7b6612a4fbcb96b;p=lttng-modules.git diff --git a/src/lttng-abi.c b/src/lttng-abi.c index 7eafe2d0..afd23373 100644 --- a/src/lttng-abi.c +++ b/src/lttng-abi.c @@ -23,6 +23,7 @@ * - Takes instrumentation source specific arguments. */ +#include #include #include #include @@ -36,9 +37,7 @@ #include #include #include -#include #include -#include #include #include #include @@ -99,7 +98,7 @@ int lttng_abi_create_session(void) session = lttng_session_create(); if (!session) return -ENOMEM; - session_fd = lttng_get_unused_fd(); + session_fd = get_unused_fd_flags(0); if (session_fd < 0) { ret = session_fd; goto fd_error; @@ -122,6 +121,7 @@ fd_error: return ret; } +static void event_notifier_send_notification_work_wakeup(struct irq_work *entry) { struct lttng_event_notifier_group *event_notifier_group = @@ -141,7 +141,7 @@ int lttng_abi_create_event_notifier_group(void) if (!event_notifier_group) return -ENOMEM; - event_notifier_group_fd = lttng_get_unused_fd(); + event_notifier_group_fd = get_unused_fd_flags(0); if (event_notifier_group_fd < 0) { ret = event_notifier_group_fd; goto fd_error; @@ -174,7 +174,7 @@ int lttng_abi_tracepoint_list(void) struct file *tracepoint_list_file; int file_fd, ret; - file_fd = lttng_get_unused_fd(); + file_fd = get_unused_fd_flags(0); if (file_fd < 0) { ret = file_fd; goto fd_error; @@ -214,7 +214,7 @@ int lttng_abi_syscall_list(void) struct file *syscall_list_file; int file_fd, ret; - file_fd = lttng_get_unused_fd(); + file_fd = get_unused_fd_flags(0); if (file_fd < 0) { ret = file_fd; goto fd_error; @@ -497,7 +497,7 @@ int lttng_abi_create_channel(struct file *session_file, int chan_fd; int ret = 0; - chan_fd = lttng_get_unused_fd(); + chan_fd = get_unused_fd_flags(0); if (chan_fd < 0) { ret = chan_fd; goto fd_error; @@ -550,7 +550,7 @@ int lttng_abi_create_channel(struct file *session_file, * We tolerate no failure path after channel creation. It will stay * invariant for the rest of the session. */ - chan = lttng_channel_create(session, transport_name, NULL, + chan = lttng_channel_buffer_create(session, transport_name, NULL, chan_param->subbuf_size, chan_param->num_subbuf, chan_param->switch_timer_interval, @@ -650,6 +650,8 @@ long lttng_counter_ioctl(struct file *file, unsigned int cmd, unsigned long arg) if (validate_zeroed_padding(local_counter_read.padding, sizeof(local_counter_read.padding))) return -EINVAL; + if (local_counter_read.index.number_dimensions > LTTNG_KERNEL_ABI_COUNTER_DIMENSION_MAX) + return -EINVAL; /* Cast all indexes into size_t. */ for (i = 0; i < local_counter_read.index.number_dimensions; i++) @@ -685,6 +687,8 @@ long lttng_counter_ioctl(struct file *file, unsigned int cmd, unsigned long arg) if (validate_zeroed_padding(local_counter_aggregate.padding, sizeof(local_counter_aggregate.padding))) return -EINVAL; + if (local_counter_aggregate.index.number_dimensions > LTTNG_KERNEL_ABI_COUNTER_DIMENSION_MAX) + return -EINVAL; /* Cast all indexes into size_t. */ for (i = 0; i < local_counter_aggregate.index.number_dimensions; i++) @@ -716,6 +720,8 @@ long lttng_counter_ioctl(struct file *file, unsigned int cmd, unsigned long arg) if (validate_zeroed_padding(local_counter_clear.padding, sizeof(local_counter_clear.padding))) return -EINVAL; + if (local_counter_clear.index.number_dimensions > LTTNG_KERNEL_ABI_COUNTER_DIMENSION_MAX) + return -EINVAL; /* Cast all indexes into size_t. */ for (i = 0; i < local_counter_clear.index.number_dimensions; i++) @@ -724,7 +730,6 @@ long lttng_counter_ioctl(struct file *file, unsigned int cmd, unsigned long arg) return lttng_kernel_counter_clear(counter, indexes); } default: - WARN_ON_ONCE(1); return -ENOSYS; } } @@ -1011,7 +1016,7 @@ ssize_t lttng_event_notifier_group_notif_read(struct file *filp, char __user *us /* Finish copy of previous record */ if (*ppos != 0) { - if (read_count < count) { + if (count != 0) { len = chan->iter.len_left; read_offset = *ppos; goto skip_get_next; @@ -1091,7 +1096,8 @@ nodata: chan->iter.len_left = 0; put_record: - lib_ring_buffer_put_current_record(buf); + if (*ppos == 0) + lib_ring_buffer_put_current_record(buf); return read_count; } @@ -1597,7 +1603,7 @@ int lttng_abi_create_stream_fd(struct file *channel_file, void *stream_priv, int stream_fd, ret; struct file *stream_file; - stream_fd = lttng_get_unused_fd(); + stream_fd = get_unused_fd_flags(0); if (stream_fd < 0) { ret = stream_fd; goto fd_error; @@ -1862,7 +1868,7 @@ int lttng_abi_create_event(struct file *channel_file, return -EINVAL; } - event_fd = lttng_get_unused_fd(); + event_fd = get_unused_fd_flags(0); if (event_fd < 0) { ret = event_fd; goto fd_error; @@ -1912,7 +1918,7 @@ int lttng_abi_create_event(struct file *channel_file, lttng_fallthrough; case LTTNG_KERNEL_ABI_UPROBE: { - struct lttng_kernel_event_recorder *event; + struct lttng_kernel_event_common *event; struct lttng_event_recorder_enabler *event_enabler; event_enabler = lttng_event_recorder_enabler_create(LTTNG_ENABLER_FORMAT_NAME, @@ -1925,14 +1931,14 @@ int lttng_abi_create_event(struct file *channel_file, * We tolerate no failure path after event creation. It * will stay invariant for the rest of the session. */ - event = lttng_kernel_event_recorder_create(event_enabler, NULL); - WARN_ON_ONCE(!event); + event = lttng_kernel_event_create(&event_enabler->parent, NULL); + WARN_ON_ONCE(IS_ERR(event)); lttng_event_enabler_destroy(&event_enabler->parent); if (IS_ERR(event)) { ret = PTR_ERR(event); goto event_error; } - priv = event; + priv = container_of(event, struct lttng_kernel_event_recorder, parent); break; } @@ -2096,7 +2102,7 @@ int lttng_abi_create_event_notifier(struct file *event_notifier_group_file, event_notifier_param->event.name[LTTNG_KERNEL_ABI_SYM_NAME_LEN - 1] = '\0'; - event_notifier_fd = lttng_get_unused_fd(); + event_notifier_fd = get_unused_fd_flags(0); if (event_notifier_fd < 0) { ret = event_notifier_fd; goto fd_error; @@ -2132,15 +2138,17 @@ int lttng_abi_create_event_notifier(struct file *event_notifier_group_file, * we create the special star globbing enabler. */ enabler = lttng_event_notifier_enabler_create( - event_notifier_group, LTTNG_ENABLER_FORMAT_STAR_GLOB, - event_notifier_param); + event_notifier_param, + event_notifier_group); } else { enabler = lttng_event_notifier_enabler_create( - event_notifier_group, LTTNG_ENABLER_FORMAT_NAME, - event_notifier_param); + event_notifier_param, + event_notifier_group); } + if (enabler) + lttng_event_notifier_enabler_group_add(event_notifier_group, enabler); priv = enabler; break; } @@ -2151,24 +2159,23 @@ int lttng_abi_create_event_notifier(struct file *event_notifier_group_file, lttng_fallthrough; case LTTNG_KERNEL_ABI_UPROBE: { - struct lttng_kernel_event_notifier *event_notifier; + struct lttng_kernel_event_common *event; + struct lttng_event_notifier_enabler *event_notifier_enabler; - /* - * We tolerate no failure path after event notifier creation. - * It will stay invariant for the rest of the session. - */ - event_notifier = lttng_event_notifier_create(NULL, - event_notifier_param->event.token, - event_notifier_param->error_counter_index, - event_notifier_group, - event_notifier_param, - event_notifier_param->event.instrumentation); - WARN_ON_ONCE(!event_notifier); - if (IS_ERR(event_notifier)) { - ret = PTR_ERR(event_notifier); + event_notifier_enabler = lttng_event_notifier_enabler_create(LTTNG_ENABLER_FORMAT_NAME, + event_notifier_param, event_notifier_group); + if (!event_notifier_enabler) { + ret = -ENOMEM; + goto event_notifier_error; + } + event = lttng_kernel_event_create(&event_notifier_enabler->parent, NULL); + WARN_ON_ONCE(IS_ERR(event)); + lttng_event_enabler_destroy(&event_notifier_enabler->parent); + if (IS_ERR(event)) { + ret = PTR_ERR(event); goto event_notifier_error; } - priv = event_notifier; + priv = container_of(event, struct lttng_kernel_event_notifier, parent); break; } @@ -2242,7 +2249,7 @@ long lttng_abi_event_notifier_group_create_error_counter( goto fd_error; } - counter_fd = lttng_get_unused_fd(); + counter_fd = get_unused_fd_flags(0); if (counter_fd < 0) { ret = counter_fd; goto fd_error; @@ -2276,7 +2283,7 @@ long lttng_abi_event_notifier_group_create_error_counter( * in record_error. Ensures the counter is created and the * error_counter_len is set before they are used. */ - lttng_smp_store_release(&event_notifier_group->error_counter, counter); + smp_store_release(&event_notifier_group->error_counter, counter); counter->file = counter_file; counter->owner = event_notifier_group->file; @@ -2527,12 +2534,12 @@ old_ctx_end: } case LTTNG_KERNEL_ABI_OLD_ENABLE: case LTTNG_KERNEL_ABI_ENABLE: - return lttng_channel_enable(channel); + return lttng_channel_enable(&channel->parent); case LTTNG_KERNEL_ABI_OLD_DISABLE: case LTTNG_KERNEL_ABI_DISABLE: - return lttng_channel_disable(channel); + return lttng_channel_disable(&channel->parent); case LTTNG_KERNEL_ABI_SYSCALL_MASK: - return lttng_channel_syscall_mask(channel, + return lttng_syscall_table_get_active_mask(&channel->priv->parent.syscall_table, (struct lttng_kernel_abi_syscall_mask __user *) arg); default: return -ENOIOCTLCMD; @@ -2570,6 +2577,7 @@ long lttng_metadata_ioctl(struct file *file, unsigned int cmd, unsigned long arg * @file: the file * @wait: poll table */ +static unsigned int lttng_channel_poll(struct file *file, poll_table *wait) { struct lttng_kernel_channel_buffer *channel = file->private_data;