@@ -571,6 +571,7 @@ void tracecmd_tsync_free(struct tracecmd_time_sync *tsync)
}
pthread_mutex_destroy(&tsync->lock);
pthread_cond_destroy(&tsync->cond);
+ pthread_barrier_destroy(&tsync->first_sync);
free(tsync->clock_str);
free(tsync->proto_name);
free(tsync);
@@ -753,6 +754,7 @@ static int tsync_with_guest(struct tracecmd_time_sync *tsync)
int ts_array_size = CLOCK_TS_ARRAY;
struct tsync_proto *proto;
struct timespec timeout;
+ bool first = true;
bool end = false;
int ret;
int i;
@@ -777,6 +779,10 @@ static int tsync_with_guest(struct tracecmd_time_sync *tsync)
if (ret)
break;
}
+ if (first) {
+ first = false;
+ pthread_barrier_wait(&tsync->first_sync);
+ }
if (end || i < tsync->vcpu_count)
break;
if (tsync->loop_interval > 0) {
@@ -804,12 +810,17 @@ static int tsync_with_guest(struct tracecmd_time_sync *tsync)
static void *tsync_host_thread(void *data)
{
struct tracecmd_time_sync *tsync = NULL;
+ int ret;
tsync = (struct tracecmd_time_sync *)data;
- tsync_with_guest(tsync);
+ ret = tsync_with_guest(tsync);
tracecmd_msg_handle_close(tsync->msg_handle);
tsync->msg_handle = NULL;
+ /* tsync with guest failed, release the barrier */
+ if (ret)
+ pthread_barrier_wait(&tsync->first_sync);
+
pthread_exit(0);
}
@@ -868,6 +879,7 @@ tracecmd_tsync_with_guest(unsigned long long trace_id, int loop_interval,
tsync->clock_str = strdup(clock);
pthread_mutex_init(&tsync->lock, NULL);
pthread_cond_init(&tsync->cond, NULL);
+ pthread_barrier_init(&tsync->first_sync, NULL, 2);
pthread_attr_init(&attrib);
pthread_attr_setdetachstate(&attrib, PTHREAD_CREATE_JOINABLE);
@@ -878,6 +890,7 @@ tracecmd_tsync_with_guest(unsigned long long trace_id, int loop_interval,
if (!get_first_cpu(&pin_mask, &mask_size))
pthread_setaffinity_np(tsync->thread, mask_size, pin_mask);
+ pthread_barrier_wait(&tsync->first_sync);
if (pin_mask)
CPU_FREE(pin_mask);
Added a barrier in time synchronization threads to ensure the first time synchronization passed before to start the trace. Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com> --- lib/trace-cmd/trace-timesync.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)