X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=lttng-abi.c;h=381a73904dfe60e6e6d0a8bc66a0cecf5fd65bf8;hb=ebfdc61210a82cb0d2015fad92359a97a75d49ce;hp=1cc9510110dbc216ecf02c4ca8157dfc8f12a78e;hpb=abc0446a8da1fe7cc09a546389cbcc932b265520;p=lttng-modules.git diff --git a/lttng-abi.c b/lttng-abi.c index 1cc95101..381a7390 100644 --- a/lttng-abi.c +++ b/lttng-abi.c @@ -118,7 +118,7 @@ int lttng_abi_tracepoint_list(void) goto fd_error; } - tracepoint_list_file = anon_inode_getfile("[lttng_session]", + tracepoint_list_file = anon_inode_getfile("[lttng_tracepoint_list]", <tng_tracepoint_list_fops, NULL, O_RDWR); if (IS_ERR(tracepoint_list_file)) { @@ -151,6 +151,13 @@ void lttng_abi_tracer_version(struct lttng_kernel_tracer_version *v) v->patchlevel = LTTNG_MODULES_PATCHLEVEL_VERSION; } +static +void lttng_abi_tracer_abi_version(struct lttng_kernel_tracer_abi_version *v) +{ + v->major = LTTNG_MODULES_ABI_MAJOR_VERSION; + v->minor = LTTNG_MODULES_ABI_MINOR_VERSION; +} + static long lttng_abi_add_context(struct file *file, struct lttng_kernel_context *context_param, @@ -208,6 +215,8 @@ long lttng_abi_add_context(struct file *file, * Returns a file descriptor listing available tracepoints * LTTNG_KERNEL_WAIT_QUIESCENT * Returns after all previously running probes have completed + * LTTNG_KERNEL_TRACER_ABI_VERSION + * Returns the LTTng kernel tracer ABI version * * The returned session will be deleted when its file descriptor is closed. */ @@ -241,7 +250,19 @@ long lttng_ioctl(struct file *file, unsigned int cmd, unsigned long arg) (struct lttng_kernel_tracer_version __user *) arg; lttng_abi_tracer_version(&version); - + + if (copy_to_user(uversion, &version, sizeof(version))) + return -EFAULT; + return 0; + } + case LTTNG_KERNEL_TRACER_ABI_VERSION: + { + struct lttng_kernel_tracer_abi_version version; + struct lttng_kernel_tracer_abi_version *uversion = + (struct lttng_kernel_tracer_abi_version __user *) arg; + + lttng_abi_tracer_abi_version(&version); + if (copy_to_user(uversion, &version, sizeof(version))) return -EFAULT; return 0; @@ -249,6 +270,8 @@ long lttng_ioctl(struct file *file, unsigned int cmd, unsigned long arg) case LTTNG_KERNEL_OLD_TRACEPOINT_LIST: case LTTNG_KERNEL_TRACEPOINT_LIST: return lttng_abi_tracepoint_list(); + case LTTNG_KERNEL_SYSCALL_LIST: + return lttng_abi_syscall_list(); case LTTNG_KERNEL_OLD_WAIT_QUIESCENT: case LTTNG_KERNEL_WAIT_QUIESCENT: synchronize_trace(); @@ -841,6 +864,7 @@ int lttng_abi_open_metadata_stream(struct file *channel_file) metadata_stream->priv = buf; stream_priv = metadata_stream; metadata_stream->transport = channel->transport; + mutex_init(&metadata_stream->lock); /* * Since life-time of metadata cache differs from that of @@ -924,15 +948,24 @@ int lttng_abi_create_event(struct file *channel_file, atomic_long_inc(&channel_file->f_count); break; case LTTNG_KERNEL_SYSCALL: - /* - * Only all-syscall tracing supported for now. - */ - if (event_param->name[0] != '\0') - return -EINVAL; ret = lttng_syscalls_register(channel, NULL); if (ret) goto fd_error; event_fd = 0; + if (event_param->u.syscall.enable) { + ret = lttng_syscall_filter_enable(channel, + event_param->name[0] == '\0' ? + NULL : event_param->name); + if (ret) + goto fd_error; + + } else { + ret = lttng_syscall_filter_disable(channel, + event_param->name[0] == '\0' ? + NULL : event_param->name); + if (ret) + goto fd_error; + } break; } return event_fd; @@ -1121,6 +1154,9 @@ old_ctx_end: case LTTNG_KERNEL_OLD_DISABLE: case LTTNG_KERNEL_DISABLE: return lttng_channel_disable(channel); + case LTTNG_KERNEL_SYSCALL_MASK: + return lttng_channel_syscall_mask(channel, + (struct lttng_kernel_syscall_mask __user *) arg); default: return -ENOIOCTLCMD; } @@ -1347,7 +1383,7 @@ static long lttng_stream_ring_buffer_ioctl(struct file *filp, struct lib_ring_buffer *buf = filp->private_data; struct channel *chan = buf->backend.chan; const struct lib_ring_buffer_config *config = &chan->backend.config; - struct lttng_channel *lttng_chan = channel_get_private(chan); + const struct lttng_channel_ops *ops = chan->backend.priv_ops; int ret; if (atomic_read(&chan->record_disabled)) @@ -1358,9 +1394,7 @@ static long lttng_stream_ring_buffer_ioctl(struct file *filp, { uint64_t ts; - if (!lttng_chan->ops) - goto error; - ret = lttng_chan->ops->timestamp_begin(config, buf, &ts); + ret = ops->timestamp_begin(config, buf, &ts); if (ret < 0) goto error; return put_u64(ts, arg); @@ -1369,9 +1403,7 @@ static long lttng_stream_ring_buffer_ioctl(struct file *filp, { uint64_t ts; - if (!lttng_chan->ops) - goto error; - ret = lttng_chan->ops->timestamp_end(config, buf, &ts); + ret = ops->timestamp_end(config, buf, &ts); if (ret < 0) goto error; return put_u64(ts, arg); @@ -1380,9 +1412,7 @@ static long lttng_stream_ring_buffer_ioctl(struct file *filp, { uint64_t ed; - if (!lttng_chan->ops) - goto error; - ret = lttng_chan->ops->events_discarded(config, buf, &ed); + ret = ops->events_discarded(config, buf, &ed); if (ret < 0) goto error; return put_u64(ed, arg); @@ -1391,9 +1421,7 @@ static long lttng_stream_ring_buffer_ioctl(struct file *filp, { uint64_t cs; - if (!lttng_chan->ops) - goto error; - ret = lttng_chan->ops->content_size(config, buf, &cs); + ret = ops->content_size(config, buf, &cs); if (ret < 0) goto error; return put_u64(cs, arg); @@ -1402,9 +1430,7 @@ static long lttng_stream_ring_buffer_ioctl(struct file *filp, { uint64_t ps; - if (!lttng_chan->ops) - goto error; - ret = lttng_chan->ops->packet_size(config, buf, &ps); + ret = ops->packet_size(config, buf, &ps); if (ret < 0) goto error; return put_u64(ps, arg); @@ -1413,9 +1439,7 @@ static long lttng_stream_ring_buffer_ioctl(struct file *filp, { uint64_t si; - if (!lttng_chan->ops) - goto error; - ret = lttng_chan->ops->stream_id(config, buf, &si); + ret = ops->stream_id(config, buf, &si); if (ret < 0) goto error; return put_u64(si, arg); @@ -1424,9 +1448,7 @@ static long lttng_stream_ring_buffer_ioctl(struct file *filp, { uint64_t ts; - if (!lttng_chan->ops) - goto error; - ret = lttng_chan->ops->current_timestamp(config, buf, &ts); + ret = ops->current_timestamp(config, buf, &ts); if (ret < 0) goto error; return put_u64(ts, arg); @@ -1447,7 +1469,7 @@ static long lttng_stream_ring_buffer_compat_ioctl(struct file *filp, struct lib_ring_buffer *buf = filp->private_data; struct channel *chan = buf->backend.chan; const struct lib_ring_buffer_config *config = &chan->backend.config; - struct lttng_channel *lttng_chan = channel_get_private(chan); + const struct lttng_channel_ops *ops = chan->backend.priv_ops; int ret; if (atomic_read(&chan->record_disabled)) @@ -1458,9 +1480,7 @@ static long lttng_stream_ring_buffer_compat_ioctl(struct file *filp, { uint64_t ts; - if (!lttng_chan->ops) - goto error; - ret = lttng_chan->ops->timestamp_begin(config, buf, &ts); + ret = ops->timestamp_begin(config, buf, &ts); if (ret < 0) goto error; return put_u64(ts, arg); @@ -1469,9 +1489,7 @@ static long lttng_stream_ring_buffer_compat_ioctl(struct file *filp, { uint64_t ts; - if (!lttng_chan->ops) - goto error; - ret = lttng_chan->ops->timestamp_end(config, buf, &ts); + ret = ops->timestamp_end(config, buf, &ts); if (ret < 0) goto error; return put_u64(ts, arg); @@ -1480,9 +1498,7 @@ static long lttng_stream_ring_buffer_compat_ioctl(struct file *filp, { uint64_t ed; - if (!lttng_chan->ops) - goto error; - ret = lttng_chan->ops->events_discarded(config, buf, &ed); + ret = ops->events_discarded(config, buf, &ed); if (ret < 0) goto error; return put_u64(ed, arg); @@ -1491,9 +1507,7 @@ static long lttng_stream_ring_buffer_compat_ioctl(struct file *filp, { uint64_t cs; - if (!lttng_chan->ops) - goto error; - ret = lttng_chan->ops->content_size(config, buf, &cs); + ret = ops->content_size(config, buf, &cs); if (ret < 0) goto error; return put_u64(cs, arg); @@ -1502,9 +1516,7 @@ static long lttng_stream_ring_buffer_compat_ioctl(struct file *filp, { uint64_t ps; - if (!lttng_chan->ops) - goto error; - ret = lttng_chan->ops->packet_size(config, buf, &ps); + ret = ops->packet_size(config, buf, &ps); if (ret < 0) goto error; return put_u64(ps, arg); @@ -1513,9 +1525,7 @@ static long lttng_stream_ring_buffer_compat_ioctl(struct file *filp, { uint64_t si; - if (!lttng_chan->ops) - goto error; - ret = lttng_chan->ops->stream_id(config, buf, &si); + ret = ops->stream_id(config, buf, &si); if (ret < 0) goto error; return put_u64(si, arg); @@ -1524,9 +1534,7 @@ static long lttng_stream_ring_buffer_compat_ioctl(struct file *filp, { uint64_t ts; - if (!lttng_chan->ops) - goto error; - ret = lttng_chan->ops->current_timestamp(config, buf, &ts); + ret = ops->current_timestamp(config, buf, &ts); if (ret < 0) goto error; return put_u64(ts, arg); @@ -1583,7 +1591,8 @@ error: return ret; } -void __exit lttng_abi_exit(void) +/* No __exit annotation because used by init error path too. */ +void lttng_abi_exit(void) { if (lttng_proc_dentry) remove_proc_entry("lttng", NULL);