X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=src%2Flttng-abi.c;h=472541a2b89ba5905bd1cdefbd6b2bcd2d50f808;hb=a27c8df7d7ff43a3bba67e8b0ea29ebbf29f674e;hp=6a1954d3e918c6be6b5a2317459bf15fbc20cb26;hpb=6048044feeeb7edc3e928aed5d9b1c529fc3fb47;p=lttng-modules.git diff --git a/src/lttng-abi.c b/src/lttng-abi.c index 6a1954d3..472541a2 100644 --- a/src/lttng-abi.c +++ b/src/lttng-abi.c @@ -23,6 +23,7 @@ * - Takes instrumentation source specific arguments. */ +#include #include #include #include @@ -38,7 +39,6 @@ #include #include #include -#include #include #include #include @@ -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; } @@ -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); - lttng_event_enabler_destroy(event_enabler); + 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; } @@ -1987,9 +1993,9 @@ long lttng_event_notifier_enabler_ioctl(struct file *file, unsigned int cmd, uns switch (cmd) { case LTTNG_KERNEL_ABI_ENABLE: - return lttng_event_notifier_enabler_enable(event_notifier_enabler); + return lttng_event_enabler_enable(&event_notifier_enabler->parent); case LTTNG_KERNEL_ABI_DISABLE: - return lttng_event_notifier_enabler_disable(event_notifier_enabler); + return lttng_event_enabler_disable(&event_notifier_enabler->parent); case LTTNG_KERNEL_ABI_FILTER: return lttng_event_enabler_attach_filter_bytecode(&event_notifier_enabler->parent, (struct lttng_kernel_abi_filter_bytecode __user *) arg); @@ -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; } @@ -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; @@ -2714,10 +2721,10 @@ long lttng_event_recorder_enabler_ioctl(struct file *file, unsigned int cmd, uns } case LTTNG_KERNEL_ABI_OLD_ENABLE: case LTTNG_KERNEL_ABI_ENABLE: - return lttng_event_enabler_enable(event_enabler); + return lttng_event_enabler_enable(&event_enabler->parent); case LTTNG_KERNEL_ABI_OLD_DISABLE: case LTTNG_KERNEL_ABI_DISABLE: - return lttng_event_enabler_disable(event_enabler); + return lttng_event_enabler_disable(&event_enabler->parent); case LTTNG_KERNEL_ABI_FILTER: return lttng_event_enabler_attach_filter_bytecode(&event_enabler->parent, (struct lttng_kernel_abi_filter_bytecode __user *) arg);