* - Takes instrumentation source specific arguments.
*/
+#include <asm/barrier.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/anon_inodes.h>
#include <ringbuffer/frontend.h>
#include <wrapper/compiler_attributes.h>
#include <wrapper/poll.h>
-#include <wrapper/file.h>
#include <wrapper/kref.h>
-#include <wrapper/barrier.h>
#include <lttng/string-utils.h>
#include <lttng/abi.h>
#include <lttng/abi-old.h>
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;
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;
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;
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;
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;
* 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,
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++)
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++)
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++)
return lttng_kernel_counter_clear(counter, indexes);
}
default:
- WARN_ON_ONCE(1);
return -ENOSYS;
}
}
/* 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;
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;
}
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;
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;
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,
* 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;
}
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);
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;
* 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;
}
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;
}
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;
* 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;
}
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;
}
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);