Linux-Trace-Devel Archive on lore.kernel.org
 help / color / Atom feed
* [PATCH v2 0/2] Useful APIs for merging tracing files
@ 2020-04-13  8:23 Tzvetomir Stoyanov (VMware)
  2020-04-13  8:23 ` [PATCH v2 1/2] trace-cmd: Add new APIs to pair and unpair tracing peers Tzvetomir Stoyanov (VMware)
  2020-04-13  8:23 ` [PATCH v2 2/2] trace-cmd: Validate input parameters of tracecmd_get_guest_cpumap() API Tzvetomir Stoyanov (VMware)
  0 siblings, 2 replies; 3+ messages in thread
From: Tzvetomir Stoyanov (VMware) @ 2020-04-13  8:23 UTC (permalink / raw)
  To: rostedt; +Cc: linux-trace-devel

Helper APIs, used when opening and merging files from same tracing
session.

[
 v2 changes:
  - Renamed tracecmd_set_merge_peer() to tracecmd_pair_peer()
    and introduced tracecmd_unpair_peer() 
]

Tzvetomir Stoyanov (VMware) (2):
  trace-cmd: Add new APIs to pair and unpair tracing peers
  trace-cmd: Validate input parameters of tracecmd_get_guest_cpumap()
    API

 include/trace-cmd/trace-cmd.h |   3 +
 lib/trace-cmd/trace-input.c   | 104 +++++++++++++++++++++++++++++++---
 2 files changed, 100 insertions(+), 7 deletions(-)

-- 
2.25.1


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH v2 1/2] trace-cmd: Add new APIs to pair and unpair tracing peers
  2020-04-13  8:23 [PATCH v2 0/2] Useful APIs for merging tracing files Tzvetomir Stoyanov (VMware)
@ 2020-04-13  8:23 ` Tzvetomir Stoyanov (VMware)
  2020-04-13  8:23 ` [PATCH v2 2/2] trace-cmd: Validate input parameters of tracecmd_get_guest_cpumap() API Tzvetomir Stoyanov (VMware)
  1 sibling, 0 replies; 3+ messages in thread
From: Tzvetomir Stoyanov (VMware) @ 2020-04-13  8:23 UTC (permalink / raw)
  To: rostedt; +Cc: linux-trace-devel

When tracing host and one or more guest machines at the same time,
guest and host are tracing peers. There is information in both trace
files, related to host PID to guest vCPU mapping, timestamp synchronization
and other. This information is useful when opening files at the same time and
merging the events. When the host is set as a tracing peer to the guest, then
the timestamps of guest's events are recalculated to match the host event's time
Two new APIs are intrduced to control pairing of tracing peers:

int tracecmd_pair_peer(struct tracecmd_input *handle,
		       struct tracecmd_input *peer);
int tracecmd_unpair_peer(struct tracecmd_input *handle);

Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
---
 include/trace-cmd/trace-cmd.h |  3 ++
 lib/trace-cmd/trace-input.c   | 95 +++++++++++++++++++++++++++++++++--
 2 files changed, 94 insertions(+), 4 deletions(-)

diff --git a/include/trace-cmd/trace-cmd.h b/include/trace-cmd/trace-cmd.h
index e22aa251..76fcffae 100644
--- a/include/trace-cmd/trace-cmd.h
+++ b/include/trace-cmd/trace-cmd.h
@@ -145,6 +145,9 @@ struct tracecmd_input *tracecmd_alloc_fd(int fd);
 struct tracecmd_input *tracecmd_open(const char *file);
 struct tracecmd_input *tracecmd_open_head(const char *file);
 struct tracecmd_input *tracecmd_open_fd(int fd);
+int tracecmd_pair_peer(struct tracecmd_input *handle,
+		       struct tracecmd_input *peer);
+int tracecmd_unpair_peer(struct tracecmd_input *handle);
 void tracecmd_ref(struct tracecmd_input *handle);
 void tracecmd_close(struct tracecmd_input *handle);
 int tracecmd_read_headers(struct tracecmd_input *handle);
diff --git a/lib/trace-cmd/trace-input.c b/lib/trace-cmd/trace-input.c
index efc8d4bd..cd909613 100644
--- a/lib/trace-cmd/trace-input.c
+++ b/lib/trace-cmd/trace-input.c
@@ -91,8 +91,9 @@ struct guest_trace_info {
 };
 
 struct host_trace_info {
-	unsigned long long	trace_id;
+	unsigned long long	peer_trace_id;
 	bool			sync_enable;
+	struct tracecmd_input	*peer_data;
 	int			ts_samples_count;
 	struct ts_offset_sample	*ts_samples;
 };
@@ -2194,10 +2195,38 @@ static void tsync_offset_load(struct tracecmd_input *handle, char *buf)
 		host->sync_enable = true;
 }
 
+static void tsync_check_enable(struct tracecmd_input *handle)
+{
+	struct host_trace_info	*host = &handle->host;
+	struct guest_trace_info *guest;
+
+	host->sync_enable = false;
+
+	if (!host->peer_data || !host->peer_data->guest ||
+	    !host->ts_samples_count || !host->ts_samples)
+		return;
+	if (host->peer_trace_id != host->peer_data->trace_id)
+		return;
+	guest = host->peer_data->guest;
+	while (guest) {
+		if (guest->trace_id == handle->trace_id)
+			break;
+		guest = guest->next;
+	}
+	if (!guest)
+		return;
+
+	host->sync_enable = true;
+}
+
 static void trace_tsync_offset_free(struct host_trace_info *host)
 {
 	free(host->ts_samples);
 	host->ts_samples = NULL;
+	if (host->peer_data) {
+		tracecmd_close(host->peer_data);
+		host->peer_data = NULL;
+	}
 }
 
 static int trace_pid_map_cmp(const void *a, const void *b)
@@ -2510,8 +2539,8 @@ static int handle_options(struct tracecmd_input *handle)
 			 */
 			if (size < 12 || handle->flags & TRACECMD_FL_IGNORE_DATE)
 				break;
-			handle->host.trace_id = tep_read_number(handle->pevent,
-								buf, 8);
+			handle->host.peer_trace_id = tep_read_number(handle->pevent,
+								     buf, 8);
 			handle->host.ts_samples_count = tep_read_number(handle->pevent,
 									buf + 8, 4);
 			samples_size = (8 * handle->host.ts_samples_count);
@@ -3203,6 +3232,64 @@ fail:
 	return NULL;
 }
 
+/**
+ * tracecmd_unpair_peer - Link a tracing peer to this handle
+ * @handle: input handle for the trace.dat file
+ * @peer: input handle for the tracing peer
+ *
+ * When tracing host and one or more guest machines at the same time,
+ * guest and host are tracing peers. There is information in both trace
+ * files, related to host PID to guest vCPU mapping, timestamp synchronization
+ * and other. This information is useful when opening files at the same time and
+ * merging the events. When the host is set as a tracing peer to the guest, then
+ * the timestamps of guest's events are recalculated to match the host event's time
+ *
+ * Returns 1, if a peer is already paired, -1 in case of an error or 0 otherwise
+ */
+int tracecmd_unpair_peer(struct tracecmd_input *handle)
+{
+	if (!handle)
+		return -1;
+
+	if (handle->host.peer_data) {
+		tracecmd_close(handle->host.peer_data);
+		handle->host.peer_data = NULL;
+		tsync_check_enable(handle);
+	}
+
+	return 0;
+}
+
+/**
+ * tracecmd_pair_peer - Link a tracing peer to this handle
+ * @handle: input handle for the trace.dat file
+ * @peer: input handle for the tracing peer
+ *
+ * When tracing host and one or more guest machines at the same time,
+ * guest and host are tracing peers. There is information in both trace
+ * files, related to host PID to guest vCPU mapping, timestamp synchronization
+ * and other. This information is useful when opening files at the same time and
+ * merging the events. When the host is set as a tracing peer to the guest, then
+ * the timestamps of guest's events are recalculated to match the host event's time
+ *
+ * Returns 1, if a peer is already paired, -1 in case of an error or 0 otherwise
+ */
+int tracecmd_pair_peer(struct tracecmd_input *handle,
+		       struct tracecmd_input *peer)
+{
+	if (!handle)
+		return -1;
+
+	if (handle->host.peer_data)
+		return 1;
+
+	handle->host.peer_data = peer;
+	tracecmd_ref(peer);
+	tsync_check_enable(handle);
+
+	return 0;
+}
+
 /**
  * tracecmd_ref - add a reference to the handle
  * @handle: input handle for the trace.dat file
@@ -3785,7 +3872,7 @@ int tracecmd_get_guest_cpumap(struct tracecmd_input *handle,
  */
 unsigned long long tracecmd_get_tsync_peer(struct tracecmd_input *handle)
 {
-	return handle->host.trace_id;
+	return handle->host.peer_trace_id;
 }
 
 /**
-- 
2.25.1


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH v2 2/2] trace-cmd: Validate input parameters of tracecmd_get_guest_cpumap() API
  2020-04-13  8:23 [PATCH v2 0/2] Useful APIs for merging tracing files Tzvetomir Stoyanov (VMware)
  2020-04-13  8:23 ` [PATCH v2 1/2] trace-cmd: Add new APIs to pair and unpair tracing peers Tzvetomir Stoyanov (VMware)
@ 2020-04-13  8:23 ` Tzvetomir Stoyanov (VMware)
  1 sibling, 0 replies; 3+ messages in thread
From: Tzvetomir Stoyanov (VMware) @ 2020-04-13  8:23 UTC (permalink / raw)
  To: rostedt; +Cc: linux-trace-devel

The API:
int tracecmd_get_guest_cpumap(struct tracecmd_input *handle,
			      unsigned long long trace_id,
			      const char **name,
			      int *vcpu_count, const int **cpu_pid)
is used to retrieve the host PID to guest VCPU mapping from a tracecmd input
handle, if such information is available in the trace.dat file for
the peer with the given trace_id. The input parameters name, vcpu_count and
cpu_pid are mandatory, they are used to return then requested mapping.
The API could be used also to check if such information is available, without
requesting it. Made those input parameters optional, so the API can be used
in this use case.

Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
---
 lib/trace-cmd/trace-input.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/lib/trace-cmd/trace-input.c b/lib/trace-cmd/trace-input.c
index cd909613..bbf5367d 100644
--- a/lib/trace-cmd/trace-input.c
+++ b/lib/trace-cmd/trace-input.c
@@ -3856,9 +3856,12 @@ int tracecmd_get_guest_cpumap(struct tracecmd_input *handle,
 	if (!guest)
 		return -1;
 
-	*name = guest->name;
-	*vcpu_count = guest->vcpu_count;
-	*cpu_pid = guest->cpu_pid;
+	if (name)
+		*name = guest->name;
+	if (vcpu_count)
+		*vcpu_count = guest->vcpu_count;
+	if (cpu_pid)
+		*cpu_pid = guest->cpu_pid;
 	return 0;
 }
 
-- 
2.25.1


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, back to index

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-13  8:23 [PATCH v2 0/2] Useful APIs for merging tracing files Tzvetomir Stoyanov (VMware)
2020-04-13  8:23 ` [PATCH v2 1/2] trace-cmd: Add new APIs to pair and unpair tracing peers Tzvetomir Stoyanov (VMware)
2020-04-13  8:23 ` [PATCH v2 2/2] trace-cmd: Validate input parameters of tracecmd_get_guest_cpumap() API Tzvetomir Stoyanov (VMware)

Linux-Trace-Devel Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-trace-devel/0 linux-trace-devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-trace-devel linux-trace-devel/ https://lore.kernel.org/linux-trace-devel \
		linux-trace-devel@vger.kernel.org
	public-inbox-index linux-trace-devel

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-trace-devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git