[lttng-dev] [MODULES PATCH 4/4] Metadata flush writes data from the cache

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Mon Sep 16 12:36:32 EDT 2013


* Julien Desfossez (jdesfossez at efficios.com) wrote:
> When doing a flush on a metadata stream we first check if we can fill
> the current subbuffer with data from the cache before doing the actual
> flush.

Comments below,

> 
> Signed-off-by: Julien Desfossez <jdesfossez at efficios.com>
> ---
>  lttng-abi.c    | 56 +++++++++++++++++++++++++++++++++-----------------------
>  lttng-events.c |  2 ++
>  2 files changed, 35 insertions(+), 23 deletions(-)
> 
> diff --git a/lttng-abi.c b/lttng-abi.c
> index 224b352..a373504 100644
> --- a/lttng-abi.c
> +++ b/lttng-abi.c
> @@ -549,23 +549,6 @@ unsigned int lttng_metadata_ring_buffer_poll(struct file *filp,
>  }
>  
>  static
> -int lttng_metadata_ring_buffer_ioctl_get_next_subbuf(struct file *filp,
> -		unsigned int cmd, unsigned long arg)
> -{
> -	struct lttng_metadata_stream *stream = filp->private_data;
> -	struct lib_ring_buffer *buf = stream->priv;
> -	struct channel *chan = buf->backend.chan;
> -	int ret;
> -
> -	ret = lttng_metadata_output_channel(stream, chan);
> -	if (ret > 0) {
> -		lib_ring_buffer_switch_slow(buf, SWITCH_ACTIVE);
> -		ret = 0;
> -	}
> -	return ret;
> -}
> -
> -static
>  void lttng_metadata_ring_buffer_ioctl_put_next_subbuf(struct file *filp,
>  		unsigned int cmd, unsigned long arg)
>  {
> @@ -585,9 +568,15 @@ long lttng_metadata_ring_buffer_ioctl(struct file *filp,
>  	switch (cmd) {
>  	case RING_BUFFER_GET_NEXT_SUBBUF:
>  	{
> -		ret = lttng_metadata_ring_buffer_ioctl_get_next_subbuf(filp,
> -				cmd, arg);
> -		if (ret < 0)
> +		struct lttng_metadata_stream *stream = filp->private_data;
> +		struct lib_ring_buffer *buf = stream->priv;
> +		struct channel *chan = buf->backend.chan;
> +
> +		ret = lttng_metadata_output_channel(stream, chan);
> +		if (ret > 0) {
> +			lib_ring_buffer_switch_slow(buf, SWITCH_ACTIVE);
> +			ret = 0;
> +		} else if (ret < 0)
>  			goto err;
>  		break;
>  	}
> @@ -598,6 +587,21 @@ long lttng_metadata_ring_buffer_ioctl(struct file *filp,
>  		 */
>  		return -ENOSYS;
>  	}
> +	case RING_BUFFER_FLUSH:
> +	{
> +		struct lttng_metadata_stream *stream = filp->private_data;
> +		struct lib_ring_buffer *buf = stream->priv;
> +		struct channel *chan = buf->backend.chan;
> +
> +		/*
> +		 * Before doing the actual ring buffer flush, write up to one
> +		 * packet of metadata in the ring buffer.

This comment says "Before doing the actual rb flush". But where is it
done ? Do we need it at all, or is it done by the following get_subbuf ?
I think the code might be right, but the comment does not match the
implementation.

Thanks,

Mathieu

> +		 */
> +		ret = lttng_metadata_output_channel(stream, chan);
> +		if (ret < 0)
> +			goto err;
> +		break;
> +	}
>  	default:
>  		break;
>  	}
> @@ -634,9 +638,15 @@ long lttng_metadata_ring_buffer_compat_ioctl(struct file *filp,
>  	switch (cmd) {
>  	case RING_BUFFER_GET_NEXT_SUBBUF:
>  	{
> -		ret = lttng_metadata_ring_buffer_ioctl_get_next_subbuf(filp,
> -				cmd, arg);
> -		if (ret < 0)
> +		struct lttng_metadata_stream *stream = filp->private_data;
> +		struct lib_ring_buffer *buf = stream->priv;
> +		struct channel *chan = buf->backend.chan;
> +
> +		ret = lttng_metadata_output_channel(stream, chan);
> +		if (ret > 0) {
> +			lib_ring_buffer_switch_slow(buf, SWITCH_ACTIVE);
> +			ret = 0;
> +		} else if (ret < 0)
>  			goto err;
>  		break;
>  	}
> diff --git a/lttng-events.c b/lttng-events.c
> index 879097b..b7e4422 100644
> --- a/lttng-events.c
> +++ b/lttng-events.c
> @@ -553,6 +553,8 @@ void _lttng_event_destroy(struct lttng_event *event)
>   * sessions_mutex), so we can do racy operations such as looking for
>   * remaining space left in packet and write, since mutual exclusion
>   * protects us from concurrent writes.
> + * Returns the number of bytes written in the channel, 0 if no data
> + * was written and a negative value on error.
>   */
>  int lttng_metadata_output_channel(struct lttng_metadata_stream *stream,
>  		struct channel *chan)
> -- 
> 1.8.3.2
> 

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



More information about the lttng-dev mailing list