X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Fkernel-ctl%2Fkernel-ctl.c;h=878929ff0ab0bd94c0df18a4435e21d9caed72cf;hp=3d12df4177db3f686dc482562fab286473efd487;hb=refs%2Fheads%2Fsow-2019-0002-rev1;hpb=5226f1bc2f82f9c68e974a6e49a7bcdb547f6a55 diff --git a/src/common/kernel-ctl/kernel-ctl.c b/src/common/kernel-ctl/kernel-ctl.c index 3d12df417..878929ff0 100644 --- a/src/common/kernel-ctl/kernel-ctl.c +++ b/src/common/kernel-ctl/kernel-ctl.c @@ -1,20 +1,10 @@ /* - * Copyright (C) 2011 - Julien Desfossez - * Mathieu Desnoyers - * 2016 - Jérémie Galarneau + * Copyright (C) 2011 Julien Desfossez + * Copyright (C) 2011 Mathieu Desnoyers + * Copyright (C) 2016 Jérémie Galarneau * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2 only, - * as published by the Free Software Foundation. + * SPDX-License-Identifier: GPL-2.0-only * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #define _LGPL_SOURCE @@ -22,9 +12,11 @@ #include #include #include +#include #include #include #include +#include #include "kernel-ctl.h" #include "kernel-ioctl.h" @@ -89,10 +81,12 @@ int kernctl_create_session(int fd) /* open the metadata global channel */ int kernctl_open_metadata(int fd, struct lttng_channel_attr *chops) { - struct lttng_kernel_old_channel old_channel; struct lttng_kernel_channel channel; if (lttng_kernel_use_old_abi) { + struct lttng_kernel_old_channel old_channel; + + memset(&old_channel, 0, sizeof(old_channel)); old_channel.overwrite = chops->overwrite; old_channel.subbuf_size = chops->subbuf_size; old_channel.num_subbuf = chops->num_subbuf; @@ -111,6 +105,7 @@ int kernctl_open_metadata(int fd, struct lttng_channel_attr *chops) &old_channel); } + memset(&channel, 0, sizeof(channel)); channel.overwrite = chops->overwrite; channel.subbuf_size = chops->subbuf_size; channel.num_subbuf = chops->num_subbuf; @@ -225,11 +220,110 @@ int kernctl_list_tracker_pids(int fd) return LTTNG_IOCTL_NO_CHECK(fd, LTTNG_KERNEL_SESSION_LIST_TRACKER_PIDS); } -int kernctl_session_metadata_regenerate(int fd) +static enum lttng_kernel_tracker_type get_kernel_tracker_type( + enum lttng_tracker_type type) +{ + switch (type) { + case LTTNG_TRACKER_PID: + return LTTNG_KERNEL_TRACKER_PID; + case LTTNG_TRACKER_VPID: + return LTTNG_KERNEL_TRACKER_VPID; + case LTTNG_TRACKER_UID: + return LTTNG_KERNEL_TRACKER_UID; + case LTTNG_TRACKER_VUID: + return LTTNG_KERNEL_TRACKER_VUID; + case LTTNG_TRACKER_GID: + return LTTNG_KERNEL_TRACKER_GID; + case LTTNG_TRACKER_VGID: + return LTTNG_KERNEL_TRACKER_VGID; + default: + return LTTNG_KERNEL_TRACKER_UNKNOWN; + } +} + +int kernctl_track_id(int fd, enum lttng_tracker_type tracker_type, int id) +{ + struct lttng_kernel_tracker_args args; + + args.id = id; + args.type = get_kernel_tracker_type(tracker_type); + if (args.type == LTTNG_KERNEL_TRACKER_UNKNOWN) { + errno = EINVAL; + return -1; + } + return LTTNG_IOCTL_CHECK(fd, LTTNG_KERNEL_SESSION_TRACK_ID, &args); +} + +int kernctl_untrack_id(int fd, enum lttng_tracker_type tracker_type, int id) +{ + struct lttng_kernel_tracker_args args; + + args.id = id; + args.type = get_kernel_tracker_type(tracker_type); + if (args.type == LTTNG_KERNEL_TRACKER_UNKNOWN) { + errno = EINVAL; + return -1; + } + return LTTNG_IOCTL_CHECK(fd, LTTNG_KERNEL_SESSION_UNTRACK_ID, &args); +} + +int kernctl_list_tracker_ids(int fd, enum lttng_tracker_type tracker_type) +{ + struct lttng_kernel_tracker_args args; + + args.id = -1; + args.type = get_kernel_tracker_type(tracker_type); + if (args.type == LTTNG_KERNEL_TRACKER_UNKNOWN) { + errno = EINVAL; + return -1; + } + return LTTNG_IOCTL_NO_CHECK( + fd, LTTNG_KERNEL_SESSION_LIST_TRACKER_IDS, &args); +} + +int kernctl_session_regenerate_metadata(int fd) { return LTTNG_IOCTL_CHECK(fd, LTTNG_KERNEL_SESSION_METADATA_REGEN); } +int kernctl_session_regenerate_statedump(int fd) +{ + return LTTNG_IOCTL_CHECK(fd, LTTNG_KERNEL_SESSION_STATEDUMP); +} + +int kernctl_session_set_name(int fd, const char *name) +{ + int ret; + struct lttng_kernel_session_name session_name; + + ret = lttng_strncpy(session_name.name, name, sizeof(session_name.name)); + if (ret) { + goto end; + } + + ret = LTTNG_IOCTL_CHECK( + fd, LTTNG_KERNEL_SESSION_SET_NAME, &session_name); +end: + return ret; +} + +int kernctl_session_set_creation_time(int fd, time_t time) +{ + int ret; + struct lttng_kernel_session_creation_time creation_time; + + ret = time_to_iso8601_str(time, creation_time.iso8601, + sizeof(creation_time.iso8601)); + if (ret) { + goto end; + } + + ret = LTTNG_IOCTL_CHECK(fd, LTTNG_KERNEL_SESSION_SET_CREATION_TIME, + &creation_time); +end: + return ret; +} + int kernctl_create_stream(int fd) { return compat_ioctl_no_arg(fd, LTTNG_KERNEL_OLD_STREAM, @@ -241,6 +335,7 @@ int kernctl_create_event(int fd, struct lttng_kernel_event *ev) if (lttng_kernel_use_old_abi) { struct lttng_kernel_old_event old_event; + memset(&old_event, 0, sizeof(old_event)); memcpy(old_event.name, ev->name, sizeof(old_event.name)); old_event.instrumentation = ev->instrumentation; switch (ev->instrumentation) { @@ -278,6 +373,7 @@ int kernctl_add_context(int fd, struct lttng_kernel_context *ctx) if (lttng_kernel_use_old_abi) { struct lttng_kernel_old_context old_ctx; + memset(&old_ctx, 0, sizeof(old_ctx)); old_ctx.ctx = ctx->ctx; /* only type that uses the union */ if (ctx->ctx == LTTNG_KERNEL_CONTEXT_PERF_CPU_COUNTER) { @@ -321,7 +417,22 @@ int kernctl_stop_session(int fd) LTTNG_KERNEL_SESSION_STOP); } -int kernctl_filter(int fd, struct lttng_filter_bytecode *filter) +int kernctl_create_trigger_group(int fd) +{ + return LTTNG_IOCTL_NO_CHECK(fd, LTTNG_KERNEL_TRIGGER_GROUP_CREATE); +} + +int kernctl_create_trigger_group_notification_fd(int group_fd) +{ + return LTTNG_IOCTL_NO_CHECK(group_fd, LTTNG_KERNEL_TRIGGER_GROUP_NOTIFICATION_FD); +} + +int kernctl_create_trigger(int group_fd, struct lttng_kernel_trigger *trigger) +{ + return LTTNG_IOCTL_NO_CHECK(group_fd, LTTNG_KERNEL_TRIGGER_CREATE, trigger); +} + +int kernctl_filter(int fd, const struct lttng_filter_bytecode *filter) { struct lttng_kernel_filter_bytecode *kb; uint32_t len; @@ -340,6 +451,11 @@ int kernctl_filter(int fd, struct lttng_filter_bytecode *filter) return ret; } +int kernctl_add_callsite(int fd, struct lttng_kernel_event_callsite *callsite) +{ + return LTTNG_IOCTL_CHECK(fd, LTTNG_KERNEL_ADD_CALLSITE, callsite); +} + int kernctl_tracepoint_list(int fd) { return compat_ioctl_no_arg(fd, LTTNG_KERNEL_OLD_TRACEPOINT_LIST, @@ -393,40 +509,19 @@ int kernctl_wait_quiescent(int fd) LTTNG_KERNEL_WAIT_QUIESCENT); } -int kernctl_calibrate(int fd, struct lttng_kernel_calibrate *calibrate) +int kernctl_buffer_flush(int fd) { - int ret; - - if (lttng_kernel_use_old_abi == -1) { - ret = LTTNG_IOCTL_CHECK(fd, LTTNG_KERNEL_CALIBRATE, calibrate); - if (!ret) { - lttng_kernel_use_old_abi = 0; - goto end; - } - lttng_kernel_use_old_abi = 1; - } - if (lttng_kernel_use_old_abi) { - struct lttng_kernel_old_calibrate old_calibrate; - - old_calibrate.type = calibrate->type; - ret = LTTNG_IOCTL_CHECK(fd, LTTNG_KERNEL_OLD_CALIBRATE, - &old_calibrate); - if (ret) { - goto end; - } - calibrate->type = old_calibrate.type; - } else { - ret = LTTNG_IOCTL_CHECK(fd, LTTNG_KERNEL_CALIBRATE, calibrate); - } - -end: - return ret; + return LTTNG_IOCTL_CHECK(fd, RING_BUFFER_FLUSH); } +int kernctl_buffer_flush_empty(int fd) +{ + return LTTNG_IOCTL_CHECK(fd, RING_BUFFER_FLUSH_EMPTY); +} -int kernctl_buffer_flush(int fd) +int kernctl_buffer_clear(int fd) { - return LTTNG_IOCTL_CHECK(fd, RING_BUFFER_FLUSH); + return LTTNG_IOCTL_CHECK(fd, RING_BUFFER_CLEAR); } /* returns the version of the metadata. */ @@ -435,6 +530,10 @@ int kernctl_get_metadata_version(int fd, uint64_t *version) return LTTNG_IOCTL_CHECK(fd, RING_BUFFER_GET_METADATA_VERSION, version); } +int kernctl_metadata_cache_dump(int fd) +{ + return LTTNG_IOCTL_CHECK(fd, RING_BUFFER_METADATA_CACHE_DUMP); +} /* Buffer operations */ @@ -496,6 +595,16 @@ int kernctl_snapshot(int fd) return LTTNG_IOCTL_CHECK(fd, RING_BUFFER_SNAPSHOT); } +/* + * Get a snapshot of the current ring buffer producer and consumer positions, + * regardless of whether or not the two positions are contained within the + * same sub-buffer. + */ +int kernctl_snapshot_sample_positions(int fd) +{ + return LTTNG_IOCTL_CHECK(fd, RING_BUFFER_SNAPSHOT_SAMPLE_POSITIONS); +} + /* Get the consumer position (iteration start) */ int kernctl_snapshot_get_consumed(int fd, unsigned long *pos) {