X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=lttng-ring-buffer-metadata-client.h;h=9e0353042517e5fbb38dd191778aab51e3ed7800;hb=refs%2Fheads%2Fstable-2.5;hp=bea482b9a961316460800bb9d4294ef2ea8c7b45;hpb=2348ca17d04c122d21f9329faa6941d0b147b378;p=lttng-modules.git diff --git a/lttng-ring-buffer-metadata-client.h b/lttng-ring-buffer-metadata-client.h index bea482b9..9e035304 100644 --- a/lttng-ring-buffer-metadata-client.h +++ b/lttng-ring-buffer-metadata-client.h @@ -26,6 +26,8 @@ #include "lttng-events.h" #include "lttng-tracer.h" +static struct lttng_transport lttng_relay_transport; + struct metadata_packet_header { uint32_t magic; /* 0x75D11D57 */ uint8_t uuid[16]; /* Unique Universal Identifier */ @@ -97,11 +99,12 @@ static void client_buffer_begin(struct lib_ring_buffer *buf, u64 tsc, (struct metadata_packet_header *) lib_ring_buffer_offset_address(&buf->backend, subbuf_idx * chan->backend.subbuf_size); - struct lttng_channel *lttng_chan = channel_get_private(chan); - struct lttng_session *session = lttng_chan->session; + struct lttng_metadata_cache *metadata_cache = + channel_get_private(chan); header->magic = TSDL_MAGIC_NUMBER; - memcpy(header->uuid, session->uuid.b, sizeof(session->uuid)); + memcpy(header->uuid, metadata_cache->uuid.b, + sizeof(metadata_cache->uuid)); header->checksum = 0; /* 0 if unused */ header->content_size = 0xFFFFFFFF; /* in bits, for debugging */ header->packet_size = 0xFFFFFFFF; /* in bits, for debugging */ @@ -216,6 +219,18 @@ static const struct lib_ring_buffer_config client_config = { .wakeup = RING_BUFFER_WAKEUP_BY_TIMER, }; +static +void release_priv_ops(void *priv_ops) +{ + module_put(THIS_MODULE); +} + +static +void lttng_channel_destroy(struct channel *chan) +{ + channel_destroy(chan); +} + static struct channel *_channel_create(const char *name, struct lttng_channel *lttng_chan, void *buf_addr, @@ -223,23 +238,29 @@ struct channel *_channel_create(const char *name, unsigned int switch_timer_interval, unsigned int read_timer_interval) { - lttng_chan->ops->timestamp_begin = client_timestamp_begin; - lttng_chan->ops->timestamp_end = client_timestamp_end; - lttng_chan->ops->events_discarded = client_events_discarded; - 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; + struct channel *chan; - return channel_create(&client_config, name, lttng_chan, buf_addr, + chan = channel_create(&client_config, name, + lttng_chan->session->metadata_cache, buf_addr, subbuf_size, num_subbuf, switch_timer_interval, read_timer_interval); -} + if (chan) { + /* + * Ensure this module is not unloaded before we finish + * using lttng_relay_transport.ops. + */ + if (!try_module_get(THIS_MODULE)) { + printk(KERN_WARNING "LTT : Can't lock transport module.\n"); + goto error; + } + chan->backend.priv_ops = <tng_relay_transport.ops; + chan->backend.release_priv_ops = release_priv_ops; + } + return chan; -static -void lttng_channel_destroy(struct channel *chan) -{ - channel_destroy(chan); +error: + lttng_channel_destroy(chan); + return NULL; } static @@ -306,6 +327,13 @@ void lttng_event_memset(struct lib_ring_buffer_ctx *ctx, lib_ring_buffer_memset(&client_config, ctx, c, len); } +static +void lttng_event_strcpy(struct lib_ring_buffer_ctx *ctx, const char *src, + size_t len) +{ + lib_ring_buffer_strcpy(&client_config, ctx, src, len, '#'); +} + static size_t lttng_packet_avail_size(struct channel *chan) @@ -364,11 +392,19 @@ static struct lttng_transport lttng_relay_transport = { .event_write_from_user = lttng_event_write_from_user, .event_memset = lttng_event_memset, .event_write = lttng_event_write, + .event_strcpy = lttng_event_strcpy, .packet_avail_size = lttng_packet_avail_size, .get_writer_buf_wait_queue = lttng_get_writer_buf_wait_queue, .get_hp_wait_queue = lttng_get_hp_wait_queue, .is_finalized = lttng_is_finalized, .is_disabled = lttng_is_disabled, + .timestamp_begin = client_timestamp_begin, + .timestamp_end = client_timestamp_end, + .events_discarded = client_events_discarded, + .content_size = client_content_size, + .packet_size = client_packet_size, + .stream_id = client_stream_id, + .current_timestamp = client_current_timestamp, }, };