From: Julien Desfossez Date: Mon, 16 Sep 2013 15:18:33 +0000 (-0400) Subject: Metadata flush writes data from the cache X-Git-Tag: v2.4.0-rc1~12 X-Git-Url: http://git.lttng.org/?p=lttng-modules.git;a=commitdiff_plain;h=35097f3627cd567d794ce4752327a50fb2f15791 Metadata flush writes data from the cache 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. Signed-off-by: Julien Desfossez Signed-off-by: Mathieu Desnoyers --- diff --git a/lttng-abi.c b/lttng-abi.c index 224b3528..a373504c 100644 --- a/lttng-abi.c +++ b/lttng-abi.c @@ -548,23 +548,6 @@ unsigned int lttng_metadata_ring_buffer_poll(struct file *filp, return mask; } -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. + */ + 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 879097b4..b7e44221 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)