From dc113ec73c678a64d75b70297c042f8cbde3d2a1 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Mon, 8 Feb 2016 17:13:25 -0500 Subject: [PATCH] Fix: handle negative clock offset for lttng-ust metadata MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit In the unlikely situation where a system sets its hardware clock (CLOCK_REALTIME) to 0 (Epoch) after boot, the difference monotonic - realtime becomes negative. Fixup this situation by returning a 0 offset in this case. This ensures that trace viewer implementations (e.g. babeltrace) which currently cannot handle the negative offset (known bug) still work with the generated traces. This patch should be applied to master and stable-2.7. Signed-off-by: Mathieu Desnoyers Signed-off-by: Jérémie Galarneau --- src/bin/lttng-sessiond/ust-metadata.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/bin/lttng-sessiond/ust-metadata.c b/src/bin/lttng-sessiond/ust-metadata.c index 984d5f813..276dc7a44 100644 --- a/src/bin/lttng-sessiond/ust-metadata.c +++ b/src/bin/lttng-sessiond/ust-metadata.c @@ -604,11 +604,17 @@ int _lttng_event_header_declare(struct ust_registry_session *session) ); } +/* + * The offset between monotonic and realtime clock can be negative if + * the system sets the REALTIME clock to 0 after boot. + * Currently handle this by flooring the offset at 0. + */ static int measure_single_clock_offset(struct offset_sample *sample) { - uint64_t offset, monotonic[2], measure_delta, realtime; + uint64_t monotonic_avg, monotonic[2], measure_delta, realtime; uint64_t tcf = trace_clock_freq(); + int64_t offset; struct timespec rts = { 0, 0 }; int ret; @@ -626,15 +632,15 @@ int measure_single_clock_offset(struct offset_sample *sample) */ return 0; } - offset = (monotonic[0] + monotonic[1]) >> 1; + monotonic_avg = (monotonic[0] + monotonic[1]) >> 1; realtime = (uint64_t) rts.tv_sec * tcf; if (tcf == NSEC_PER_SEC) { realtime += rts.tv_nsec; } else { realtime += (uint64_t) rts.tv_nsec * tcf / NSEC_PER_SEC; } - offset = realtime - offset; - sample->offset = offset; + offset = (int64_t) realtime - monotonic_avg; + sample->offset = max(offset, 0); sample->measure_delta = measure_delta; return 0; } -- 2.34.1