X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=ltt-debugfs-abi.c;h=e192474d5bac68664039c222a30f48d0dedb0959;hb=17baffe29814f2508556e498ab8c41a192e76b67;hp=c5ca63253b45575cca7e9e2c1f69b8c5a2b16e8d;hpb=271b66812595fb4be4ce1cb2b8277d97b13d795e;p=lttng-modules.git diff --git a/ltt-debugfs-abi.c b/ltt-debugfs-abi.c index c5ca6325..e192474d 100644 --- a/ltt-debugfs-abi.c +++ b/ltt-debugfs-abi.c @@ -20,6 +20,8 @@ * - Takes an instrumentation source as parameter * - e.g. tracepoints, dynamic_probes... * - Takes instrumentation source specific arguments. + * + * Dual LGPL v2.1/GPL v2 license. */ #include @@ -95,6 +97,7 @@ int lttng_abi_tracepoint_list(void) ret = file_fd; goto fd_error; } + tracepoint_list_file = anon_inode_getfile("[lttng_session]", <tng_tracepoint_list_fops, NULL, O_RDWR); @@ -102,9 +105,18 @@ int lttng_abi_tracepoint_list(void) ret = PTR_ERR(tracepoint_list_file); goto file_error; } + ret = lttng_tracepoint_list_fops.open(NULL, tracepoint_list_file); + if (ret < 0) + goto open_error; fd_install(file_fd, tracepoint_list_file); + if (file_fd < 0) { + ret = file_fd; + goto fd_error; + } return file_fd; +open_error: + fput(tracepoint_list_file); file_error: put_unused_fd(file_fd); fd_error: @@ -126,6 +138,35 @@ long lttng_abi_tracer_version(struct file *file, return 0; } +static +long lttng_abi_add_context(struct file *file, + struct lttng_kernel_context __user *ucontext_param, + struct lttng_ctx **ctx, struct ltt_session *session) +{ + struct lttng_kernel_context context_param; + + if (session->been_active) + return -EPERM; + + if (copy_from_user(&context_param, ucontext_param, sizeof(context_param))) + return -EFAULT; + + switch (context_param.ctx) { + case LTTNG_KERNEL_CONTEXT_PID: + return lttng_add_pid_to_ctx(ctx); + case LTTNG_KERNEL_CONTEXT_PRIO: + return lttng_add_prio_to_ctx(ctx); + case LTTNG_KERNEL_CONTEXT_NICE: + return lttng_add_nice_to_ctx(ctx); + case LTTNG_KERNEL_CONTEXT_PERF_COUNTER: + return -ENOSYS; + case LTTNG_KERNEL_CONTEXT_COMM: + return lttng_add_comm_to_ctx(ctx); + default: + return -EINVAL; + } +} + /** * lttng_ioctl - lttng syscall through ioctl * @@ -284,6 +325,12 @@ fd_error: * This ioctl implements lttng commands: * LTTNG_KERNEL_CHANNEL * Returns a LTTng channel file descriptor + * LTTNG_KERNEL_SESSION_START + * Starts tracing session + * LTTNG_KERNEL_SESSION_STOP + * Stops tracing session + * LTTNG_KERNEL_METADATA + * Returns a LTTng metadata file descriptor * * The returned channel will be deleted when its file descriptor is closed. */ @@ -452,17 +499,25 @@ fd_error: * (typically, one event stream records events from one CPU) * LTTNG_KERNEL_EVENT * Returns an event file descriptor or failure. + * LTTNG_KERNEL_CONTEXT + * Prepend a context field to each event in the channel * * Channel and event file descriptors also hold a reference on the session. */ static long lttng_channel_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { + struct ltt_channel *channel = file->private_data; + switch (cmd) { case LTTNG_KERNEL_STREAM: return lttng_abi_open_stream(file); case LTTNG_KERNEL_EVENT: return lttng_abi_create_event(file, (struct lttng_kernel_event __user *) arg); + case LTTNG_KERNEL_CONTEXT: + return lttng_abi_add_context(file, + (struct lttng_kernel_context __user *) arg, + &channel->ctx, channel->session); default: return -ENOIOCTLCMD; } @@ -550,6 +605,37 @@ static const struct file_operations lttng_metadata_fops = { #endif }; +/** + * lttng_event_ioctl - lttng syscall through ioctl + * + * @file: the file + * @cmd: the command + * @arg: command arg + * + * This ioctl implements lttng commands: + * LTTNG_KERNEL_STREAM + * Returns an event stream file descriptor or failure. + * (typically, one event stream records events from one CPU) + * LTTNG_KERNEL_EVENT + * Returns an event file descriptor or failure. + * LTTNG_KERNEL_CONTEXT + * Prepend a context field to each record of this event + */ +static +long lttng_event_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + struct ltt_event *event = file->private_data; + + switch (cmd) { + case LTTNG_KERNEL_CONTEXT: + return lttng_abi_add_context(file, + (struct lttng_kernel_context __user *) arg, + &event->ctx, event->chan->session); + default: + return -ENOIOCTLCMD; + } +} + static int lttng_event_release(struct inode *inode, struct file *file) { @@ -563,6 +649,10 @@ int lttng_event_release(struct inode *inode, struct file *file) /* TODO: filter control ioctl */ static const struct file_operations lttng_event_fops = { .release = lttng_event_release, + .unlocked_ioctl = lttng_event_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl = lttng_event_ioctl, +#endif }; int __init ltt_debugfs_abi_init(void)