X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=src%2Flttng-ring-buffer-client.h;h=0dc8a8d9f5f73393a04afa39efe51db09e226e1d;hb=HEAD;hp=70eb555e282b837ed79487092fce1cc21df81b1c;hpb=860c213b645593fa19d7a3abf7ffdd1282f0a1c6;p=lttng-modules.git diff --git a/src/lttng-ring-buffer-client.h b/src/lttng-ring-buffer-client.h index 70eb555e..a1753e98 100644 --- a/src/lttng-ring-buffer-client.h +++ b/src/lttng-ring-buffer-client.h @@ -18,7 +18,7 @@ #include #define LTTNG_COMPACT_EVENT_BITS 5 -#define LTTNG_COMPACT_TSC_BITS 27 +#define LTTNG_COMPACT_TIMESTAMP_BITS 27 static struct lttng_transport lttng_relay_transport; @@ -135,7 +135,7 @@ void ctx_record(struct lttng_kernel_ring_buffer_ctx *bufctx, * contains. */ static __inline__ -size_t record_header_size(const struct lib_ring_buffer_config *config, +size_t record_header_size(const struct lttng_kernel_ring_buffer_config *config, struct lttng_kernel_ring_buffer_channel *chan, size_t offset, size_t *pre_header_padding, struct lttng_kernel_ring_buffer_ctx *ctx, @@ -149,7 +149,7 @@ size_t record_header_size(const struct lib_ring_buffer_config *config, case 1: /* compact */ padding = lib_ring_buffer_align(offset, lttng_alignof(uint32_t)); offset += padding; - if (!(ctx->priv.rflags & (RING_BUFFER_RFLAG_FULL_TSC | LTTNG_RFLAG_EXTENDED))) { + if (!(ctx->priv.rflags & (RING_BUFFER_RFLAG_FULL_TIMESTAMP | LTTNG_RFLAG_EXTENDED))) { offset += sizeof(uint32_t); /* id and timestamp */ } else { /* Minimum space taken by LTTNG_COMPACT_EVENT_BITS id */ @@ -165,7 +165,7 @@ size_t record_header_size(const struct lib_ring_buffer_config *config, padding = lib_ring_buffer_align(offset, lttng_alignof(uint16_t)); offset += padding; offset += sizeof(uint16_t); - if (!(ctx->priv.rflags & (RING_BUFFER_RFLAG_FULL_TSC | LTTNG_RFLAG_EXTENDED))) { + if (!(ctx->priv.rflags & (RING_BUFFER_RFLAG_FULL_TIMESTAMP | LTTNG_RFLAG_EXTENDED))) { offset += lib_ring_buffer_align(offset, lttng_alignof(uint32_t)); offset += sizeof(uint32_t); /* timestamp */ } else { @@ -189,7 +189,7 @@ size_t record_header_size(const struct lib_ring_buffer_config *config, #include static -void lttng_write_event_header_slow(const struct lib_ring_buffer_config *config, +void lttng_write_event_header_slow(const struct lttng_kernel_ring_buffer_config *config, struct lttng_kernel_ring_buffer_ctx *ctx, uint32_t event_id); @@ -203,7 +203,7 @@ void lttng_write_event_header_slow(const struct lib_ring_buffer_config *config, * @event_id: event ID */ static __inline__ -void lttng_write_event_header(const struct lib_ring_buffer_config *config, +void lttng_write_event_header(const struct lttng_kernel_ring_buffer_config *config, struct lttng_kernel_ring_buffer_ctx *ctx, uint32_t event_id) { @@ -223,14 +223,14 @@ void lttng_write_event_header(const struct lib_ring_buffer_config *config, event_id); bt_bitfield_write(&id_time, uint32_t, LTTNG_COMPACT_EVENT_BITS, - LTTNG_COMPACT_TSC_BITS, - ctx->priv.tsc); + LTTNG_COMPACT_TIMESTAMP_BITS, + ctx->priv.timestamp); lib_ring_buffer_write(config, ctx, &id_time, sizeof(id_time)); break; } case 2: /* large */ { - uint32_t timestamp = (uint32_t) ctx->priv.tsc; + uint32_t timestamp = (uint32_t) ctx->priv.timestamp; uint16_t id = event_id; lib_ring_buffer_write(config, ctx, &id, sizeof(id)); @@ -252,7 +252,7 @@ slow_path: } static -void lttng_write_event_header_slow(const struct lib_ring_buffer_config *config, +void lttng_write_event_header_slow(const struct lttng_kernel_ring_buffer_config *config, struct lttng_kernel_ring_buffer_ctx *ctx, uint32_t event_id) { @@ -260,7 +260,7 @@ void lttng_write_event_header_slow(const struct lib_ring_buffer_config *config, switch (lttng_chan->priv->header_type) { case 1: /* compact */ - if (!(ctx->priv.rflags & (RING_BUFFER_RFLAG_FULL_TSC | LTTNG_RFLAG_EXTENDED))) { + if (!(ctx->priv.rflags & (RING_BUFFER_RFLAG_FULL_TIMESTAMP | LTTNG_RFLAG_EXTENDED))) { uint32_t id_time = 0; bt_bitfield_write(&id_time, uint32_t, @@ -269,11 +269,11 @@ void lttng_write_event_header_slow(const struct lib_ring_buffer_config *config, event_id); bt_bitfield_write(&id_time, uint32_t, LTTNG_COMPACT_EVENT_BITS, - LTTNG_COMPACT_TSC_BITS, ctx->priv.tsc); + LTTNG_COMPACT_TIMESTAMP_BITS, ctx->priv.timestamp); lib_ring_buffer_write(config, ctx, &id_time, sizeof(id_time)); } else { uint8_t id = 0; - uint64_t timestamp = ctx->priv.tsc; + uint64_t timestamp = ctx->priv.timestamp; bt_bitfield_write(&id, uint8_t, 0, @@ -289,8 +289,8 @@ void lttng_write_event_header_slow(const struct lib_ring_buffer_config *config, break; case 2: /* large */ { - if (!(ctx->priv.rflags & (RING_BUFFER_RFLAG_FULL_TSC | LTTNG_RFLAG_EXTENDED))) { - uint32_t timestamp = (uint32_t) ctx->priv.tsc; + if (!(ctx->priv.rflags & (RING_BUFFER_RFLAG_FULL_TIMESTAMP | LTTNG_RFLAG_EXTENDED))) { + uint32_t timestamp = (uint32_t) ctx->priv.timestamp; uint16_t id = event_id; lib_ring_buffer_write(config, ctx, &id, sizeof(id)); @@ -298,7 +298,7 @@ void lttng_write_event_header_slow(const struct lib_ring_buffer_config *config, lib_ring_buffer_write(config, ctx, ×tamp, sizeof(timestamp)); } else { uint16_t id = 65535; - uint64_t timestamp = ctx->priv.tsc; + uint64_t timestamp = ctx->priv.timestamp; lib_ring_buffer_write(config, ctx, &id, sizeof(id)); /* Align extended struct on largest member */ @@ -316,7 +316,7 @@ void lttng_write_event_header_slow(const struct lib_ring_buffer_config *config, lib_ring_buffer_align_ctx(ctx, ctx->largest_align); } -static const struct lib_ring_buffer_config client_config; +static const struct lttng_kernel_ring_buffer_config client_config; static u64 client_ring_buffer_clock_read(struct lttng_kernel_ring_buffer_channel *chan) { @@ -324,7 +324,7 @@ static u64 client_ring_buffer_clock_read(struct lttng_kernel_ring_buffer_channel } static -size_t client_record_header_size(const struct lib_ring_buffer_config *config, +size_t client_record_header_size(const struct lttng_kernel_ring_buffer_config *config, struct lttng_kernel_ring_buffer_channel *chan, size_t offset, size_t *pre_header_padding, struct lttng_kernel_ring_buffer_ctx *ctx, @@ -346,7 +346,7 @@ static size_t client_packet_header_size(void) return offsetof(struct packet_header, ctx.header_end); } -static void client_buffer_begin(struct lib_ring_buffer *buf, u64 tsc, +static void client_buffer_begin(struct lttng_kernel_ring_buffer *buf, u64 timestamp, unsigned int subbuf_idx) { struct lttng_kernel_ring_buffer_channel *chan = buf->backend.chan; @@ -361,7 +361,7 @@ static void client_buffer_begin(struct lib_ring_buffer *buf, u64 tsc, memcpy(header->uuid, session->priv->uuid.b, sizeof(session->priv->uuid)); header->stream_id = lttng_chan->priv->id; header->stream_instance_id = buf->backend.cpu; - header->ctx.timestamp_begin = tsc; + header->ctx.timestamp_begin = timestamp; header->ctx.timestamp_end = 0; header->ctx.content_size = ~0ULL; /* for debugging */ header->ctx.packet_size = ~0ULL; @@ -376,8 +376,9 @@ static void client_buffer_begin(struct lib_ring_buffer *buf, u64 tsc, * offset is assumed to never be 0 here : never deliver a completely empty * subbuffer. data_size is between 1 and subbuf_size. */ -static void client_buffer_end(struct lib_ring_buffer *buf, u64 tsc, - unsigned int subbuf_idx, unsigned long data_size) +static void client_buffer_end(struct lttng_kernel_ring_buffer *buf, u64 timestamp, + unsigned int subbuf_idx, unsigned long data_size, + const struct lttng_kernel_ring_buffer_ctx *ctx) { struct lttng_kernel_ring_buffer_channel *chan = buf->backend.chan; struct packet_header *header = @@ -386,36 +387,36 @@ static void client_buffer_end(struct lib_ring_buffer *buf, u64 tsc, subbuf_idx * chan->backend.subbuf_size); unsigned long records_lost = 0; - header->ctx.timestamp_end = tsc; + header->ctx.timestamp_end = timestamp; header->ctx.content_size = (uint64_t) data_size * CHAR_BIT; /* in bits */ header->ctx.packet_size = (uint64_t) PAGE_ALIGN(data_size) * CHAR_BIT; /* in bits */ - records_lost += lib_ring_buffer_get_records_lost_full(&client_config, buf); - records_lost += lib_ring_buffer_get_records_lost_wrap(&client_config, buf); - records_lost += lib_ring_buffer_get_records_lost_big(&client_config, buf); + records_lost += lib_ring_buffer_get_records_lost_full(&client_config, ctx); + records_lost += lib_ring_buffer_get_records_lost_wrap(&client_config, ctx); + records_lost += lib_ring_buffer_get_records_lost_big(&client_config, ctx); header->ctx.events_discarded = records_lost; } -static int client_buffer_create(struct lib_ring_buffer *buf, void *priv, +static int client_buffer_create(struct lttng_kernel_ring_buffer *buf, void *priv, int cpu, const char *name) { return 0; } -static void client_buffer_finalize(struct lib_ring_buffer *buf, void *priv, int cpu) +static void client_buffer_finalize(struct lttng_kernel_ring_buffer *buf, void *priv, int cpu) { } static struct packet_header *client_packet_header( - const struct lib_ring_buffer_config *config, - struct lib_ring_buffer *buf) + const struct lttng_kernel_ring_buffer_config *config, + struct lttng_kernel_ring_buffer *buf) { return lib_ring_buffer_read_offset_address(&buf->backend, 0); } -static int client_timestamp_begin(const struct lib_ring_buffer_config *config, - struct lib_ring_buffer *buf, +static int client_timestamp_begin(const struct lttng_kernel_ring_buffer_config *config, + struct lttng_kernel_ring_buffer *buf, uint64_t *timestamp_begin) { struct packet_header *header = client_packet_header(config, buf); @@ -424,8 +425,8 @@ static int client_timestamp_begin(const struct lib_ring_buffer_config *config, return 0; } -static int client_timestamp_end(const struct lib_ring_buffer_config *config, - struct lib_ring_buffer *buf, +static int client_timestamp_end(const struct lttng_kernel_ring_buffer_config *config, + struct lttng_kernel_ring_buffer *buf, uint64_t *timestamp_end) { struct packet_header *header = client_packet_header(config, buf); @@ -434,8 +435,8 @@ static int client_timestamp_end(const struct lib_ring_buffer_config *config, return 0; } -static int client_events_discarded(const struct lib_ring_buffer_config *config, - struct lib_ring_buffer *buf, +static int client_events_discarded(const struct lttng_kernel_ring_buffer_config *config, + struct lttng_kernel_ring_buffer *buf, uint64_t *events_discarded) { struct packet_header *header = client_packet_header(config, buf); @@ -444,8 +445,8 @@ static int client_events_discarded(const struct lib_ring_buffer_config *config, return 0; } -static int client_content_size(const struct lib_ring_buffer_config *config, - struct lib_ring_buffer *buf, +static int client_content_size(const struct lttng_kernel_ring_buffer_config *config, + struct lttng_kernel_ring_buffer *buf, uint64_t *content_size) { struct packet_header *header = client_packet_header(config, buf); @@ -454,8 +455,8 @@ static int client_content_size(const struct lib_ring_buffer_config *config, return 0; } -static int client_packet_size(const struct lib_ring_buffer_config *config, - struct lib_ring_buffer *buf, +static int client_packet_size(const struct lttng_kernel_ring_buffer_config *config, + struct lttng_kernel_ring_buffer *buf, uint64_t *packet_size) { struct packet_header *header = client_packet_header(config, buf); @@ -464,8 +465,8 @@ static int client_packet_size(const struct lib_ring_buffer_config *config, return 0; } -static int client_stream_id(const struct lib_ring_buffer_config *config, - struct lib_ring_buffer *buf, +static int client_stream_id(const struct lttng_kernel_ring_buffer_config *config, + struct lttng_kernel_ring_buffer *buf, uint64_t *stream_id) { struct lttng_kernel_ring_buffer_channel *chan = buf->backend.chan; @@ -475,8 +476,8 @@ static int client_stream_id(const struct lib_ring_buffer_config *config, return 0; } -static int client_current_timestamp(const struct lib_ring_buffer_config *config, - struct lib_ring_buffer *bufb, +static int client_current_timestamp(const struct lttng_kernel_ring_buffer_config *config, + struct lttng_kernel_ring_buffer *bufb, uint64_t *ts) { *ts = config->cb.ring_buffer_clock_read(bufb->backend.chan); @@ -484,8 +485,8 @@ static int client_current_timestamp(const struct lib_ring_buffer_config *config, return 0; } -static int client_sequence_number(const struct lib_ring_buffer_config *config, - struct lib_ring_buffer *buf, +static int client_sequence_number(const struct lttng_kernel_ring_buffer_config *config, + struct lttng_kernel_ring_buffer *buf, uint64_t *seq) { struct packet_header *header = client_packet_header(config, buf); @@ -496,8 +497,8 @@ static int client_sequence_number(const struct lib_ring_buffer_config *config, } static -int client_instance_id(const struct lib_ring_buffer_config *config, - struct lib_ring_buffer *buf, +int client_instance_id(const struct lttng_kernel_ring_buffer_config *config, + struct lttng_kernel_ring_buffer *buf, uint64_t *id) { *id = buf->backend.cpu; @@ -505,7 +506,7 @@ int client_instance_id(const struct lib_ring_buffer_config *config, return 0; } -static const struct lib_ring_buffer_config client_config = { +static const struct lttng_kernel_ring_buffer_config client_config = { .cb.ring_buffer_clock_read = client_ring_buffer_clock_read, .cb.record_header_size = client_record_header_size, .cb.subbuffer_header_size = client_packet_header_size, @@ -514,7 +515,7 @@ static const struct lib_ring_buffer_config client_config = { .cb.buffer_create = client_buffer_create, .cb.buffer_finalize = client_buffer_finalize, - .tsc_bits = LTTNG_COMPACT_TSC_BITS, + .timestamp_bits = LTTNG_COMPACT_TIMESTAMP_BITS, .alloc = RING_BUFFER_ALLOC_PER_CPU, .sync = RING_BUFFER_SYNC_PER_CPU, .mode = RING_BUFFER_MODE_TEMPLATE, @@ -570,9 +571,9 @@ error: } static -struct lib_ring_buffer *lttng_buffer_read_open(struct lttng_kernel_ring_buffer_channel *chan) +struct lttng_kernel_ring_buffer *lttng_buffer_read_open(struct lttng_kernel_ring_buffer_channel *chan) { - struct lib_ring_buffer *buf; + struct lttng_kernel_ring_buffer *buf; int cpu; for_each_channel_cpu(cpu, chan) { @@ -586,7 +587,7 @@ struct lib_ring_buffer *lttng_buffer_read_open(struct lttng_kernel_ring_buffer_c static int lttng_buffer_has_read_closed_stream(struct lttng_kernel_ring_buffer_channel *chan) { - struct lib_ring_buffer *buf; + struct lttng_kernel_ring_buffer *buf; int cpu; for_each_channel_cpu(cpu, chan) { @@ -598,7 +599,7 @@ int lttng_buffer_has_read_closed_stream(struct lttng_kernel_ring_buffer_channel } static -void lttng_buffer_read_close(struct lib_ring_buffer *buf) +void lttng_buffer_read_close(struct lttng_kernel_ring_buffer *buf) { lib_ring_buffer_release_read(buf); } @@ -657,15 +658,17 @@ void lttng_event_commit(struct lttng_kernel_ring_buffer_ctx *ctx) static void lttng_event_write(struct lttng_kernel_ring_buffer_ctx *ctx, const void *src, - size_t len) + size_t len, size_t alignment) { + lib_ring_buffer_align_ctx(ctx, alignment); lib_ring_buffer_write(&client_config, ctx, src, len); } static void lttng_event_write_from_user(struct lttng_kernel_ring_buffer_ctx *ctx, - const void __user *src, size_t len) + const void __user *src, size_t len, size_t alignment) { + lib_ring_buffer_align_ctx(ctx, alignment); lib_ring_buffer_copy_from_user_inatomic(&client_config, ctx, src, len); } @@ -691,6 +694,20 @@ void lttng_event_strcpy_from_user(struct lttng_kernel_ring_buffer_ctx *ctx, len, '#'); } +static +void lttng_event_pstrcpy_pad(struct lttng_kernel_ring_buffer_ctx *ctx, const char *src, + size_t len) +{ + lib_ring_buffer_pstrcpy(&client_config, ctx, src, len, '\0'); +} + +static +void lttng_event_pstrcpy_pad_from_user(struct lttng_kernel_ring_buffer_ctx *ctx, const char __user *src, + size_t len) +{ + lib_ring_buffer_pstrcpy_from_user_inatomic(&client_config, ctx, src, len, '\0'); +} + static void lttng_channel_buffer_lost_event_too_big(struct lttng_kernel_channel_buffer *lttng_chan) { @@ -700,7 +717,7 @@ void lttng_channel_buffer_lost_event_too_big(struct lttng_kernel_channel_buffer static wait_queue_head_t *lttng_get_writer_buf_wait_queue(struct lttng_kernel_ring_buffer_channel *chan, int cpu) { - struct lib_ring_buffer *buf = channel_get_ring_buffer(&client_config, + struct lttng_kernel_ring_buffer *buf = channel_get_ring_buffer(&client_config, chan, cpu); return &buf->write_wait; } @@ -757,6 +774,8 @@ static struct lttng_transport lttng_relay_transport = { .event_memset = lttng_event_memset, .event_strcpy = lttng_event_strcpy, .event_strcpy_from_user = lttng_event_strcpy_from_user, + .event_pstrcpy_pad = lttng_event_pstrcpy_pad, + .event_pstrcpy_pad_from_user = lttng_event_pstrcpy_pad_from_user, .lost_event_too_big = lttng_channel_buffer_lost_event_too_big, }, };