[lttng-dev] [MODULES PATCH 4/4] Metadata flush writes data from the cache
Julien Desfossez
jdesfossez at efficios.com
Mon Sep 16 13:22:51 EDT 2013
Hi,
On 13-09-16 12:36 PM, Mathieu Desnoyers wrote:
> * 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.
When we exit this switch, we end up in lib_ring_buffer_ioctl() performs
the RB flush.
Is it ok ?
Thanks,
Julien
>
> 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
>>
>
More information about the lttng-dev
mailing list