[lttng-dev] [LTTNG-TOOLS PATCH v2] ABI with support for compat 32/64 bits

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Mon Oct 1 14:43:41 EDT 2012


* Julien Desfossez (jdesfossez at efficios.com) wrote:
> 
> 
> On 01/10/12 02:23 PM, David Goulet wrote:
> > 
> > 
> > Mathieu Desnoyers:
> >> * Julien Desfossez (jdesfossez at efficios.com) wrote:
> >>>
> >>>
> >>> On 01/10/12 12:15 PM, Mathieu Desnoyers wrote:
> >>>> * Julien Desfossez (jdesfossez at efficios.com) wrote:
> >>>>> The current ABI does not work for compat 32/64 bits. This
> >>>>> patch moves the current ABI as old-abi and provides a new ABI
> >>>>> in which all the structures exchanged between user and
> >>>>> kernel-space are packed. Also this new ABI moves the "int
> >>>>> overwrite" member of the struct lttng_kernel_channel to
> >>>>> remove the alignment added by the compiler.
> >>>>>
> >>>>> A patch for lttng-modules has been developed in parallel to
> >>>>> this one to support the new ABI. These 2 patches have been
> >>>>> tested in all possible configurations (applied or not) on
> >>>>> 64-bit and 32-bit kernels (with CONFIG_COMPAT) and a
> >>>>> user-space in 32 and 64-bit.
> >>>>>
> >>>>> Here are the results of the tests : k 64 compat     | u 32
> >>>>> compat     | OK k 64 compat     | u 64 compat     | OK k 64
> >>>>> compat     | u 32 non-compat | KO k 64 compat     | u 64
> >>>>> non-compat | OK
> >>>>>
> >>>>> k 64 non-compat | u 64 compat     | OK k 64 non-compat | u 32
> >>>>> compat     | KO k 64 non-compat | u 64 non-compat | OK k 64
> >>>>> non-compat | u 32 non-compat | KO
> >>>>>
> >>>>> k 32 compat     | u compat        | OK k 32 compat     | u
> >>>>> non-compat    | OK
> >>>>>
> >>>>> k 32 non-compat | u compat        | OK k 32 non-compat | u
> >>>>> non-compat    | OK
> >>>>>
> >>>>> The results are as expected : - on 32-bit user-space and
> >>>>> kernel, every configuration works. - on 64-bit user-space and
> >>>>> kernel, every configuration works. - with 32-bit user-space
> >>>>> on a 64-bit kernel the only configuration where it works is
> >>>>> when the compat patch is applied everywhere.
> >>>>>
> >>>>> Signed-off-by: Julien Desfossez <jdesfossez at efficios.com> 
> >>>>> --- src/bin/lttng-sessiond/trace-kernel.h |    1 + 
> >>>>> src/common/kernel-ctl/kernel-ctl.c    |   96
> >>>>> ++++++++++++++++++++++++--- 
> >>>>> src/common/kernel-ctl/kernel-ctl.h    |    1 + 
> >>>>> src/common/kernel-ctl/kernel-ioctl.h  |   74
> >>>>> +++++++++++++++------ src/common/lttng-kernel-old.h         |
> >>>>> 117 +++++++++++++++++++++++++++++++++ 
> >>>>> src/common/lttng-kernel.h             |   31 ++++++--- 6
> >>>>> files changed, 281 insertions(+), 39 deletions(-) create mode
> >>>>> 100644 src/common/lttng-kernel-old.h
> >>>>>
> >>>>> diff --git a/src/bin/lttng-sessiond/trace-kernel.h
> >>>>> b/src/bin/lttng-sessiond/trace-kernel.h index
> >>>>> f04d9e7..c86cc27 100644 ---
> >>>>> a/src/bin/lttng-sessiond/trace-kernel.h +++
> >>>>> b/src/bin/lttng-sessiond/trace-kernel.h @@ -22,6 +22,7 @@
> >>>>>
> >>>>> #include <lttng/lttng.h> #include <common/lttng-kernel.h> 
> >>>>> +#include <common/lttng-kernel-old.h>
> >>>>>
> >>>>> #include "consumer.h"
> >>>>>
> >>>>> diff --git a/src/common/kernel-ctl/kernel-ctl.c
> >>>>> b/src/common/kernel-ctl/kernel-ctl.c index 1396cd9..2ac2d53
> >>>>> 100644 --- a/src/common/kernel-ctl/kernel-ctl.c +++
> >>>>> b/src/common/kernel-ctl/kernel-ctl.c @@ -18,38 +18,100 @@
> >>>>>
> >>>>> #define __USE_LINUX_IOCTL_DEFS #include <sys/ioctl.h> 
> >>>>> +#include <string.h>
> >>>>>
> >>>>> #include "kernel-ctl.h" #include "kernel-ioctl.h"
> >>>>>
> >>>>> +/* + * This flag indicates if lttng-tools must use the new
> >>>>> or the old kernel ABI + * (without compat support for 32/64
> >>>>> bits). It is set by + * kernctl_tracer_version()
> >>>>
> >>>> Hrm. I don't like that this is only set by
> >>>> kernctl_tracer_version(). What if, for an unforeseen reason
> >>>> (e.g. code change), sessiond starts using "create session"
> >>>> before checking the version ? The change you propose assumes a
> >>>> behavior on the sessiond side that is not cast in stone (no ABI
> >>>> requires it), so it might change. This brings coupling between
> >>>> this otherwise self-contained wrapper and the entire sessiond 
> >>>> code base, which I don't like.
> >>>>
> >>>> We should put the check in a wrapper macro around the every new
> >>>> ioctl call.
> >>>>
> >>>> e.g.
> >>>>
> >>>> /* * Cache whether we need to use the old or new ABI. */ static
> >>>> lttng_kernel_use_old_abi = -1;
> >>>>
> >>>>
> >>>> if (lttng_kernel_use_old_abi == -1) { ret = ioctl(fd, newname,
> >>>> args); if (!ret) { lttng_kernel_use_old_abi = 0; } } else { if
> >>>> (!lttng_kernel_use_old_abi) { ret = ioctl(fd, oldname, args); }
> >>>> else { ret = ioctl(fd, newname, args); } } return ret;
> >>>>
> >>>> Thoughts ?
> >>>
> >>> Ok I will add this wrapper, I am wondering if we could just limit
> >>> to these ioctl since they are the only one called on the
> >>> "top-level" fd (/proc/lttng) instead of adding it everywhere : 
> >>> LTTNG_KERNEL_SESSION LTTNG_KERNEL_TRACER_VERSION 
> >>> LTTNG_KERNEL_TRACEPOINT_LIST LTTNG_KERNEL_WAIT_QUIESCENT 
> >>> LTTNG_KERNEL_CALIBRATE
> >>>
> >>> All other ioctl require at least a session so is it OK if I limit
> >>> the test to only these ?
> > 
> >> yes, it makes sense. And given that this code is very much
> >> localized, I don't think it would be worth the effort to create a
> >> macro wrapper. Duplicating the checks at each 5 sites, all within
> >> the same file, seems good enough. But it's David's call.
> > 
> > I don't know... I can easily see some other use cases in the future
> > that requires us to wrap the ioctl according to the kernel.
> > 
> > I remember having this discussion way back when we started lttng-tools
> > code and here we are almost three years later fixing the "ioctl
> > wrapper issue" :P.
> > 
> > I don't think adding a macro is a lot of work and it will be really
> > easier for us to scale and adapt over time. Please, if I'm wrong,
> > speak now or shut up to the end of eternity! :P
> 
> For this particular case, we need to make special treatment when the
> ioctl takes an argument depending on the ABI version (alloc and assign
> the old struct values from the new one), so we won't be able to call a
> generic wrapper (except if we do this treatment all the time which I
> doubt we want).
> For ioctls that don't take an argument the wrapper is easy though.
> 
> So I think I should do a wrapper like
> compat_ioctl_no_arg(int fd, unsigned long oldname, unsigned long newname)
> and for the ioctls that take an argument make the checks locally.

make sense for me! If you can do the wrapper in a static inline rather
than a #define, it is even better!

Thanks,

Mathieu

> 
> Thoughts ?
> 
> Thanks,
> 
> Julien
> 
> 
> > 
> > Cheers!
> > David
> > 
> > 
> >> Thanks,
> > 
> >> Mathieu
> > 
> >>>
> >>> Thanks,
> >>>
> >>> Julien
> >>>
> >>>
> >>>>
> >>>> Thanks,
> >>>>
> >>>> Mathieu
> >>>>
> >>>>
> >>>>> + */ +static int lttng_kernel_use_old_abi; + int
> >>>>> kernctl_create_session(int fd) { +	if
> >>>>> (lttng_kernel_use_old_abi) +		return ioctl(fd,
> >>>>> LTTNG_KERNEL_OLD_SESSION); return ioctl(fd,
> >>>>> LTTNG_KERNEL_SESSION); }
> >>>>>
> >>>>> /* open the metadata global channel */ int
> >>>>> kernctl_open_metadata(int fd, struct lttng_channel_attr
> >>>>> *chops) { -	return ioctl(fd, LTTNG_KERNEL_METADATA, chops); +
> >>>>> struct lttng_kernel_old_channel old_channel; +	struct
> >>>>> lttng_kernel_channel channel; + +	if
> >>>>> (lttng_kernel_use_old_abi) { +		old_channel.overwrite =
> >>>>> chops->overwrite; +		old_channel.subbuf_size =
> >>>>> chops->subbuf_size; +		old_channel.num_subbuf =
> >>>>> chops->num_subbuf; +		old_channel.switch_timer_interval =
> >>>>> chops->switch_timer_interval; +
> >>>>> old_channel.read_timer_interval =
> >>>>> chops->read_timer_interval; +		old_channel.output =
> >>>>> chops->output; +		memcpy(old_channel.padding, chops->padding,
> >>>>> sizeof(chops->padding)); + +		return ioctl(fd,
> >>>>> LTTNG_KERNEL_OLD_METADATA, &old_channel); +	} + +
> >>>>> channel.overwrite = chops->overwrite; +	channel.subbuf_size =
> >>>>> chops->subbuf_size; +	channel.num_subbuf =
> >>>>> chops->num_subbuf; +	channel.switch_timer_interval =
> >>>>> chops->switch_timer_interval; +	channel.read_timer_interval =
> >>>>> chops->read_timer_interval; +	channel.output =
> >>>>> chops->output; +	memcpy(channel.padding, chops->padding,
> >>>>> sizeof(chops->padding)); + +	return ioctl(fd,
> >>>>> LTTNG_KERNEL_METADATA, &channel); }
> >>>>>
> >>>>> int kernctl_create_channel(int fd, struct lttng_channel_attr
> >>>>> *chops) { -	return ioctl(fd, LTTNG_KERNEL_CHANNEL, chops); +
> >>>>> struct lttng_kernel_old_channel old_channel; +	struct
> >>>>> lttng_kernel_channel channel; + +	if
> >>>>> (lttng_kernel_use_old_abi) { +		old_channel.overwrite =
> >>>>> chops->overwrite; +		old_channel.subbuf_size =
> >>>>> chops->subbuf_size; +		old_channel.num_subbuf =
> >>>>> chops->num_subbuf; +		old_channel.switch_timer_interval =
> >>>>> chops->switch_timer_interval; +
> >>>>> old_channel.read_timer_interval =
> >>>>> chops->read_timer_interval; +		old_channel.output =
> >>>>> chops->output; +		memcpy(old_channel.padding, chops->padding,
> >>>>> sizeof(chops->padding)); + +		return ioctl(fd,
> >>>>> LTTNG_KERNEL_OLD_CHANNEL, &old_channel); +	} + +
> >>>>> channel.overwrite = chops->overwrite; +	channel.subbuf_size =
> >>>>> chops->subbuf_size; +	channel.num_subbuf =
> >>>>> chops->num_subbuf; +	channel.switch_timer_interval =
> >>>>> chops->switch_timer_interval; +	channel.read_timer_interval =
> >>>>> chops->read_timer_interval; +	channel.output =
> >>>>> chops->output; +	memcpy(channel.padding, chops->padding,
> >>>>> sizeof(chops->padding)); + +	return ioctl(fd,
> >>>>> LTTNG_KERNEL_CHANNEL, &channel); }
> >>>>>
> >>>>> int kernctl_create_stream(int fd) { +	if
> >>>>> (lttng_kernel_use_old_abi) +		return ioctl(fd,
> >>>>> LTTNG_KERNEL_OLD_STREAM); return ioctl(fd,
> >>>>> LTTNG_KERNEL_STREAM); }
> >>>>>
> >>>>> int kernctl_create_event(int fd, struct lttng_kernel_event
> >>>>> *ev) { +	if (lttng_kernel_use_old_abi) +		return ioctl(fd,
> >>>>> LTTNG_KERNEL_OLD_EVENT, ev); return ioctl(fd,
> >>>>> LTTNG_KERNEL_EVENT, ev); }
> >>>>>
> >>>>> int kernctl_add_context(int fd, struct lttng_kernel_context
> >>>>> *ctx) { +	if (lttng_kernel_use_old_abi) +		return ioctl(fd,
> >>>>> LTTNG_KERNEL_OLD_CONTEXT, ctx); return ioctl(fd,
> >>>>> LTTNG_KERNEL_CONTEXT, ctx); }
> >>>>>
> >>>>> @@ -57,43 +119,64 @@ int kernctl_add_context(int fd, struct
> >>>>> lttng_kernel_context *ctx) /* Enable event, channel and
> >>>>> session ioctl */ int kernctl_enable(int fd) { +	if
> >>>>> (lttng_kernel_use_old_abi) +		return ioctl(fd,
> >>>>> LTTNG_KERNEL_OLD_ENABLE); return ioctl(fd,
> >>>>> LTTNG_KERNEL_ENABLE); }
> >>>>>
> >>>>> /* Disable event, channel and session ioctl */ int
> >>>>> kernctl_disable(int fd) { +	if (lttng_kernel_use_old_abi) +
> >>>>> return ioctl(fd, LTTNG_KERNEL_OLD_DISABLE); return ioctl(fd,
> >>>>> LTTNG_KERNEL_DISABLE); }
> >>>>>
> >>>>> int kernctl_start_session(int fd) { +	if
> >>>>> (lttng_kernel_use_old_abi) +		return ioctl(fd,
> >>>>> LTTNG_KERNEL_OLD_SESSION_START); return ioctl(fd,
> >>>>> LTTNG_KERNEL_SESSION_START); }
> >>>>>
> >>>>> int kernctl_stop_session(int fd) { +	if
> >>>>> (lttng_kernel_use_old_abi) +		return ioctl(fd,
> >>>>> LTTNG_KERNEL_OLD_SESSION_STOP); return ioctl(fd,
> >>>>> LTTNG_KERNEL_SESSION_STOP); }
> >>>>>
> >>>>>
> >>>>> int kernctl_tracepoint_list(int fd) { +	if
> >>>>> (lttng_kernel_use_old_abi) +		return ioctl(fd,
> >>>>> LTTNG_KERNEL_OLD_TRACEPOINT_LIST); return ioctl(fd,
> >>>>> LTTNG_KERNEL_TRACEPOINT_LIST); }
> >>>>>
> >>>>> int kernctl_tracer_version(int fd, struct
> >>>>> lttng_kernel_tracer_version *v) { -	return ioctl(fd,
> >>>>> LTTNG_KERNEL_TRACER_VERSION, v); +	int ret; + +	ret =
> >>>>> ioctl(fd, LTTNG_KERNEL_TRACER_VERSION, v); +	if (!ret) +
> >>>>> return ret; + +	lttng_kernel_use_old_abi = 1; +	return
> >>>>> ioctl(fd, LTTNG_KERNEL_OLD_TRACER_VERSION, v); }
> >>>>>
> >>>>> int kernctl_wait_quiescent(int fd) { +	if
> >>>>> (lttng_kernel_use_old_abi) +		return ioctl(fd,
> >>>>> LTTNG_KERNEL_OLD_WAIT_QUIESCENT); return ioctl(fd,
> >>>>> LTTNG_KERNEL_WAIT_QUIESCENT); }
> >>>>>
> >>>>> int kernctl_calibrate(int fd, struct lttng_kernel_calibrate
> >>>>> *calibrate) { +	if (lttng_kernel_use_old_abi) +		return
> >>>>> ioctl(fd, LTTNG_KERNEL_OLD_CALIBRATE, calibrate); return
> >>>>> ioctl(fd, LTTNG_KERNEL_CALIBRATE, calibrate); }
> >>>>>
> >>>>> @@ -193,10 +276,3 @@ int kernctl_set_stream_id(int fd,
> >>>>> unsigned long *stream_id) { return ioctl(fd,
> >>>>> RING_BUFFER_SET_STREAM_ID, stream_id); } - -/* Get the offset
> >>>>> of the stream_id in the packet header */ -int
> >>>>> kernctl_get_net_stream_id_offset(int fd, unsigned long
> >>>>> *offset) -{ -	return ioctl(fd, LTTNG_KERNEL_STREAM_ID_OFFSET,
> >>>>> offset); - -} diff --git a/src/common/kernel-ctl/kernel-ctl.h
> >>>>> b/src/common/kernel-ctl/kernel-ctl.h index 18712d9..85a3a18
> >>>>> 100644 --- a/src/common/kernel-ctl/kernel-ctl.h +++
> >>>>> b/src/common/kernel-ctl/kernel-ctl.h @@ -21,6 +21,7 @@
> >>>>>
> >>>>> #include <lttng/lttng.h> #include <common/lttng-kernel.h> 
> >>>>> +#include <common/lttng-kernel-old.h>
> >>>>>
> >>>>> int kernctl_create_session(int fd); int
> >>>>> kernctl_open_metadata(int fd, struct lttng_channel_attr
> >>>>> *chops); diff --git a/src/common/kernel-ctl/kernel-ioctl.h
> >>>>> b/src/common/kernel-ctl/kernel-ioctl.h index 35942be..1d34222
> >>>>> 100644 --- a/src/common/kernel-ctl/kernel-ioctl.h +++
> >>>>> b/src/common/kernel-ctl/kernel-ioctl.h @@ -49,37 +49,69 @@ /*
> >>>>> map stream to stream id for network streaming */ #define
> >>>>> RING_BUFFER_SET_STREAM_ID           _IOW(0xF6, 0x0D, unsigned
> >>>>> long)
> >>>>>
> >>>>> +/* Old ABI (without support for 32/64 bits compat) */ +/*
> >>>>> LTTng file descriptor ioctl */ +#define
> >>>>> LTTNG_KERNEL_OLD_SESSION                _IO(0xF6, 0x40) 
> >>>>> +#define LTTNG_KERNEL_OLD_TRACER_VERSION         \ +
> >>>>> _IOR(0xF6, 0x41, struct lttng_kernel_old_tracer_version) 
> >>>>> +#define LTTNG_KERNEL_OLD_TRACEPOINT_LIST        _IO(0xF6,
> >>>>> 0x42) +#define LTTNG_KERNEL_OLD_WAIT_QUIESCENT
> >>>>> _IO(0xF6, 0x43) +#define LTTNG_KERNEL_OLD_CALIBRATE		\ +
> >>>>> _IOWR(0xF6, 0x44, struct lttng_kernel_old_calibrate) + +/*
> >>>>> Session FD ioctl */ +#define LTTNG_KERNEL_OLD_METADATA
> >>>>> \ +		_IOW(0xF6, 0x50, struct lttng_kernel_old_channel) 
> >>>>> +#define LTTNG_KERNEL_OLD_CHANNEL                \ +
> >>>>> _IOW(0xF6, 0x51, struct lttng_kernel_old_channel) +#define
> >>>>> LTTNG_KERNEL_OLD_SESSION_START          _IO(0xF6, 0x52) 
> >>>>> +#define LTTNG_KERNEL_OLD_SESSION_STOP           _IO(0xF6,
> >>>>> 0x53) + +/* Channel FD ioctl */ +#define
> >>>>> LTTNG_KERNEL_OLD_STREAM                 _IO(0xF6, 0x60) 
> >>>>> +#define LTTNG_KERNEL_OLD_EVENT                  \ +
> >>>>> _IOW(0xF6, 0x61, struct lttng_kernel_old_event) +#define
> >>>>> LTTNG_KERNEL_OLD_STREAM_ID_OFFSET       \ +		_IOR(0xF6, 0x62,
> >>>>> unsigned long)
> >>>>>
> >>>>> +/* Event and Channel FD ioctl */ +#define
> >>>>> LTTNG_KERNEL_OLD_CONTEXT                \ +		_IOW(0xF6, 0x70,
> >>>>> struct lttng_kernel_old_context) + +/* Event, Channel and
> >>>>> Session ioctl */ +#define LTTNG_KERNEL_OLD_ENABLE
> >>>>> _IO(0xF6, 0x80) +#define LTTNG_KERNEL_OLD_DISABLE
> >>>>> _IO(0xF6, 0x81) + + +/* New ABI (with suport for 32/64 bits
> >>>>> compat) */ /* LTTng file descriptor ioctl */ -#define
> >>>>> LTTNG_KERNEL_SESSION                _IO(0xF6, 0x40) -#define
> >>>>> LTTNG_KERNEL_TRACER_VERSION         \ -		_IOR(0xF6, 0x41,
> >>>>> struct lttng_kernel_tracer_version) -#define
> >>>>> LTTNG_KERNEL_TRACEPOINT_LIST        _IO(0xF6, 0x42) -#define
> >>>>> LTTNG_KERNEL_WAIT_QUIESCENT         _IO(0xF6, 0x43) +#define
> >>>>> LTTNG_KERNEL_SESSION			_IO(0xF6, 0x45) +#define
> >>>>> LTTNG_KERNEL_TRACER_VERSION		\ +	_IOR(0xF6, 0x46, struct
> >>>>> lttng_kernel_tracer_version) +#define
> >>>>> LTTNG_KERNEL_TRACEPOINT_LIST		_IO(0xF6, 0x47) +#define
> >>>>> LTTNG_KERNEL_WAIT_QUIESCENT		_IO(0xF6, 0x48) #define
> >>>>> LTTNG_KERNEL_CALIBRATE			\ -	_IOWR(0xF6, 0x44, struct
> >>>>> lttng_kernel_calibrate) +	_IOWR(0xF6, 0x49, struct
> >>>>> lttng_kernel_calibrate)
> >>>>>
> >>>>> /* Session FD ioctl */ -#define LTTNG_KERNEL_METADATA
> >>>>> \ -		_IOW(0xF6, 0x50, struct lttng_channel_attr) -#define
> >>>>> LTTNG_KERNEL_CHANNEL                \ -		_IOW(0xF6, 0x51,
> >>>>> struct lttng_channel_attr) -#define
> >>>>> LTTNG_KERNEL_SESSION_START          _IO(0xF6, 0x52) -#define
> >>>>> LTTNG_KERNEL_SESSION_STOP           _IO(0xF6, 0x53) +#define
> >>>>> LTTNG_KERNEL_METADATA			\ +	_IOW(0xF6, 0x54, struct
> >>>>> lttng_kernel_channel) +#define LTTNG_KERNEL_CHANNEL			\ +
> >>>>> _IOW(0xF6, 0x55, struct lttng_kernel_channel) +#define
> >>>>> LTTNG_KERNEL_SESSION_START		_IO(0xF6, 0x56) +#define
> >>>>> LTTNG_KERNEL_SESSION_STOP		_IO(0xF6, 0x57)
> >>>>>
> >>>>> /* Channel FD ioctl */ -#define LTTNG_KERNEL_STREAM
> >>>>> _IO(0xF6, 0x60) -#define LTTNG_KERNEL_EVENT
> >>>>> \ -		_IOW(0xF6, 0x61, struct lttng_kernel_event) -#define
> >>>>> LTTNG_KERNEL_STREAM_ID_OFFSET       \ -		_IOR(0xF6, 0x62,
> >>>>> unsigned long) +#define LTTNG_KERNEL_STREAM			_IO(0xF6,
> >>>>> 0x62) +#define LTTNG_KERNEL_EVENT			\ +	_IOW(0xF6, 0x63,
> >>>>> struct lttng_kernel_event)
> >>>>>
> >>>>> /* Event and Channel FD ioctl */ -#define
> >>>>> LTTNG_KERNEL_CONTEXT                \ -		_IOW(0xF6, 0x70,
> >>>>> struct lttng_kernel_context) +#define LTTNG_KERNEL_CONTEXT
> >>>>> \ +	_IOW(0xF6, 0x71, struct lttng_kernel_context)
> >>>>>
> >>>>> /* Event, Channel and Session ioctl */ -#define
> >>>>> LTTNG_KERNEL_ENABLE                 _IO(0xF6, 0x80) -#define
> >>>>> LTTNG_KERNEL_DISABLE                _IO(0xF6, 0x81) +#define
> >>>>> LTTNG_KERNEL_ENABLE			_IO(0xF6, 0x82) +#define
> >>>>> LTTNG_KERNEL_DISABLE			_IO(0xF6, 0x83)
> >>>>>
> >>>>> #endif /* _LTT_KERNEL_IOCTL_H */ diff --git
> >>>>> a/src/common/lttng-kernel-old.h
> >>>>> b/src/common/lttng-kernel-old.h new file mode 100644 index
> >>>>> 0000000..0579751 --- /dev/null +++
> >>>>> b/src/common/lttng-kernel-old.h @@ -0,0 +1,117 @@ +/* + *
> >>>>> Copyright (C) 2011 - Julien Desfossez
> >>>>> <julien.desfossez at polymtl.ca> + *
> >>>>> Mathieu Desnoyers <mathieu.desnoyers at efficios.com> + *
> >>>>> David Goulet <david.goulet at polymtl.ca> + * + * 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. +
> >>>>> * + * 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. +
> >>>>> */ + +#ifndef _LTTNG_KERNEL_OLD_H +#define
> >>>>> _LTTNG_KERNEL_OLD_H + +#include <stdint.h> +#include
> >>>>> <common/lttng-kernel.h> + +#define
> >>>>> LTTNG_KERNEL_OLD_SYM_NAME_LEN  256 + +/* + * LTTng DebugFS
> >>>>> ABI structures. + * + * This is the kernel ABI copied from
> >>>>> lttng-modules tree. + */ + +/* Perf counter attributes */ 
> >>>>> +struct lttng_kernel_old_perf_counter_ctx { +	uint32_t type; 
> >>>>> +	uint64_t config; +	char
> >>>>> name[LTTNG_KERNEL_OLD_SYM_NAME_LEN]; +}; + +/* Event/Channel
> >>>>> context */ +#define LTTNG_KERNEL_OLD_CONTEXT_PADDING1  16 
> >>>>> +#define LTTNG_KERNEL_OLD_CONTEXT_PADDING2
> >>>>> LTTNG_KERNEL_OLD_SYM_NAME_LEN + 32 +struct
> >>>>> lttng_kernel_old_context { +	enum lttng_kernel_context_type
> >>>>> ctx; +	char padding[LTTNG_KERNEL_OLD_CONTEXT_PADDING1]; + +
> >>>>> union { +		struct lttng_kernel_old_perf_counter_ctx
> >>>>> perf_counter; +		char
> >>>>> padding[LTTNG_KERNEL_OLD_CONTEXT_PADDING2]; +	} u; +}; + 
> >>>>> +struct lttng_kernel_old_kretprobe { +	uint64_t addr; + +
> >>>>> uint64_t offset; +	char
> >>>>> symbol_name[LTTNG_KERNEL_OLD_SYM_NAME_LEN]; +}; + +/* + *
> >>>>> Either addr is used, or symbol_name and offset. + */ +struct
> >>>>> lttng_kernel_old_kprobe { +	uint64_t addr; + +	uint64_t
> >>>>> offset; +	char symbol_name[LTTNG_KERNEL_OLD_SYM_NAME_LEN]; 
> >>>>> +}; + +/* Function tracer */ +struct
> >>>>> lttng_kernel_old_function { +	char
> >>>>> symbol_name[LTTNG_KERNEL_OLD_SYM_NAME_LEN]; +}; + +#define
> >>>>> LTTNG_KERNEL_OLD_EVENT_PADDING1    16 +#define
> >>>>> LTTNG_KERNEL_OLD_EVENT_PADDING2
> >>>>> LTTNG_KERNEL_OLD_SYM_NAME_LEN + 32 +struct
> >>>>> lttng_kernel_old_event { +	char
> >>>>> name[LTTNG_KERNEL_OLD_SYM_NAME_LEN]; +	enum
> >>>>> lttng_kernel_instrumentation instrumentation; +	char
> >>>>> padding[LTTNG_KERNEL_OLD_EVENT_PADDING1]; + +	/* Per
> >>>>> instrumentation type configuration */ +	union { +		struct
> >>>>> lttng_kernel_old_kretprobe kretprobe; +		struct
> >>>>> lttng_kernel_old_kprobe kprobe; +		struct
> >>>>> lttng_kernel_old_function ftrace; +		char
> >>>>> padding[LTTNG_KERNEL_OLD_EVENT_PADDING2]; +	} u; +}; + 
> >>>>> +struct lttng_kernel_old_tracer_version { +	uint32_t major; +
> >>>>> uint32_t minor; +	uint32_t patchlevel; +}; + +struct
> >>>>> lttng_kernel_old_calibrate { +	enum
> >>>>> lttng_kernel_calibrate_type type;	/* type (input) */ +}; + 
> >>>>> +/* + * kernel channel + */ +#define
> >>>>> LTTNG_KERNEL_OLD_CHANNEL_PADDING1 LTTNG_SYMBOL_NAME_LEN + 32 
> >>>>> +struct lttng_kernel_old_channel { +	int overwrite;
> >>>>> /* 1: overwrite, 0: discard */ +	uint64_t subbuf_size;
> >>>>> /* bytes */ +	uint64_t num_subbuf;                /* power of
> >>>>> 2 */ +	unsigned int switch_timer_interval; /* usec */ +
> >>>>> unsigned int read_timer_interval;   /* usec */ +	enum
> >>>>> lttng_event_output output;     /* splice, mmap */ + +	char
> >>>>> padding[LTTNG_KERNEL_OLD_CHANNEL_PADDING1]; +}; + +#endif /*
> >>>>> _LTTNG_KERNEL_OLD_H */ diff --git a/src/common/lttng-kernel.h
> >>>>> b/src/common/lttng-kernel.h index dbeb6aa..ac881bf 100644 ---
> >>>>> a/src/common/lttng-kernel.h +++ b/src/common/lttng-kernel.h 
> >>>>> @@ -59,7 +59,7 @@ struct lttng_kernel_perf_counter_ctx { 
> >>>>> uint32_t type; uint64_t config; char
> >>>>> name[LTTNG_KERNEL_SYM_NAME_LEN]; -}; 
> >>>>> +}__attribute__((packed));
> >>>>>
> >>>>> /* Event/Channel context */ #define
> >>>>> LTTNG_KERNEL_CONTEXT_PADDING1  16 @@ -72,14 +72,14 @@ struct
> >>>>> lttng_kernel_context { struct lttng_kernel_perf_counter_ctx
> >>>>> perf_counter; char padding[LTTNG_KERNEL_CONTEXT_PADDING2]; }
> >>>>> u; -}; +}__attribute__((packed));
> >>>>>
> >>>>> struct lttng_kernel_kretprobe { uint64_t addr;
> >>>>>
> >>>>> uint64_t offset; char
> >>>>> symbol_name[LTTNG_KERNEL_SYM_NAME_LEN]; -}; 
> >>>>> +}__attribute__((packed));
> >>>>>
> >>>>> /* * Either addr is used, or symbol_name and offset. @@
> >>>>> -89,12 +89,12 @@ struct lttng_kernel_kprobe {
> >>>>>
> >>>>> uint64_t offset; char
> >>>>> symbol_name[LTTNG_KERNEL_SYM_NAME_LEN]; -}; 
> >>>>> +}__attribute__((packed));
> >>>>>
> >>>>> /* Function tracer */ struct lttng_kernel_function { char
> >>>>> symbol_name[LTTNG_KERNEL_SYM_NAME_LEN]; -}; 
> >>>>> +}__attribute__((packed));
> >>>>>
> >>>>> #define LTTNG_KERNEL_EVENT_PADDING1    16 #define
> >>>>> LTTNG_KERNEL_EVENT_PADDING2    LTTNG_KERNEL_SYM_NAME_LEN +
> >>>>> 32 @@ -110,13 +110,13 @@ struct lttng_kernel_event { struct
> >>>>> lttng_kernel_function ftrace; char
> >>>>> padding[LTTNG_KERNEL_EVENT_PADDING2]; } u; -}; 
> >>>>> +}__attribute__((packed));
> >>>>>
> >>>>> struct lttng_kernel_tracer_version { uint32_t major; uint32_t
> >>>>> minor; uint32_t patchlevel; -}; +}__attribute__((packed));
> >>>>>
> >>>>> enum lttng_kernel_calibrate_type { 
> >>>>> LTTNG_KERNEL_CALIBRATE_KRETPROBE, @@ -124,6 +124,21 @@ enum
> >>>>> lttng_kernel_calibrate_type {
> >>>>>
> >>>>> struct lttng_kernel_calibrate { enum
> >>>>> lttng_kernel_calibrate_type type;	/* type (input) */ -}; 
> >>>>> +}__attribute__((packed)); + +/* + * kernel channel + */ 
> >>>>> +#define LTTNG_KERNEL_CHANNEL_PADDING1 LTTNG_SYMBOL_NAME_LEN
> >>>>> + 32 +struct lttng_kernel_channel { +	uint64_t subbuf_size;
> >>>>> /* bytes */ +	uint64_t num_subbuf;                /* power of
> >>>>> 2 */ +	unsigned int switch_timer_interval; /* usec */ +
> >>>>> unsigned int read_timer_interval;   /* usec */ +	int
> >>>>> overwrite;                      /* 1: overwrite, 0: discard
> >>>>> */ +	enum lttng_event_output output;     /* splice, mmap */ 
> >>>>> + +	char padding[LTTNG_KERNEL_CHANNEL_PADDING1]; 
> >>>>> +}__attribute__((packed));
> >>>>>
> >>>>> #endif /* _LTTNG_KERNEL_H */ -- 1.7.9.5
> >>>>>
> >>>>
> > 
> > 
> > _______________________________________________
> > lttng-dev mailing list
> > lttng-dev at lists.lttng.org
> > http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

-- 
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com



More information about the lttng-dev mailing list