#include "wrapper/vmalloc.h" /* for wrapper_vmalloc_sync_all() */
#include "wrapper/random.h"
#include "wrapper/tracepoint.h"
+#include "lttng-kernel-version.h"
#include "lttng-events.h"
#include "lttng-tracer.h"
#include "lttng-abi-old.h"
void synchronize_trace(void)
{
synchronize_sched();
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0))
+#ifdef CONFIG_PREEMPT_RT_FULL
+ synchronize_rcu();
+#endif
+#else /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0)) */
#ifdef CONFIG_PREEMPT_RT
synchronize_rcu();
#endif
+#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0)) */
}
struct lttng_session *lttng_session_create(void)
goto nomem;
chan->session = session;
chan->id = session->free_chan_id++;
+ chan->ops = &transport->ops;
/*
* Note: the channel creation op already writes into the packet
* headers. Therefore the "chan" information used as input
if (!chan->chan)
goto create_error;
chan->enabled = 1;
- chan->ops = &transport->ops;
chan->transport = transport;
chan->channel_type = channel_type;
list_add(&chan->list, &session->chan);
break;
default:
WARN_ON_ONCE(1);
+ goto register_error;
}
ret = _lttng_event_metadata_statedump(chan->session, chan, event);
if (ret)
* 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_channel *chan,
- struct lttng_metadata_stream *stream)
+int lttng_metadata_output_channel(struct lttng_metadata_stream *stream,
+ struct channel *chan)
{
struct lib_ring_buffer_ctx ctx;
int ret = 0;
size_t len, reserve_len;
+ /*
+ * Ensure we support mutiple get_next / put sequences followed
+ * by put_next.
+ */
+ WARN_ON(stream->metadata_in < stream->metadata_out);
+ if (stream->metadata_in != stream->metadata_out)
+ return 0;
+
len = stream->metadata_cache->metadata_written -
- stream->metadata_cache_read;
+ stream->metadata_in;
if (!len)
return 0;
reserve_len = min_t(size_t,
- chan->ops->packet_avail_size(chan->chan),
+ stream->transport->ops.packet_avail_size(chan),
len);
- lib_ring_buffer_ctx_init(&ctx, chan->chan, NULL, reserve_len,
+ lib_ring_buffer_ctx_init(&ctx, chan, NULL, reserve_len,
sizeof(char), -1);
/*
* If reservation failed, return an error to the caller.
*/
- ret = chan->ops->event_reserve(&ctx, 0);
+ ret = stream->transport->ops.event_reserve(&ctx, 0);
if (ret != 0) {
printk(KERN_WARNING "LTTng: Metadata event reservation failed\n");
goto end;
}
- chan->ops->event_write(&ctx,
- stream->metadata_cache->data + stream->metadata_cache_read,
+ stream->transport->ops.event_write(&ctx,
+ stream->metadata_cache->data + stream->metadata_in,
reserve_len);
- chan->ops->event_commit(&ctx);
- stream->metadata_cache_read += reserve_len;
+ stream->transport->ops.event_commit(&ctx);
+ stream->metadata_in += reserve_len;
ret = reserve_len;
end:
ret = lttng_metadata_printf(session,
"event {\n"
- " name = %s;\n"
+ " name = \"%s\";\n"
" id = %u;\n"
" stream_id = %u;\n",
event->desc->name,
MODULE_LICENSE("GPL and additional rights");
MODULE_AUTHOR("Mathieu Desnoyers <mathieu.desnoyers@efficios.com>");
MODULE_DESCRIPTION("LTTng Events");
+MODULE_VERSION(__stringify(LTTNG_MODULES_MAJOR_VERSION) "."
+ __stringify(LTTNG_MODULES_MINOR_VERSION) "."
+ __stringify(LTTNG_MODULES_PATCHLEVEL_VERSION));