@@ -6446,11 +6446,12 @@ static void get_tsc_offset(struct common_record_context *ctx)
static void set_tsync_params(struct common_record_context *ctx)
{
- const char *clock = ctx->clock;
struct buffer_instance *instance;
int shift, mult;
bool force_tsc = false;
+ char *clock = NULL;
+ if (!ctx->clock) {
/*
* If no clock is configured &&
* KVM time sync protocol is available &&
@@ -6459,18 +6460,35 @@ static void set_tsync_params(struct common_record_context *ctx)
* force using the x86-tsc clock for this host-guest tracing session
* and store TSC to nsec multiplier and shift.
*/
- if (!clock && tsync_proto_is_supported("kvm") &&
- clock_is_supported(NULL, TSC_CLOCK) &&
- !get_tsc_nsec(&shift, &mult) && mult) {
- clock = TSC_CLOCK;
- ctx->tsc2nsec.mult = mult;
- ctx->tsc2nsec.shift = shift;
- ctx->tsc2nsec.offset = get_clock_now(TSC_CLOCK);
- force_tsc = true;
+ if (tsync_proto_is_supported("kvm") &&
+ clock_is_supported(NULL, TSC_CLOCK) &&
+ !get_tsc_nsec(&shift, &mult) && mult) {
+ clock = strdup(TSC_CLOCK);
+ if (!clock)
+ die("Cannot not allocate clock");
+ ctx->tsc2nsec.mult = mult;
+ ctx->tsc2nsec.shift = shift;
+ ctx->tsc2nsec.offset = get_clock_now(TSC_CLOCK);
+ force_tsc = true;
+ } else {
+ /*
+ * Else, use the current clock of the first host instance
+ */
+ for_all_instances(instance) {
+ if (is_guest(instance))
+ continue;
+ clock = tracefs_get_clock(instance->tracefs);
+ break;
+ }
+ }
+ } else {
+ clock = strdup(ctx->clock);
+ if (!clock)
+ die("Cannot not allocate clock");
}
if (!clock && !ctx->tsync_loop_interval)
- return;
+ goto out;
for_all_instances(instance) {
if (clock && !(instance->flags & BUFFER_FL_HAS_CLOCK)) {
/* use the same clock in all tracing peers */
@@ -6492,6 +6510,8 @@ static void set_tsync_params(struct common_record_context *ctx)
}
instance->tsync_loop_interval = ctx->tsync_loop_interval;
}
+out:
+ free(clock);
}
/*
In host-guest tracing session, all peers should use the same tracing clock. If there is no user configured trace clock, the current logic assumes "local" clock for the session. This could be wrong, as other clock than "local" could be already configured on the host, before running trace-cmd. The default clock for host-guest tracing session should be rertieved from the host's "trace_clock" file. Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com> --- tracecmd/trace-record.c | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-)