X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=src%2Flttng-abi.c;h=5b6ef1f6e6d5de74514113b05a53678bf1cb071f;hb=92bc1e2318d93c9072ae79d7fd6a7c5953cb739e;hp=a9beda756d7bbee4b9127eaec6c9ebb65353045f;hpb=99f52fcce5865809584c1e022bca1409702ea292;p=lttng-modules.git diff --git a/src/lttng-abi.c b/src/lttng-abi.c index a9beda75..5b6ef1f6 100644 --- a/src/lttng-abi.c +++ b/src/lttng-abi.c @@ -37,10 +37,12 @@ #include #include #include +#include #include #include #include #include +#include #include #include #include @@ -53,7 +55,7 @@ static struct proc_dir_entry *lttng_proc_dentry; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0)) +#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,6,0)) static const struct proc_ops lttng_proc_ops; #else static const struct file_operations lttng_proc_ops; @@ -463,7 +465,7 @@ long lttng_ioctl(struct file *file, unsigned int cmd, unsigned long arg) } } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0)) +#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,6,0)) static const struct proc_ops lttng_proc_ops = { .proc_ioctl = lttng_ioctl, #ifdef CONFIG_COMPAT @@ -1724,8 +1726,8 @@ int lttng_abi_validate_event_param(struct lttng_kernel_event *event_param) switch (event_param->instrumentation) { case LTTNG_KERNEL_SYSCALL: switch (event_param->u.syscall.entryexit) { - case LTTNG_KERNEL_SYSCALL_ENTRY: - case LTTNG_KERNEL_SYSCALL_EXIT: + case LTTNG_KERNEL_SYSCALL_ENTRY: /* Fall-through */ + case LTTNG_KERNEL_SYSCALL_EXIT: /* Fall-through */ case LTTNG_KERNEL_SYSCALL_ENTRYEXIT: break; default: @@ -1745,14 +1747,24 @@ int lttng_abi_validate_event_param(struct lttng_kernel_event *event_param) } break; - case LTTNG_KERNEL_TRACEPOINT: /* Fallthrough */ - case LTTNG_KERNEL_KPROBE: /* Fallthrough */ - case LTTNG_KERNEL_KRETPROBE: /* Fallthrough */ - case LTTNG_KERNEL_NOOP: /* Fallthrough */ + case LTTNG_KERNEL_KRETPROBE: + switch (event_param->u.kretprobe.entryexit) { + case LTTNG_KERNEL_SYSCALL_ENTRYEXIT: + break; + case LTTNG_KERNEL_SYSCALL_ENTRY: /* Fall-through */ + case LTTNG_KERNEL_SYSCALL_EXIT: /* Fall-through */ + default: + return -EINVAL; + } + break; + + case LTTNG_KERNEL_TRACEPOINT: /* Fall-through */ + case LTTNG_KERNEL_KPROBE: /* Fall-through */ case LTTNG_KERNEL_UPROBE: break; - case LTTNG_KERNEL_FUNCTION: /* Fallthrough */ + case LTTNG_KERNEL_FUNCTION: /* Fall-through */ + case LTTNG_KERNEL_NOOP: /* Fall-through */ default: return -EINVAL; } @@ -1803,8 +1815,11 @@ int lttng_abi_create_event(struct file *channel_file, ret = lttng_abi_validate_event_param(event_param); if (ret) goto event_error; - if (event_param->instrumentation == LTTNG_KERNEL_TRACEPOINT - || event_param->instrumentation == LTTNG_KERNEL_SYSCALL) { + + switch (event_param->instrumentation) { + case LTTNG_KERNEL_TRACEPOINT: /* Fall-through */ + case LTTNG_KERNEL_SYSCALL: + { struct lttng_event_enabler *event_enabler; if (strutils_is_star_glob_pattern(event_param->name)) { @@ -1819,7 +1834,13 @@ int lttng_abi_create_event(struct file *channel_file, event_param, channel); } priv = event_enabler; - } else { + break; + } + + case LTTNG_KERNEL_KPROBE: /* Fall-through */ + case LTTNG_KERNEL_KRETPROBE: /* Fall-through */ + case LTTNG_KERNEL_UPROBE: + { struct lttng_event *event; /* @@ -1835,6 +1856,14 @@ int lttng_abi_create_event(struct file *channel_file, goto event_error; } priv = event; + break; + } + + case LTTNG_KERNEL_FUNCTION: /* Fall-through */ + case LTTNG_KERNEL_NOOP: /* Fall-through */ + default: + ret = -EINVAL; + goto event_error; } event_file->private_data = priv; fd_install(event_fd, event_file); @@ -2014,8 +2043,14 @@ int lttng_abi_create_event_notifier(struct file *event_notifier_group_file, goto refcount_error; } - if (event_notifier_param->event.instrumentation == LTTNG_KERNEL_TRACEPOINT - || event_notifier_param->event.instrumentation == LTTNG_KERNEL_SYSCALL) { + ret = lttng_abi_validate_event_param(&event_notifier_param->event); + if (ret) + goto event_notifier_error; + + switch (event_notifier_param->event.instrumentation) { + case LTTNG_KERNEL_TRACEPOINT: /* Fall-through */ + case LTTNG_KERNEL_SYSCALL: + { struct lttng_event_notifier_enabler *enabler; if (strutils_is_star_glob_pattern(event_notifier_param->event.name)) { @@ -2034,7 +2069,13 @@ int lttng_abi_create_event_notifier(struct file *event_notifier_group_file, event_notifier_param); } priv = enabler; - } else { + break; + } + + case LTTNG_KERNEL_KPROBE: /* Fall-through */ + case LTTNG_KERNEL_KRETPROBE: /* Fall-through */ + case LTTNG_KERNEL_UPROBE: + { struct lttng_event_notifier *event_notifier; /* @@ -2053,6 +2094,14 @@ int lttng_abi_create_event_notifier(struct file *event_notifier_group_file, goto event_notifier_error; } priv = event_notifier; + break; + } + + case LTTNG_KERNEL_FUNCTION: /* Fall-through */ + case LTTNG_KERNEL_NOOP: /* Fall-through */ + default: + ret = -EINVAL; + goto event_notifier_error; } event_notifier_file->private_data = priv; fd_install(event_notifier_fd, event_notifier_file); @@ -2144,8 +2193,13 @@ long lttng_abi_event_notifier_group_create_error_counter( goto counter_error; } - event_notifier_group->error_counter = counter; event_notifier_group->error_counter_len = counter_len; + /* + * store-release to publish error counter matches load-acquire + * 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); counter->file = counter_file; counter->owner = event_notifier_group->file;