Introduce public/private structures for ring buffer channel operations.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I3614d550615a4617541a292fa761bebbdf6a275a
uint64_t version; /* Current version of the metadata */
};
+struct lttng_kernel_channel_buffer_ops_private {
+ struct lttng_kernel_channel_buffer_ops *pub; /* Public channel buffer ops interface */
+
+ struct channel *(*channel_create)(const char *name,
+ void *priv,
+ void *buf_addr,
+ size_t subbuf_size, size_t num_subbuf,
+ unsigned int switch_timer_interval,
+ unsigned int read_timer_interval);
+ void (*channel_destroy)(struct channel *chan);
+ struct lib_ring_buffer *(*buffer_read_open)(struct channel *chan);
+ int (*buffer_has_read_closed_stream)(struct channel *chan);
+ void (*buffer_read_close)(struct lib_ring_buffer *buf);
+ /*
+ * packet_avail_size returns the available size in the current
+ * packet. Note that the size returned is only a hint, since it
+ * may change due to concurrent writes.
+ */
+ size_t (*packet_avail_size)(struct channel *chan);
+ wait_queue_head_t *(*get_writer_buf_wait_queue)(struct channel *chan, int cpu);
+ wait_queue_head_t *(*get_hp_wait_queue)(struct channel *chan);
+ int (*is_finalized)(struct channel *chan);
+ int (*is_disabled)(struct channel *chan);
+ int (*timestamp_begin) (const struct lib_ring_buffer_config *config,
+ struct lib_ring_buffer *bufb,
+ uint64_t *timestamp_begin);
+ int (*timestamp_end) (const struct lib_ring_buffer_config *config,
+ struct lib_ring_buffer *bufb,
+ uint64_t *timestamp_end);
+ int (*events_discarded) (const struct lib_ring_buffer_config *config,
+ struct lib_ring_buffer *bufb,
+ uint64_t *events_discarded);
+ int (*content_size) (const struct lib_ring_buffer_config *config,
+ struct lib_ring_buffer *bufb,
+ uint64_t *content_size);
+ int (*packet_size) (const struct lib_ring_buffer_config *config,
+ struct lib_ring_buffer *bufb,
+ uint64_t *packet_size);
+ int (*stream_id) (const struct lib_ring_buffer_config *config,
+ struct lib_ring_buffer *bufb,
+ uint64_t *stream_id);
+ int (*current_timestamp) (const struct lib_ring_buffer_config *config,
+ struct lib_ring_buffer *bufb,
+ uint64_t *ts);
+ int (*sequence_number) (const struct lib_ring_buffer_config *config,
+ struct lib_ring_buffer *bufb,
+ uint64_t *seq);
+ int (*instance_id) (const struct lib_ring_buffer_config *config,
+ struct lib_ring_buffer *bufb,
+ uint64_t *id);
+};
+
extern struct lttng_kernel_ctx *lttng_static_ctx;
static inline
struct lttng_kernel_notification_ctx *notif_ctx);
};
-struct lttng_channel_ops {
- struct channel *(*channel_create)(const char *name,
- void *priv,
- void *buf_addr,
- size_t subbuf_size, size_t num_subbuf,
- unsigned int switch_timer_interval,
- unsigned int read_timer_interval);
- void (*channel_destroy)(struct channel *chan);
- struct lib_ring_buffer *(*buffer_read_open)(struct channel *chan);
- int (*buffer_has_read_closed_stream)(struct channel *chan);
- void (*buffer_read_close)(struct lib_ring_buffer *buf);
+struct lttng_kernel_channel_buffer_ops {
+ struct lttng_kernel_channel_buffer_ops_private *priv; /* Private channel buffer ops interface. */
+
int (*event_reserve)(struct lib_ring_buffer_ctx *ctx);
void (*event_commit)(struct lib_ring_buffer_ctx *ctx);
void (*event_write)(struct lib_ring_buffer_ctx *ctx, const void *src,
size_t len);
void (*event_strcpy_from_user)(struct lib_ring_buffer_ctx *ctx,
const char __user *src, size_t len);
- /*
- * packet_avail_size returns the available size in the current
- * packet. Note that the size returned is only a hint, since it
- * may change due to concurrent writes.
- */
- size_t (*packet_avail_size)(struct channel *chan);
- wait_queue_head_t *(*get_writer_buf_wait_queue)(struct channel *chan, int cpu);
- wait_queue_head_t *(*get_hp_wait_queue)(struct channel *chan);
- int (*is_finalized)(struct channel *chan);
- int (*is_disabled)(struct channel *chan);
- int (*timestamp_begin) (const struct lib_ring_buffer_config *config,
- struct lib_ring_buffer *bufb,
- uint64_t *timestamp_begin);
- int (*timestamp_end) (const struct lib_ring_buffer_config *config,
- struct lib_ring_buffer *bufb,
- uint64_t *timestamp_end);
- int (*events_discarded) (const struct lib_ring_buffer_config *config,
- struct lib_ring_buffer *bufb,
- uint64_t *events_discarded);
- int (*content_size) (const struct lib_ring_buffer_config *config,
- struct lib_ring_buffer *bufb,
- uint64_t *content_size);
- int (*packet_size) (const struct lib_ring_buffer_config *config,
- struct lib_ring_buffer *bufb,
- uint64_t *packet_size);
- int (*stream_id) (const struct lib_ring_buffer_config *config,
- struct lib_ring_buffer *bufb,
- uint64_t *stream_id);
- int (*current_timestamp) (const struct lib_ring_buffer_config *config,
- struct lib_ring_buffer *bufb,
- uint64_t *ts);
- int (*sequence_number) (const struct lib_ring_buffer_config *config,
- struct lib_ring_buffer *bufb,
- uint64_t *seq);
- int (*instance_id) (const struct lib_ring_buffer_config *config,
- struct lib_ring_buffer *bufb,
- uint64_t *id);
};
struct lttng_counter_ops {
char *name;
struct module *owner;
struct list_head node;
- struct lttng_channel_ops ops;
+ struct lttng_kernel_channel_buffer_ops ops;
};
struct lttng_counter_transport {
struct file *file; /* File associated to channel */
unsigned int free_event_id; /* Next event ID to allocate */
struct list_head list; /* Channel list */
- struct lttng_channel_ops *ops;
+ struct lttng_kernel_channel_buffer_ops *ops;
struct lttng_transport *transport;
struct hlist_head *sc_table; /* for syscall tracing */
struct hlist_head *compat_sc_table;
struct list_head enablers_head; /* List of enablers */
struct list_head event_notifiers_head; /* List of event notifier */
struct lttng_event_notifier_ht event_notifiers_ht; /* Hash table of event notifiers */
- struct lttng_channel_ops *ops;
+ struct lttng_kernel_channel_buffer_ops *ops;
struct lttng_transport *transport;
struct channel *chan; /* Ring buffer channel for event notifier group. */
struct lib_ring_buffer *buf; /* Ring buffer for event notifier group. */
int ret;
void *stream_priv;
- buf = channel->ops->buffer_read_open(channel->chan);
+ buf = channel->ops->priv->buffer_read_open(channel->chan);
if (!buf)
return -ENOENT;
return ret;
fd_error:
- channel->ops->buffer_read_close(buf);
+ channel->ops->priv->buffer_read_close(buf);
return ret;
}
struct lttng_metadata_stream *metadata_stream;
void *stream_priv;
- buf = channel->ops->buffer_read_open(channel->chan);
+ buf = channel->ops->priv->buffer_read_open(channel->chan);
if (!buf)
return -ENOENT;
notransport:
kfree(metadata_stream);
nomem:
- channel->ops->buffer_read_close(buf);
+ channel->ops->priv->buffer_read_close(buf);
return ret;
}
int ret;
void *stream_priv;
- buf = event_notifier_group->ops->buffer_read_open(chan);
+ buf = event_notifier_group->ops->priv->buffer_read_open(chan);
if (!buf)
return -ENOENT;
fd_error:
atomic_long_dec(¬if_file->f_count);
refcount_error:
- event_notifier_group->ops->buffer_read_close(buf);
+ event_notifier_group->ops->priv->buffer_read_close(buf);
return ret;
}
if (file->f_mode & FMODE_READ) {
poll_wait_set_exclusive(wait);
- poll_wait(file, channel->ops->get_hp_wait_queue(channel->chan),
+ poll_wait(file, channel->ops->priv->get_hp_wait_queue(channel->chan),
wait);
- if (channel->ops->is_disabled(channel->chan))
+ if (channel->ops->priv->is_disabled(channel->chan))
return POLLERR;
- if (channel->ops->is_finalized(channel->chan))
+ if (channel->ops->priv->is_finalized(channel->chan))
return POLLHUP;
- if (channel->ops->buffer_has_read_closed_stream(channel->chan))
+ if (channel->ops->priv->buffer_has_read_closed_stream(channel->chan))
return POLLIN | POLLRDNORM;
return 0;
}
struct lib_ring_buffer *buf = filp->private_data;
struct channel *chan = buf->backend.chan;
const struct lib_ring_buffer_config *config = &chan->backend.config;
- const struct lttng_channel_ops *ops = chan->backend.priv_ops;
+ const struct lttng_kernel_channel_buffer_ops *ops = chan->backend.priv_ops;
int ret;
if (atomic_read(&chan->record_disabled))
{
uint64_t ts;
- ret = ops->timestamp_begin(config, buf, &ts);
+ ret = ops->priv->timestamp_begin(config, buf, &ts);
if (ret < 0)
goto error;
return put_u64(ts, arg);
{
uint64_t ts;
- ret = ops->timestamp_end(config, buf, &ts);
+ ret = ops->priv->timestamp_end(config, buf, &ts);
if (ret < 0)
goto error;
return put_u64(ts, arg);
{
uint64_t ed;
- ret = ops->events_discarded(config, buf, &ed);
+ ret = ops->priv->events_discarded(config, buf, &ed);
if (ret < 0)
goto error;
return put_u64(ed, arg);
{
uint64_t cs;
- ret = ops->content_size(config, buf, &cs);
+ ret = ops->priv->content_size(config, buf, &cs);
if (ret < 0)
goto error;
return put_u64(cs, arg);
{
uint64_t ps;
- ret = ops->packet_size(config, buf, &ps);
+ ret = ops->priv->packet_size(config, buf, &ps);
if (ret < 0)
goto error;
return put_u64(ps, arg);
{
uint64_t si;
- ret = ops->stream_id(config, buf, &si);
+ ret = ops->priv->stream_id(config, buf, &si);
if (ret < 0)
goto error;
return put_u64(si, arg);
{
uint64_t ts;
- ret = ops->current_timestamp(config, buf, &ts);
+ ret = ops->priv->current_timestamp(config, buf, &ts);
if (ret < 0)
goto error;
return put_u64(ts, arg);
{
uint64_t seq;
- ret = ops->sequence_number(config, buf, &seq);
+ ret = ops->priv->sequence_number(config, buf, &seq);
if (ret < 0)
goto error;
return put_u64(seq, arg);
{
uint64_t id;
- ret = ops->instance_id(config, buf, &id);
+ ret = ops->priv->instance_id(config, buf, &id);
if (ret < 0)
goto error;
return put_u64(id, arg);
struct lib_ring_buffer *buf = filp->private_data;
struct channel *chan = buf->backend.chan;
const struct lib_ring_buffer_config *config = &chan->backend.config;
- const struct lttng_channel_ops *ops = chan->backend.priv_ops;
+ const struct lttng_kernel_channel_buffer_ops *ops = chan->backend.priv_ops;
int ret;
if (atomic_read(&chan->record_disabled))
{
uint64_t ts;
- ret = ops->timestamp_begin(config, buf, &ts);
+ ret = ops->priv->timestamp_begin(config, buf, &ts);
if (ret < 0)
goto error;
return put_u64(ts, arg);
{
uint64_t ts;
- ret = ops->timestamp_end(config, buf, &ts);
+ ret = ops->priv->timestamp_end(config, buf, &ts);
if (ret < 0)
goto error;
return put_u64(ts, arg);
{
uint64_t ed;
- ret = ops->events_discarded(config, buf, &ed);
+ ret = ops->priv->events_discarded(config, buf, &ed);
if (ret < 0)
goto error;
return put_u64(ed, arg);
{
uint64_t cs;
- ret = ops->content_size(config, buf, &cs);
+ ret = ops->priv->content_size(config, buf, &cs);
if (ret < 0)
goto error;
return put_u64(cs, arg);
{
uint64_t ps;
- ret = ops->packet_size(config, buf, &ps);
+ ret = ops->priv->packet_size(config, buf, &ps);
if (ret < 0)
goto error;
return put_u64(ps, arg);
{
uint64_t si;
- ret = ops->stream_id(config, buf, &si);
+ ret = ops->priv->stream_id(config, buf, &si);
if (ret < 0)
goto error;
return put_u64(si, arg);
{
uint64_t ts;
- ret = ops->current_timestamp(config, buf, &ts);
+ ret = ops->priv->current_timestamp(config, buf, &ts);
if (ret < 0)
goto error;
return put_u64(ts, arg);
{
uint64_t seq;
- ret = ops->sequence_number(config, buf, &seq);
+ ret = ops->priv->sequence_number(config, buf, &seq);
if (ret < 0)
goto error;
return put_u64(seq, arg);
{
uint64_t id;
- ret = ops->instance_id(config, buf, &id);
+ ret = ops->priv->instance_id(config, buf, &id);
if (ret < 0)
goto error;
return put_u64(id, arg);
* notifications.
*/
event_notifier_group->ops = &transport->ops;
- event_notifier_group->chan = transport->ops.channel_create(
+ event_notifier_group->chan = transport->ops.priv->channel_create(
transport_name, event_notifier_group, NULL,
subbuf_size, num_subbuf, switch_timer_interval,
read_timer_interval);
event_notifier_group->error_counter = NULL;
}
- event_notifier_group->ops->channel_destroy(event_notifier_group->chan);
+ event_notifier_group->ops->priv->channel_destroy(event_notifier_group->chan);
module_put(event_notifier_group->transport->owner);
list_del(&event_notifier_group->node);
* headers. Therefore the "chan" information used as input
* should be already accessible.
*/
- chan->chan = transport->ops.channel_create(transport_name,
+ chan->chan = transport->ops.priv->channel_create(transport_name,
chan, buf_addr, subbuf_size, num_subbuf,
switch_timer_interval, read_timer_interval);
if (!chan->chan)
static
void _lttng_channel_destroy(struct lttng_channel *chan)
{
- chan->ops->channel_destroy(chan->chan);
+ chan->ops->priv->channel_destroy(chan->chan);
module_put(chan->transport->owner);
list_del(&chan->list);
lttng_kernel_destroy_context(chan->ctx);
if (!len)
goto end;
reserve_len = min_t(size_t,
- stream->transport->ops.packet_avail_size(chan),
+ stream->transport->ops.priv->packet_avail_size(chan),
len);
lib_ring_buffer_ctx_init(&ctx, chan, reserve_len,
sizeof(char), NULL);
.name = "relay-" RING_BUFFER_MODE_TEMPLATE_STRING,
.owner = THIS_MODULE,
.ops = {
- .channel_create = _channel_create,
- .channel_destroy = lttng_channel_destroy,
- .buffer_read_open = lttng_buffer_read_open,
- .buffer_has_read_closed_stream =
- lttng_buffer_has_read_closed_stream,
- .buffer_read_close = lttng_buffer_read_close,
+ .priv = __LTTNG_COMPOUND_LITERAL(struct lttng_kernel_channel_buffer_ops_private, {
+ .pub = <tng_relay_transport.ops,
+ .channel_create = _channel_create,
+ .channel_destroy = lttng_channel_destroy,
+ .buffer_read_open = lttng_buffer_read_open,
+ .buffer_has_read_closed_stream =
+ lttng_buffer_has_read_closed_stream,
+ .buffer_read_close = lttng_buffer_read_close,
+ .packet_avail_size = NULL, /* Would be racy anyway */
+ .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,
+ .sequence_number = client_sequence_number,
+ .instance_id = client_instance_id,
+ }),
.event_reserve = lttng_event_reserve,
.event_commit = lttng_event_commit,
.event_write = lttng_event_write,
.event_memset = lttng_event_memset,
.event_strcpy = lttng_event_strcpy,
.event_strcpy_from_user = lttng_event_strcpy_from_user,
- .packet_avail_size = NULL, /* Would be racy anyway */
- .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,
- .sequence_number = client_sequence_number,
- .instance_id = client_instance_id,
},
};
.name = "relay-" RING_BUFFER_MODE_TEMPLATE_STRING,
.owner = THIS_MODULE,
.ops = {
- .channel_create = _channel_create,
- .channel_destroy = lttng_channel_destroy,
- .buffer_read_open = lttng_buffer_read_open,
- .buffer_has_read_closed_stream =
- lttng_buffer_has_read_closed_stream,
- .buffer_read_close = lttng_buffer_read_close,
+ .priv = __LTTNG_COMPOUND_LITERAL(struct lttng_kernel_channel_buffer_ops_private, {
+ .pub = <tng_relay_transport.ops,
+ .channel_create = _channel_create,
+ .channel_destroy = lttng_channel_destroy,
+ .buffer_read_open = lttng_buffer_read_open,
+ .buffer_has_read_closed_stream =
+ lttng_buffer_has_read_closed_stream,
+ .buffer_read_close = lttng_buffer_read_close,
+ .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,
+ .sequence_number = client_sequence_number,
+ .instance_id = client_instance_id,
+ }),
.event_reserve = lttng_event_reserve,
.event_commit = lttng_event_commit,
.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,
- .sequence_number = client_sequence_number,
- .instance_id = client_instance_id,
},
};
.name = "relay-" RING_BUFFER_MODE_TEMPLATE_STRING,
.owner = THIS_MODULE,
.ops = {
- .channel_create = _channel_create,
- .channel_destroy = lttng_channel_destroy,
- .buffer_read_open = lttng_buffer_read_open,
- .buffer_has_read_closed_stream =
- lttng_buffer_has_read_closed_stream,
- .buffer_read_close = lttng_buffer_read_close,
+ .priv = __LTTNG_COMPOUND_LITERAL(struct lttng_kernel_channel_buffer_ops_private, {
+ .pub = <tng_relay_transport.ops,
+ .channel_create = _channel_create,
+ .channel_destroy = lttng_channel_destroy,
+ .buffer_read_open = lttng_buffer_read_open,
+ .buffer_has_read_closed_stream =
+ lttng_buffer_has_read_closed_stream,
+ .buffer_read_close = lttng_buffer_read_close,
+ .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,
+ .sequence_number = client_sequence_number,
+ .instance_id = client_instance_id,
+ }),
.event_reserve = lttng_event_reserve,
.event_commit = lttng_event_commit,
.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,
- .sequence_number = client_sequence_number,
- .instance_id = client_instance_id,
},
};