From 16421f6edd83b37e777b55add8396a91afcbb08a Mon Sep 17 00:00:00 2001 From: David Goulet Date: Fri, 6 May 2011 13:17:49 -0400 Subject: [PATCH] Initial import of libkernelctl and data structures First code import of the new libkernelctl that replaces ltt-contol used to interact with the LTTng kernel tracer. Signed-off-by: David Goulet Signed-off-by: Julien Desfossez --- include/lttng/lttng.h | 23 ++++++++ libkernelctl/kernel-ioctl.h | 59 +++++++++++++++++++ libkernelctl/libkernelctl.c | 112 +++++++++++++++++++++++++++++++++++- libkernelctl/libkernelctl.h | 24 +++++++- 4 files changed, 216 insertions(+), 2 deletions(-) create mode 100644 libkernelctl/kernel-ioctl.h diff --git a/include/lttng/lttng.h b/include/lttng/lttng.h index e88e22b07..3bb245239 100644 --- a/include/lttng/lttng.h +++ b/include/lttng/lttng.h @@ -20,6 +20,7 @@ #define _LIBLTTNGCTL_H #include +#include #include /* Default unix group name for tracing. @@ -36,6 +37,8 @@ /* UUID short string version length (including \0) */ #define UUID_SHORT_STR_LEN 9 +typedef uint64_t u64; + /* Trace type for lttng_trace. */ enum lttng_trace_type { @@ -57,6 +60,26 @@ struct lttng_trace { enum lttng_trace_type type; }; +/* + * LTTng DebugFS ABI structures. + */ +enum lttng_instrum_type { + INSTRUM_TRACEPOINTS, +}; + +struct lttng_channel { + int overwrite; /* 1: overwrite, 0: discard */ + u64 subbuf_size; + u64 num_subbuf; + unsigned int switch_timer_interval; + unsigned int read_timer_interval; +}; + +struct lttng_event { + enum lttng_instrum_type itype; + char name[]; +}; + extern int lttng_create_session(char *name, uuid_t *session_id); extern int lttng_destroy_session(uuid_t *uuid); extern int lttng_connect_sessiond(void); diff --git a/libkernelctl/kernel-ioctl.h b/libkernelctl/kernel-ioctl.h new file mode 100644 index 000000000..bed6f5934 --- /dev/null +++ b/libkernelctl/kernel-ioctl.h @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2011 - Julien Desfossez + * Mathieu Desnoyers + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef _LTT_KERNEL_IOCTL_H +#define _LTT_KERNEL_IOCTL_H + +/* Get a snapshot of the current ring buffer producer and consumer positions */ +#define RING_BUFFER_SNAPSHOT _IO(0xF6, 0x00) +/* Get the consumer position (iteration start) */ +#define RING_BUFFER_SNAPSHOT_GET_CONSUMED _IOR(0xF6, 0x01, unsigned long) +/* Get the producer position (iteration end) */ +#define RING_BUFFER_SNAPSHOT_GET_PRODUCED _IOR(0xF6, 0x02, unsigned long) +/* Get exclusive read access to the specified sub-buffer position */ +#define RING_BUFFER_GET_SUBBUF _IOW(0xF6, 0x03, unsigned long) +/* Release exclusive sub-buffer access */ +#define RING_BUFFER_PUT_SUBBUF _IO(0xF6, 0x04) + +/* Get exclusive read access to the next sub-buffer that can be read. */ +#define RING_BUFFER_GET_NEXT_SUBBUF _IO(0xF6, 0x05) +/* Release exclusive sub-buffer access, move consumer forward. */ +#define RING_BUFFER_PUT_NEXT_SUBBUF _IO(0xF6, 0x06) +/* returns the size of the current sub-buffer, without padding (for mmap). */ +#define RING_BUFFER_GET_SUBBUF_SIZE _IOR(0xF6, 0x07, unsigned long) +/* returns the size of the current sub-buffer, with padding (for splice). */ +#define RING_BUFFER_GET_PADDED_SUBBUF_SIZE _IOR(0xF6, 0x08, unsigned long) +/* returns the maximum size for sub-buffers. */ +#define RING_BUFFER_GET_MAX_SUBBUF_SIZE _IOR(0xF6, 0x09, unsigned long) +/* returns the length to mmap. */ +#define RING_BUFFER_GET_MMAP_LEN _IOR(0xF6, 0x0A, unsigned long) +/* returns the offset of the subbuffer belonging to the mmap reader. */ +#define RING_BUFFER_GET_MMAP_READ_OFFSET _IOR(0xF6, 0x0B, unsigned long) + +/* Create session LTTNG_SESSION */ +#define KERNEL_IO_CREATE_SESSION _IO(0xF6, 0x40) +#define KERNEL_IO_SESSION_START _IO(0xF6, 0x41) +#define KERNEL_IO_SESSION_STOP _IO(0xF6, 0x42) + +/* Create channel LTTNG_CHANNEL */ +#define KERNEL_IO_CREATE_CHANNEL _IOW(0xF6, 0x43, struct lttng_channel) +#define KERNEL_IO_CREATE_STREAM _IO(0xF6, 0x44) +#define KERNEL_IO_CREATE_EVENT _IOW(0xF6, 0x45, struct lttng_event) + +#endif /* _LTT_KERNEL_IOCTL_H */ diff --git a/libkernelctl/libkernelctl.c b/libkernelctl/libkernelctl.c index c29d4ae0e..e99e777c3 100644 --- a/libkernelctl/libkernelctl.c +++ b/libkernelctl/libkernelctl.c @@ -1,5 +1,6 @@ /* - * Copyright (C) 2011 - David Goulet + * Copyright (C) 2011 - Julien Desfossez + * Mathieu Desnoyers * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -15,3 +16,112 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#include + +#include "kernel-ioctl.h" +#include "libkernelctl.h" +#include "lttngerr.h" + +int kernctl_create_channel(int fd, struct lttng_channel *chops) +{ + return ioctl(fd, KERNEL_IO_CREATE_CHANNEL, chops); +} + +int kernctl_create_event(int fd, struct lttng_event *ev) +{ + return ioctl(fd, KERNEL_IO_CREATE_EVENT, ev); +} + +int kernctl_create_session(int fd) +{ + return ioctl(fd, KERNEL_IO_CREATE_SESSION); +} + +int kernctl_create_stream(int fd) +{ + return ioctl(fd, KERNEL_IO_CREATE_STREAM); +} + +/* returns the maximum size for sub-buffers. */ +int kernctl_get_max_subbuf_size(int fd, unsigned long *len) +{ + return ioctl(fd, RING_BUFFER_GET_MAX_SUBBUF_SIZE, len); +} + +/* returns the length to mmap. */ +int kernctl_get_mmap_len(int fd, unsigned long *len) +{ + return ioctl(fd, RING_BUFFER_GET_MMAP_LEN, len); +} + +/* returns the offset of the subbuffer belonging to the mmap reader. */ +int kernctl_get_mmap_read_offset(int fd, unsigned long *off) +{ + return ioctl(fd, RING_BUFFER_GET_MMAP_READ_OFFSET, off); +} + +/* Get exclusive read access to the next sub-buffer that can be read. */ +int kernctl_get_next_subbuf(int fd) +{ + return ioctl(fd, RING_BUFFER_GET_NEXT_SUBBUF); +} + +/* returns the size of the current sub-buffer, without padding (for mmap). */ +int kernctl_get_padded_subbuf_size(int fd, unsigned long *len) +{ + return ioctl(fd, RING_BUFFER_GET_PADDED_SUBBUF_SIZE, len); +} + +/* Get exclusive read access to the specified sub-buffer position */ +int kernctl_get_subbuf(int fd, unsigned long *len) +{ + return ioctl(fd, RING_BUFFER_GET_SUBBUF, len); +} + +/* returns the size of the current sub-buffer, without padding (for mmap). */ +int kernctl_get_subbuf_size(int fd, unsigned long *len) +{ + return ioctl(fd, RING_BUFFER_GET_SUBBUF_SIZE, len); +} + +/* Release exclusive sub-buffer access, move consumer forward. */ +int kernctl_put_next_subbuf(int fd) +{ + return ioctl(fd, RING_BUFFER_PUT_NEXT_SUBBUF); +} + +/* Release exclusive sub-buffer access */ +int kernctl_put_subbuf(int fd) +{ + return ioctl(fd, RING_BUFFER_PUT_SUBBUF); +} + +/* Get a snapshot of the current ring buffer producer and consumer positions */ +int kernctl_snapshot(int fd) +{ + return ioctl(fd, RING_BUFFER_SNAPSHOT); +} + +/* Get the consumer position (iteration start) */ +int kernctl_snapshot_get_consumed(int fd, unsigned long *pos) +{ + return ioctl(fd, RING_BUFFER_SNAPSHOT_GET_CONSUMED, pos); +} + +/* Get the producer position (iteration end) */ +int kernctl_snapshot_get_produced(int fd, unsigned long *pos) +{ + return ioctl(fd, RING_BUFFER_SNAPSHOT_GET_PRODUCED, pos); +} + +int kernctl_start_session(int fd) +{ + return ioctl(fd, KERNEL_IO_SESSION_START); +} + +int kernctl_stop_session(int fd) +{ + return ioctl(fd, KERNEL_IO_SESSION_STOP); +} + diff --git a/libkernelctl/libkernelctl.h b/libkernelctl/libkernelctl.h index 570388c3a..36d7175f0 100644 --- a/libkernelctl/libkernelctl.h +++ b/libkernelctl/libkernelctl.h @@ -1,5 +1,6 @@ /* - * Copyright (C) 2011 - David Goulet + * Copyright (C) 2011 - Julien Desfossez + * Mathieu Desnoyers * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -19,4 +20,25 @@ #ifndef _LTT_LIBKERNELCTL_H #define _LTT_LIBKERNELCTL_H +#include + +int kernctl_create_channel(int, struct lttng_channel*); +int kernctl_create_event(int, struct lttng_event*); +int kernctl_create_session(int); +int kernctl_create_stream(int); +int kernctl_get_max_subbuf_size(int, unsigned long*); +int kernctl_get_mmap_len(int, unsigned long*); +int kernctl_get_mmap_read_offset(int, unsigned long*); +int kernctl_get_next_subbuf(int); +int kernctl_get_padded_subbuf_size(int, unsigned long*); +int kernctl_get_subbuf(int fd, unsigned long*); +int kernctl_get_subbuf_size(int, unsigned long *); +int kernctl_put_next_subbuf(int); +int kernctl_put_subbuf(int fd); +int kernctl_snapshot(int); +int kernctl_snapshot_get_consumed(int, unsigned long*); +int kernctl_snapshot_get_produced(int, unsigned long*); +int kernctl_start_session(int); +int kernctl_stop_session(int); + #endif /* _LTT_LIBKERNELCTL_H */ -- 2.34.1