[lttng-dev] [MODULES PATCH 3/4] Per-stream ioctl to get the current timestamp

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Mon Sep 16 12:35:09 EDT 2013


Merged, thanks!

Mathieu

* Julien Desfossez (jdesfossez at efficios.com) wrote:
> Signed-off-by: Julien Desfossez <jdesfossez at efficios.com>
> ---
>  lttng-abi.c                         | 22 ++++++++++++++++++++++
>  lttng-abi.h                         |  5 +++++
>  lttng-events.h                      |  3 +++
>  lttng-ring-buffer-client.h          | 10 ++++++++++
>  lttng-ring-buffer-metadata-client.h |  8 ++++++++
>  5 files changed, 48 insertions(+)
> 
> diff --git a/lttng-abi.c b/lttng-abi.c
> index c2560e0..224b352 100644
> --- a/lttng-abi.c
> +++ b/lttng-abi.c
> @@ -1408,6 +1408,17 @@ static long lttng_stream_ring_buffer_ioctl(struct file *filp,
>  			goto error;
>  		return put_u64(si, arg);
>  	}
> +	case LTTNG_RING_BUFFER_GET_CURRENT_TIMESTAMP:
> +	{
> +		uint64_t ts;
> +
> +		if (!lttng_chan->ops)
> +			goto error;
> +		ret = lttng_chan->ops->current_timestamp(config, buf, &ts);
> +		if (ret < 0)
> +			goto error;
> +		return put_u64(ts, arg);
> +	}
>  	default:
>  		return lib_ring_buffer_file_operations.unlocked_ioctl(filp,
>  				cmd, arg);
> @@ -1497,6 +1508,17 @@ static long lttng_stream_ring_buffer_compat_ioctl(struct file *filp,
>  			goto error;
>  		return put_u64(si, arg);
>  	}
> +	case LTTNG_RING_BUFFER_GET_CURRENT_TIMESTAMP:
> +	{
> +		uint64_t ts;
> +
> +		if (!lttng_chan->ops)
> +			goto error;
> +		ret = lttng_chan->ops->current_timestamp(config, buf, &ts);
> +		if (ret < 0)
> +			goto error;
> +		return put_u64(ts, arg);
> +	}
>  	default:
>  		return lib_ring_buffer_file_operations.compat_ioctl(filp,
>  				cmd, arg);
> diff --git a/lttng-abi.h b/lttng-abi.h
> index b028f1e..3f2aefb 100644
> --- a/lttng-abi.h
> +++ b/lttng-abi.h
> @@ -187,6 +187,8 @@ struct lttng_kernel_context {
>  #define LTTNG_RING_BUFFER_GET_PACKET_SIZE	_IOR(0xF6, 0x24, uint64_t)
>  /* returns the stream id */
>  #define LTTNG_RING_BUFFER_GET_STREAM_ID		_IOR(0xF6, 0x25, uint64_t)
> +/* returns the current timestamp */
> +#define LTTNG_RING_BUFFER_GET_CURRENT_TIMESTAMP	_IOR(0xF6, 0x26, uint64_t)
>  
>  #ifdef CONFIG_COMPAT
>  /* returns the timestamp begin of the current sub-buffer */
> @@ -207,6 +209,9 @@ struct lttng_kernel_context {
>  /* returns the stream id */
>  #define LTTNG_RING_BUFFER_COMPAT_GET_STREAM_ID \
>  	LTTNG_RING_BUFFER_GET_STREAM_ID
> +/* returns the current timestamp */
> +#define LTTNG_RING_BUFFER_COMPAT_GET_CURRENT_TIMESTAMP \
> +	LTTNG_RING_BUFFER_GET_CURRENT_TIMESTAMP
>  #endif /* CONFIG_COMPAT */
>  
>  #endif /* _LTTNG_ABI_H */
> diff --git a/lttng-events.h b/lttng-events.h
> index bce6507..f0628c4 100644
> --- a/lttng-events.h
> +++ b/lttng-events.h
> @@ -263,6 +263,9 @@ struct lttng_channel_ops {
>  	int (*stream_id) (const struct lib_ring_buffer_config *config,
>  			struct lib_ring_buffer *bufb,
>  			uint64_t *stream_id);
> +	int (*current_timestamp) (const struct lib_ring_buffer_config *config,
> +			struct lib_ring_buffer *bufb,
> +			uint64_t *ts);
>  };
>  
>  struct lttng_transport {
> diff --git a/lttng-ring-buffer-client.h b/lttng-ring-buffer-client.h
> index 167000a..50c47b3 100644
> --- a/lttng-ring-buffer-client.h
> +++ b/lttng-ring-buffer-client.h
> @@ -467,6 +467,15 @@ static int client_stream_id(const struct lib_ring_buffer_config *config,
>  	return 0;
>  }
>  
> +static int client_current_timestamp(const struct lib_ring_buffer_config *config,
> +		struct lib_ring_buffer *bufb,
> +		uint64_t *ts)
> +{
> +	*ts = config->cb.ring_buffer_clock_read(bufb->backend.chan);
> +
> +	return 0;
> +}
> +
>  static const struct lib_ring_buffer_config client_config = {
>  	.cb.ring_buffer_clock_read = client_ring_buffer_clock_read,
>  	.cb.record_header_size = client_record_header_size,
> @@ -500,6 +509,7 @@ struct channel *_channel_create(const char *name,
>  	lttng_chan->ops->content_size = client_content_size;
>  	lttng_chan->ops->packet_size = client_packet_size;
>  	lttng_chan->ops->stream_id = client_stream_id;
> +	lttng_chan->ops->current_timestamp = client_current_timestamp;
>  
>  	return channel_create(&client_config, name, lttng_chan, buf_addr,
>  			      subbuf_size, num_subbuf, switch_timer_interval,
> diff --git a/lttng-ring-buffer-metadata-client.h b/lttng-ring-buffer-metadata-client.h
> index 6130715..bea482b 100644
> --- a/lttng-ring-buffer-metadata-client.h
> +++ b/lttng-ring-buffer-metadata-client.h
> @@ -168,6 +168,13 @@ static int client_events_discarded(const struct lib_ring_buffer_config *config,
>  	return -ENOSYS;
>  }
>  
> +static int client_current_timestamp(const struct lib_ring_buffer_config *config,
> +		struct lib_ring_buffer *bufb,
> +		uint64_t *ts)
> +{
> +	return -ENOSYS;
> +}
> +
>  static int client_content_size(const struct lib_ring_buffer_config *config,
>  			struct lib_ring_buffer *bufb,
>  			uint64_t *content_size)
> @@ -222,6 +229,7 @@ struct channel *_channel_create(const char *name,
>  	lttng_chan->ops->content_size = client_content_size;
>  	lttng_chan->ops->packet_size = client_packet_size;
>  	lttng_chan->ops->stream_id = client_stream_id;
> +	lttng_chan->ops->current_timestamp = client_current_timestamp;
>  
>  	return channel_create(&client_config, name, lttng_chan, buf_addr,
>  			      subbuf_size, num_subbuf, switch_timer_interval,
> -- 
> 1.8.3.2
> 

-- 
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com



More information about the lttng-dev mailing list