X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fkernel.c;h=aa51649783f64c0e324c0090c42033cdbbb41f7a;hb=6faa26cafc21ce8d5b8f20ae4d2682092fd74b03;hp=570747f183ac96f479fd0a7480919b27345221bd;hpb=a969e1019813f1e2354fe57c8393f6268d943414;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/kernel.c b/src/bin/lttng-sessiond/kernel.c index 570747f18..aa5164978 100644 --- a/src/bin/lttng-sessiond/kernel.c +++ b/src/bin/lttng-sessiond/kernel.c @@ -15,9 +15,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#define _GNU_SOURCE #define _LGPL_SOURCE -#include #include #include #include @@ -50,17 +48,24 @@ int kernel_add_channel_context(struct ltt_kernel_channel *chan, DBG("Adding context to channel %s", chan->channel->name); ret = kernctl_add_context(chan->fd, &ctx->ctx); if (ret < 0) { - if (errno != EEXIST) { - PERROR("add context ioctl"); - } else { + switch (-ret) { + case ENOSYS: + /* Exists but not available for this kernel */ + ret = LTTNG_ERR_KERN_CONTEXT_UNAVAILABLE; + goto error; + case EEXIST: /* If EEXIST, we just ignore the error */ ret = 0; + goto end; + default: + PERROR("add context ioctl"); + ret = LTTNG_ERR_KERN_CONTEXT_FAIL; + goto error; } - goto error; } +end: cds_list_add_tail(&ctx->list, &chan->ctx_list); - return 0; error: @@ -197,7 +202,7 @@ int kernel_create_event(struct lttng_event *ev, ret = kernctl_create_event(channel->fd, event->event); if (ret < 0) { - switch (errno) { + switch (-ret) { case EEXIST: break; case ENOSYS: @@ -209,7 +214,6 @@ int kernel_create_event(struct lttng_event *ev, default: PERROR("create event ioctl"); } - ret = -errno; goto free_event; } @@ -230,7 +234,7 @@ int kernel_create_event(struct lttng_event *ev, ret = kernctl_enable(event->fd); if (ret < 0) { - switch (errno) { + switch (-ret) { case EEXIST: ret = LTTNG_ERR_KERN_EVENT_EXIST; break; @@ -277,7 +281,6 @@ int kernel_disable_channel(struct ltt_kernel_channel *chan) ret = kernctl_disable(chan->fd); if (ret < 0) { PERROR("disable chan ioctl"); - ret = errno; goto error; } @@ -300,7 +303,7 @@ int kernel_enable_channel(struct ltt_kernel_channel *chan) assert(chan); ret = kernctl_enable(chan->fd); - if (ret < 0 && errno != EEXIST) { + if (ret < 0 && ret != -EEXIST) { PERROR("Enable kernel chan"); goto error; } @@ -325,7 +328,7 @@ int kernel_enable_event(struct ltt_kernel_event *event) ret = kernctl_enable(event->fd); if (ret < 0) { - switch (errno) { + switch (-ret) { case EEXIST: ret = LTTNG_ERR_KERN_EVENT_EXIST; break; @@ -356,7 +359,7 @@ int kernel_disable_event(struct ltt_kernel_event *event) ret = kernctl_disable(event->fd); if (ret < 0) { - switch (errno) { + switch (-ret) { case EEXIST: ret = LTTNG_ERR_KERN_EVENT_EXIST; break; @@ -379,16 +382,46 @@ error: int kernel_track_pid(struct ltt_kernel_session *session, int pid) { + int ret; + DBG("Kernel track PID %d for session id %" PRIu64 ".", pid, session->id); - return kernctl_track_pid(session->fd, pid); + ret = kernctl_track_pid(session->fd, pid); + if (!ret) { + return LTTNG_OK; + } + switch (-ret) { + case EINVAL: + return LTTNG_ERR_INVALID; + case ENOMEM: + return LTTNG_ERR_NOMEM; + case EEXIST: + return LTTNG_ERR_PID_TRACKED; + default: + return LTTNG_ERR_UNK; + } } int kernel_untrack_pid(struct ltt_kernel_session *session, int pid) { + int ret; + DBG("Kernel untrack PID %d for session id %" PRIu64 ".", pid, session->id); - return kernctl_untrack_pid(session->fd, pid); + ret = kernctl_untrack_pid(session->fd, pid); + if (!ret) { + return LTTNG_OK; + } + switch (-ret) { + case EINVAL: + return LTTNG_ERR_INVALID; + case ENOMEM: + return LTTNG_ERR_NOMEM; + case ENOENT: + return LTTNG_ERR_PID_NOT_TRACKED; + default: + return LTTNG_ERR_UNK; + } } ssize_t kernel_list_tracker_pids(struct ltt_kernel_session *session, @@ -543,25 +576,6 @@ void kernel_wait_quiescent(int fd) } } -/* - * Kernel calibrate - */ -int kernel_calibrate(int fd, struct lttng_kernel_calibrate *calibrate) -{ - int ret; - - assert(calibrate); - - ret = kernctl_calibrate(fd, calibrate); - if (ret < 0) { - PERROR("calibrate ioctl"); - return -1; - } - - return 0; -} - - /* * Force flush buffer of metadata. */ @@ -800,7 +814,7 @@ int kernel_validate_version(int tracer_fd) ret = kernctl_tracer_version(tracer_fd, &version); if (ret < 0) { - ERR("Failed at getting the lttng-modules version"); + ERR("Failed to retrieve the lttng-modules version"); goto error; } @@ -812,11 +826,11 @@ int kernel_validate_version(int tracer_fd) } ret = kernctl_tracer_abi_version(tracer_fd, &abi_version); if (ret < 0) { - ERR("Failed at getting lttng-modules ABI version"); + ERR("Failed to retrieve lttng-modules ABI version"); goto error; } if (abi_version.major != LTTNG_MODULES_ABI_MAJOR_VERSION) { - ERR("Kernel tracer ABI version (%d.%d) is not compatible with expected ABI major version (%d.*)", + ERR("Kernel tracer ABI version (%d.%d) does not match the expected ABI major version (%d.*)", abi_version.major, abi_version.minor, LTTNG_MODULES_ABI_MAJOR_VERSION); goto error; @@ -830,6 +844,7 @@ error_version: ret = -1; error: + ERR("Kernel tracer version check failed; kernel tracing will not be available"); return ret; }