Properly fix the timekeeping overflow detection
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 26 Jan 2012 20:13:55 +0000 (15:13 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 26 Jan 2012 20:13:55 +0000 (15:13 -0500)
The underlying issue was a mismatch between the ring buffer
configuration description of the number of clock bits (32) saved and the
actual number used (27).

Introduce LTTNG_COMPACT_EVENT_BITS and LTTNG_COMPACT_TSC_BITS across the
code to remove all hardcoded instances of these values to ensure this
kind of mistake does not happen again.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Reported-by: Sébastien Barthélémy <barthelemy@crans.org>
lttng-ring-buffer-client.h

index 1a04520c6d83ee6ee9026640c50f59a2374b215e..e05e2bf4a34aaaf34bbf0912e34efe3c239cfa37 100644 (file)
@@ -17,6 +17,9 @@
 #include "lttng-tracer.h"
 #include "wrapper/ringbuffer/frontend_types.h"
 
+#define LTTNG_COMPACT_EVENT_BITS       5
+#define LTTNG_COMPACT_TSC_BITS         27
+
 /*
  * Keep the natural field alignment for _each field_ within this structure if
  * you ever add/remove a field from this header. Packed attribute is not used
@@ -120,8 +123,8 @@ unsigned char record_header_size(const struct lib_ring_buffer_config *config,
                if (!(ctx->rflags & (RING_BUFFER_RFLAG_FULL_TSC | LTTNG_RFLAG_EXTENDED))) {
                        offset += sizeof(uint32_t);     /* id and timestamp */
                } else {
-                       /* Minimum space taken by 5-bit id */
-                       offset += sizeof(uint8_t);
+                       /* Minimum space taken by LTTNG_COMPACT_EVENT_BITS id */
+                       offset += (LTTNG_COMPACT_EVENT_BITS + CHAR_BIT - 1) / CHAR_BIT;
                        /* Align extended struct on largest member */
                        offset += lib_ring_buffer_align(offset, lttng_alignof(uint64_t));
                        offset += sizeof(uint32_t);     /* id */
@@ -187,8 +190,14 @@ void lttng_write_event_header(const struct lib_ring_buffer_config *config,
        {
                uint32_t id_time = 0;
 
-               bt_bitfield_write(&id_time, uint32_t, 0, 5, event_id);
-               bt_bitfield_write(&id_time, uint32_t, 5, 27, ctx->tsc);
+               bt_bitfield_write(&id_time, uint32_t,
+                               0,
+                               LTTNG_COMPACT_EVENT_BITS,
+                               event_id);
+               bt_bitfield_write(&id_time, uint32_t,
+                               LTTNG_COMPACT_EVENT_BITS,
+                               LTTNG_COMPACT_TSC_BITS,
+                               ctx->tsc);
                lib_ring_buffer_write(config, ctx, &id_time, sizeof(id_time));
                break;
        }
@@ -229,14 +238,22 @@ void lttng_write_event_header_slow(const struct lib_ring_buffer_config *config,
                if (!(ctx->rflags & (RING_BUFFER_RFLAG_FULL_TSC | LTTNG_RFLAG_EXTENDED))) {
                        uint32_t id_time = 0;
 
-                       bt_bitfield_write(&id_time, uint32_t, 0, 5, event_id);
-                       bt_bitfield_write(&id_time, uint32_t, 5, 27, ctx->tsc);
+                       bt_bitfield_write(&id_time, uint32_t,
+                                       0,
+                                       LTTNG_COMPACT_EVENT_BITS,
+                                       event_id);
+                       bt_bitfield_write(&id_time, uint32_t,
+                                       LTTNG_COMPACT_EVENT_BITS,
+                                       LTTNG_COMPACT_TSC_BITS, ctx->tsc);
                        lib_ring_buffer_write(config, ctx, &id_time, sizeof(id_time));
                } else {
                        uint8_t id = 0;
                        uint64_t timestamp = ctx->tsc;
 
-                       bt_bitfield_write(&id, uint8_t, 0, 5, 31);
+                       bt_bitfield_write(&id, uint8_t,
+                                       0,
+                                       LTTNG_COMPACT_EVENT_BITS,
+                                       31);
                        lib_ring_buffer_write(config, ctx, &id, sizeof(id));
                        /* Align extended struct on largest member */
                        lib_ring_buffer_align_ctx(ctx, lttng_alignof(uint64_t));
@@ -368,7 +385,7 @@ static const struct lib_ring_buffer_config client_config = {
        .cb.buffer_create = client_buffer_create,
        .cb.buffer_finalize = client_buffer_finalize,
 
-       .tsc_bits = 32,
+       .tsc_bits = LTTNG_COMPACT_TSC_BITS,
        .alloc = RING_BUFFER_ALLOC_PER_CPU,
        .sync = RING_BUFFER_SYNC_PER_CPU,
        .mode = RING_BUFFER_MODE_TEMPLATE,
This page took 0.027669 seconds and 4 git commands to generate.