Linux-Trace-Devel Archive on lore.kernel.org
 help / color / Atom feed
* [PATCH 0/5] Add support for opening trace.dat files with multuiple buffers
@ 2020-07-27  7:18 Tzvetomir Stoyanov (VMware)
  2020-07-27  7:18 ` [PATCH 1/5] KernelShark: Add stream name Tzvetomir Stoyanov (VMware)
                   ` (4 more replies)
  0 siblings, 5 replies; 9+ messages in thread
From: Tzvetomir Stoyanov (VMware) @ 2020-07-27  7:18 UTC (permalink / raw)
  To: rostedt; +Cc: linux-trace-devel

From: "Tzvetomir (VMware)  Stoyanov" <tz.stoyanov@gmail.com>

Ftrace supports parallel tracing in isolated ring buffers. Trace-cmd
also supprts this ftrace functionality, it saves the data from all
buffers into single trace.dat file. When such file is opened by
KernelShark, it loads the tracing data only from the top biffer.
Support for loading data from all buffers, located in a single trace.dat
file, is added. Each buffer is loaded as different KernelShark session.

Tzvetomir (VMware)  Stoyanov (5):
  KernelShark: Add stream name
  KernelShark: Fix compilation issues on  Fedora 32
  KernelShark: Fix combo plot plugin crash in case of multiple streams
  KernelShark: Load trace.dat file with ftrace sub-buffers
  KernelShark: New libkshark API for loading all entries from given file

 src/KsAdvFilteringDialog.cpp   |   2 +-
 src/KsPlotTools.cpp            |   1 +
 src/KsPlotTools.hpp            |   1 +
 src/KsUtils.cpp                |   4 +-
 src/KsUtils.hpp                |   4 +-
 src/KsWidgetsLib.cpp           |   6 +-
 src/libkshark-plugin.c         |   2 +-
 src/libkshark-tepdata.c        | 122 +++++++++++++++++++++++++--------
 src/libkshark.c                |  38 ++++++++--
 src/libkshark.h                |   6 ++
 src/plugins/KVMCombo.cpp       |  11 ++-
 src/plugins/event_field_plot.c |   2 +-
 src/plugins/latency_plot.c     |   4 +-
 13 files changed, 153 insertions(+), 50 deletions(-)

-- 
2.26.2


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

* [PATCH 1/5] KernelShark: Add stream name
  2020-07-27  7:18 [PATCH 0/5] Add support for opening trace.dat files with multuiple buffers Tzvetomir Stoyanov (VMware)
@ 2020-07-27  7:18 ` Tzvetomir Stoyanov (VMware)
  2020-07-28 13:21   ` Steven Rostedt
  2020-07-27  7:18 ` [PATCH 2/5] KernelShark: Fix compilation issues on Fedora 32 Tzvetomir Stoyanov (VMware)
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 9+ messages in thread
From: Tzvetomir Stoyanov (VMware) @ 2020-07-27  7:18 UTC (permalink / raw)
  To: rostedt; +Cc: linux-trace-devel

From: Tzvetomir (VMware)  Stoyanov <tz.stoyanov@gmail.com>

There are use cases when multiple streams can be loaded from a single
file. Ftrace instances are such example. In these cases file name could
not be used to identify the streams. A new member 'name' is added to the
'struct kshark_data_stream', used to identify the streams by the user.
By default name is equal to the file name, in cases where there is onle
one stream in the file the behaviour is not changed. When there are
multiple streams in a single file, the name is formed as
"file name:stream name".

Signed-off-by: Tzvetomir (VMware)  Stoyanov <tz.stoyanov@gmail.com>
---
 src/KsAdvFilteringDialog.cpp   | 2 +-
 src/KsWidgetsLib.cpp           | 6 +++---
 src/libkshark-plugin.c         | 2 +-
 src/libkshark.c                | 2 ++
 src/libkshark.h                | 3 +++
 src/plugins/KVMCombo.cpp       | 4 ++--
 src/plugins/event_field_plot.c | 2 +-
 src/plugins/latency_plot.c     | 4 ++--
 8 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/src/KsAdvFilteringDialog.cpp b/src/KsAdvFilteringDialog.cpp
index 64c4cec..6979903 100644
--- a/src/KsAdvFilteringDialog.cpp
+++ b/src/KsAdvFilteringDialog.cpp
@@ -236,7 +236,7 @@ void KsAdvFilteringDialog::_getFtraceStreams(kshark_context *kshark_ctx)
 	for (int i = 0; i < kshark_ctx->n_streams; ++i) {
 		stream = kshark_ctx->stream[streamIds[i]];
 		if (stream->format == KS_TEP_DATA)
-			_streamComboBox.addItem(QString(stream->file),
+			_streamComboBox.addItem(QString(stream->name),
 						streamIds[i]);
 	}
 
diff --git a/src/KsWidgetsLib.cpp b/src/KsWidgetsLib.cpp
index e487eb8..f006a13 100644
--- a/src/KsWidgetsLib.cpp
+++ b/src/KsWidgetsLib.cpp
@@ -325,7 +325,7 @@ void KsCheckBoxWidget::_setStream(uint8_t sd)
 	if (!stream)
 		return;
 
-	_streamName = QString(stream->file);
+	_streamName = QString(stream->name);
 
 	KsUtils::setElidedText(&_stramLabel, _streamName,
 			       Qt::ElideLeft, width());
@@ -1148,7 +1148,7 @@ KsDStreamCheckBoxWidget::KsDStreamCheckBoxWidget(QWidget *parent)
 
 	for (int i = 0; i < nStreams; ++i) {
 		stream = kshark_ctx->stream[streamIds[i]];
-		QString name(stream->file);
+		QString name(stream->name);
 		if (name < 40) {
 			nameItem = new QTableWidgetItem(name);
 		} else {
@@ -1235,7 +1235,7 @@ void KsEventFieldSelectWidget::setStreamCombo()
 		sd = streamIds[i];
 		stream = kshark_ctx->stream[sd];
 		if (_streamComboBox.findData(sd) < 0)
-			_streamComboBox.addItem(QString(stream->file), sd);
+			_streamComboBox.addItem(QString(stream->name), sd);
 	}
 	free(streamIds);
 }
diff --git a/src/libkshark-plugin.c b/src/libkshark-plugin.c
index d341fea..583ea42 100644
--- a/src/libkshark-plugin.c
+++ b/src/libkshark-plugin.c
@@ -584,7 +584,7 @@ static void plugin_init(struct kshark_data_stream *stream,
 		fprintf(stderr,
 			"plugin \"%s\" failed to initialize on stream %s\n",
 			plugin->interface->name,
-			stream->file);
+			stream->name);
 
 		plugin->status |= KSHARK_PLUGIN_FAILED;
 		plugin->status &= ~KSHARK_PLUGIN_LOADED;
diff --git a/src/libkshark.c b/src/libkshark.c
index 7013d66..375874d 100644
--- a/src/libkshark.c
+++ b/src/libkshark.c
@@ -137,6 +137,7 @@ static void kshark_stream_free(struct kshark_data_stream *stream)
 
 	free(stream->calib_array);
 	free(stream->file);
+	free(stream->name);
 	free(stream);
 }
 
@@ -255,6 +256,7 @@ int kshark_stream_open(struct kshark_data_stream *stream, const char *file)
 		return -EAGAIN;
 
 	stream->file = strdup(file);
+	stream->name = strdup(file);
 	set_format(kshark_ctx, stream, file);
 
 	switch (stream->format) {
diff --git a/src/libkshark.h b/src/libkshark.h
index 0b9053d..44bec79 100644
--- a/src/libkshark.h
+++ b/src/libkshark.h
@@ -238,6 +238,9 @@ struct kshark_data_stream {
 	/** Trace data file pathname. */
 	char			*file;
 
+	/** Stream name. */
+	char			*name;
+
 	/** System clock calibration function. */
 	time_calib_func		calib;
 
diff --git a/src/plugins/KVMCombo.cpp b/src/plugins/KVMCombo.cpp
index 9b9d7a0..ceb1f47 100644
--- a/src/plugins/KVMCombo.cpp
+++ b/src/plugins/KVMCombo.cpp
@@ -250,7 +250,7 @@ void KsComboPlotDialog::update()
 		_guestMapCount = ret;
 
 	KsUtils::setElidedText(&_hostFileLabel,
-			       kshark_ctx->stream[_guestMap[0].host_id]->file,
+			       kshark_ctx->stream[_guestMap[0].host_id]->name,
 			       Qt::ElideLeft, LABEL_WIDTH);
 
 	_guestStreamComboBox.clear();
@@ -260,7 +260,7 @@ void KsComboPlotDialog::update()
 		if (sd >= kshark_ctx->n_streams)
 			continue;
 
-		_guestStreamComboBox.addItem(kshark_ctx->stream[sd]->file, sd);
+		_guestStreamComboBox.addItem(kshark_ctx->stream[sd]->name, sd);
 		color << colTable[sd];
 		_guestStreamComboBox.setItemData(i, QBrush(color),
 						    Qt::BackgroundRole);
diff --git a/src/plugins/event_field_plot.c b/src/plugins/event_field_plot.c
index fcc2a19..3c61cbf 100644
--- a/src/plugins/event_field_plot.c
+++ b/src/plugins/event_field_plot.c
@@ -72,7 +72,7 @@ plugin_efp_init_context(struct kshark_data_stream *stream)
 
 	if (plugin_ctx->event_id < 0) {
 		fprintf(stderr, "Event %s not found in stream %s\n",
-			plugin_ctx->event_name, stream->file);
+			plugin_ctx->event_name, stream->name);
 		goto fail;
 	}
 
diff --git a/src/plugins/latency_plot.c b/src/plugins/latency_plot.c
index bcd27f6..e2238e4 100644
--- a/src/plugins/latency_plot.c
+++ b/src/plugins/latency_plot.c
@@ -75,7 +75,7 @@ plugin_latency_init_context(struct kshark_data_stream *stream)
 		stream->interface.find_event_id(stream, plugin_ctx->event_name[0]);
 	if (plugin_ctx->event_id[0] < 0) {
 		fprintf(stderr, "Event %s not found in stream %s\n",
-			plugin_ctx->event_name[0], stream->file);
+			plugin_ctx->event_name[0], stream->name);
 		goto fail;
 	}
 
@@ -83,7 +83,7 @@ plugin_latency_init_context(struct kshark_data_stream *stream)
 		stream->interface.find_event_id(stream, plugin_ctx->event_name[1]);
 	if (plugin_ctx->event_id[1] < 0) {
 		fprintf(stderr, "Event %s not found in stream %s\n",
-			plugin_ctx->event_name[1], stream->file);
+			plugin_ctx->event_name[1], stream->name);
 		goto fail;
 	}
 
-- 
2.26.2


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

* [PATCH 2/5] KernelShark: Fix compilation issues on  Fedora 32
  2020-07-27  7:18 [PATCH 0/5] Add support for opening trace.dat files with multuiple buffers Tzvetomir Stoyanov (VMware)
  2020-07-27  7:18 ` [PATCH 1/5] KernelShark: Add stream name Tzvetomir Stoyanov (VMware)
@ 2020-07-27  7:18 ` Tzvetomir Stoyanov (VMware)
  2020-07-28 13:23   ` Steven Rostedt
  2020-07-27  7:18 ` [PATCH 3/5] KernelShark: Fix combo plot plugin crash in case of multiple streams Tzvetomir Stoyanov (VMware)
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 9+ messages in thread
From: Tzvetomir Stoyanov (VMware) @ 2020-07-27  7:18 UTC (permalink / raw)
  To: rostedt; +Cc: linux-trace-devel

From: Tzvetomir (VMware)  Stoyanov <tz.stoyanov@gmail.com>

Included <string.h> to fix this compilation error:
   "error: ‘string’ in namespace ‘std’ does not name a type"
Converted fontHeight and stringWidth to inline to fix these
compilation errors:
   "multiple definition of `fontHeight';"
   "multiple definition of `stringWidth';"

Signed-off-by: Tzvetomir (VMware)  Stoyanov <tz.stoyanov@gmail.com>
---
 src/KsPlotTools.cpp | 1 +
 src/KsPlotTools.hpp | 1 +
 src/KsUtils.hpp     | 4 ++--
 3 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/KsPlotTools.cpp b/src/KsPlotTools.cpp
index 17db451..7dcd4f2 100644
--- a/src/KsPlotTools.cpp
+++ b/src/KsPlotTools.cpp
@@ -12,6 +12,7 @@
 // C
 #include <math.h>
 #include <cstring>
+#include <string>
 
 // C++
 #include <algorithm>
diff --git a/src/KsPlotTools.hpp b/src/KsPlotTools.hpp
index 75fb4da..c66fea3 100644
--- a/src/KsPlotTools.hpp
+++ b/src/KsPlotTools.hpp
@@ -14,6 +14,7 @@
 
 // C
 #include <math.h>
+#include <string>
 
 // C++
 #include <limits>
diff --git a/src/KsUtils.hpp b/src/KsUtils.hpp
index cfb45f4..5857099 100644
--- a/src/KsUtils.hpp
+++ b/src/KsUtils.hpp
@@ -36,7 +36,7 @@
 
 //! @cond Doxygen_Suppress
 
-auto fontHeight = []()
+inline auto fontHeight = []()
 {
 	QFont font;
 	QFontMetrics fm(font);
@@ -44,7 +44,7 @@ auto fontHeight = []()
 	return fm.height();
 };
 
-auto stringWidth = [](QString s)
+inline auto stringWidth = [](QString s)
 {
 	QFont font;
 	QFontMetrics fm(font);
-- 
2.26.2


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

* [PATCH 3/5] KernelShark: Fix combo plot plugin crash in case of multiple streams
  2020-07-27  7:18 [PATCH 0/5] Add support for opening trace.dat files with multuiple buffers Tzvetomir Stoyanov (VMware)
  2020-07-27  7:18 ` [PATCH 1/5] KernelShark: Add stream name Tzvetomir Stoyanov (VMware)
  2020-07-27  7:18 ` [PATCH 2/5] KernelShark: Fix compilation issues on Fedora 32 Tzvetomir Stoyanov (VMware)
@ 2020-07-27  7:18 ` Tzvetomir Stoyanov (VMware)
  2020-07-28 13:26   ` Steven Rostedt
  2020-07-27  7:18 ` [PATCH 4/5] KernelShark: Load trace.dat file with ftrace sub-buffers Tzvetomir Stoyanov (VMware)
  2020-07-27  7:18 ` [PATCH 5/5] KernelShark: New libkshark API for loading all entries from given file Tzvetomir Stoyanov (VMware)
  4 siblings, 1 reply; 9+ messages in thread
From: Tzvetomir Stoyanov (VMware) @ 2020-07-27  7:18 UTC (permalink / raw)
  To: rostedt; +Cc: linux-trace-devel

From: Tzvetomir (VMware)  Stoyanov <tz.stoyanov@gmail.com>

Added a check if there is a host-guest mapping in the loaded
multiple streams. If there is no such mapping, print an error and
exit the KsComboPlotDialog::update() function.

Signed-off-by: Tzvetomir (VMware)  Stoyanov <tz.stoyanov@gmail.com>
---
 src/plugins/KVMCombo.cpp | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/plugins/KVMCombo.cpp b/src/plugins/KVMCombo.cpp
index ceb1f47..3ec36b6 100644
--- a/src/plugins/KVMCombo.cpp
+++ b/src/plugins/KVMCombo.cpp
@@ -246,7 +246,12 @@ void KsComboPlotDialog::update()
 	_guestMap = nullptr;
 	_guestMapCount = 0;
 	ret = kshark_tracecmd_get_hostguest_mapping(&_guestMap);
-	if (ret > 0)
+	if (ret <= 0) {
+		QString err("Cannot find host / guest tracing into the loaded streams");
+		QMessageBox msgBox;
+		msgBox.critical(nullptr, "Error", err);
+		return;
+	} else
 		_guestMapCount = ret;
 
 	KsUtils::setElidedText(&_hostFileLabel,
-- 
2.26.2


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

* [PATCH 4/5] KernelShark: Load trace.dat file with ftrace sub-buffers
  2020-07-27  7:18 [PATCH 0/5] Add support for opening trace.dat files with multuiple buffers Tzvetomir Stoyanov (VMware)
                   ` (2 preceding siblings ...)
  2020-07-27  7:18 ` [PATCH 3/5] KernelShark: Fix combo plot plugin crash in case of multiple streams Tzvetomir Stoyanov (VMware)
@ 2020-07-27  7:18 ` Tzvetomir Stoyanov (VMware)
  2020-07-27  7:18 ` [PATCH 5/5] KernelShark: New libkshark API for loading all entries from given file Tzvetomir Stoyanov (VMware)
  4 siblings, 0 replies; 9+ messages in thread
From: Tzvetomir Stoyanov (VMware) @ 2020-07-27  7:18 UTC (permalink / raw)
  To: rostedt; +Cc: linux-trace-devel

From: Tzvetomir (VMware)  Stoyanov <tz.stoyanov@gmail.com>

Ftrace supports parallel tracing in isolated ring buffers. Trace-cmd
also supprts this ftrace functionality, it saves the data from all
buffers into single trace.dat file. When such file is opened by
KernelShark, it loads the tracing data only from the top biffer.
Support for loading data from all buffers, located in a single trace.dat
file, is added. Each buffer is loaded as different KernelShark session.

Signed-off-by: Tzvetomir (VMware)  Stoyanov <tz.stoyanov@gmail.com>
---
 src/libkshark-tepdata.c | 122 ++++++++++++++++++++++++++++++----------
 1 file changed, 92 insertions(+), 30 deletions(-)

diff --git a/src/libkshark-tepdata.c b/src/libkshark-tepdata.c
index efd8c82..4b3a57d 100644
--- a/src/libkshark-tepdata.c
+++ b/src/libkshark-tepdata.c
@@ -1134,55 +1134,60 @@ out:
 	return peer_handle;
 }
 
-/** Initialize the FTRACE data input (from file). */
-int kshark_tep_init_input(struct kshark_data_stream *stream,
-			  const char *file)
+static int kshark_tep_init_stream(struct kshark_context *kshark_ctx,
+				  struct kshark_data_stream *stream,
+				  const char *file,
+				  struct kshark_data_stream *parent,
+				  int instance)
 {
-	struct kshark_context *kshark_ctx = NULL;
 	struct tepdata_handle *tep_handle;
-	struct kshark_plugin_list *plugin;
+	struct tepdata_handle *tep_parent;
 	struct tracecmd_input *merge_peer;
+	struct kshark_plugin_list *plugin;
 	struct tep_event *event;
 	int i, n_tep_plugins;
 	int ret;
-
-	if (!kshark_instance(&kshark_ctx) || !init_thread_seq())
-		return -EEXIST;
-
-	/*
-	 * Turn off function trace indent and turn on show parent
-	 * if possible.
-	 */
-	tep_plugin_add_option("ftrace:parent", "1");
-	tep_plugin_add_option("ftrace:indent", "0");
+	char *name;
 
 	tep_handle = calloc(1, sizeof(*tep_handle));
 	if (!tep_handle)
 		return -EFAULT;
 
-	/** Open the tracing file, parse headers and create trace input context */
-	tep_handle->input = tracecmd_open_head(file);
-	if (!tep_handle->input) {
-		free(tep_handle);
-		stream->interface.handle = NULL;
-		return -EEXIST;
+	if (!parent || instance < 0) {
+		/** Open the tracing file, parse headers and create trace input context */
+		tep_handle->input = tracecmd_open_head(file);
+		if (!tep_handle->input) {
+			free(tep_handle);
+			stream->interface.handle = NULL;
+			return -EEXIST;
+		}
+		/** Find a merge peer from the same tracing session */
+		merge_peer = kshark_tep_find_merge_peer(kshark_ctx, tep_handle->input);
+		if (merge_peer)
+			tracecmd_pair_peer(tep_handle->input, merge_peer);
+
+		/** Read the racing data from the file */
+		ret = tracecmd_init_data(tep_handle->input);
+		name = "top";
+	} else {
+		tep_parent = (struct tepdata_handle *)parent->interface.handle;
+		name = tracecmd_buffer_instance_name(tep_parent->input, instance);
+		stream->file = strdup(file);
+		asprintf(&stream->name, "%s:%s", stream->file, name);
+		tep_handle->input = tracecmd_buffer_instance_handle(tep_parent->input, instance);
+		tracecmd_print_stats(tep_handle->input);
+		if (!tep_handle->input)
+			ret = -1;
+		else
+			ret = 0;
 	}
 
-	/** Find a merge peer from the same tracing session */
-	merge_peer = kshark_tep_find_merge_peer(kshark_ctx, tep_handle->input);
-	if (merge_peer)
-		tracecmd_pair_peer(tep_handle->input, merge_peer);
-
-	/** Read the racing data from the file */
-	ret = tracecmd_init_data(tep_handle->input);
-
 	if (ret < 0) {
 		tracecmd_close(tep_handle->input);
 		free(tep_handle);
 		stream->interface.handle = NULL;
 		return -EEXIST;
 	}
-
 	tep_handle->tep = tracecmd_get_pevent(tep_handle->input);
 
 	tep_handle->sched_switch_event_id = -EINVAL;
@@ -1224,8 +1229,65 @@ int kshark_tep_init_input(struct kshark_data_stream *stream,
 	}
 
 	kshark_handle_all_dpis(stream, KSHARK_PLUGIN_INIT);
+	return 0;
+}
 
+/** Initialize the FTRACE data input (from file). */
+int kshark_tep_init_input(struct kshark_data_stream *stream,
+			  const char *file)
+{
+	struct kshark_context *kshark_ctx = NULL;
+	struct kshark_data_stream *child_stream;
+	struct tepdata_handle *tep_handle;
+	int count;
+	int ret;
+	int sd;
+	int i;
+
+	if (!kshark_instance(&kshark_ctx) || !init_thread_seq())
+		return -EEXIST;
+
+	/*
+	 * Turn off function trace indent and turn on show parent
+	 * if possible.
+	 */
+	tep_plugin_add_option("ftrace:parent", "1");
+	tep_plugin_add_option("ftrace:indent", "0");
+
+	ret = kshark_tep_init_stream(kshark_ctx, stream, file, NULL, -1);
+	if (ret < 0)
+		return ret;
+	tep_handle = (struct tepdata_handle *)stream->interface.handle;
+	count = tracecmd_buffer_instances(tep_handle->input);
+	for (i = 0; i < count; i++) {
+		sd = kshark_add_stream(kshark_ctx);
+		if (sd < 0) {
+			ret = sd;
+			goto error;
+		}
+		child_stream = kshark_ctx->stream[sd];
+		if (!child_stream) {
+			ret = -ENOMEM;
+			goto error;
+		}
+		if (pthread_mutex_init(&child_stream->input_mutex, NULL) != 0) {
+			ret = -EAGAIN;
+			goto error;
+		}
+		child_stream->format = KS_TEP_DATA;
+		ret = kshark_tep_init_stream(kshark_ctx, child_stream, file, stream, i);
+		if (ret < 0)
+			goto error;
+		kshark_ctx->n_streams++;
+	}
 	return 0;
+
+error:
+		tracecmd_close(tep_handle->input);
+		free(tep_handle);
+		stream->interface.handle = NULL;
+		return ret;
+
 }
 
 /** Initialize using the locally available tracing events. */
-- 
2.26.2


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

* [PATCH 5/5] KernelShark: New libkshark API for loading all entries from given file
  2020-07-27  7:18 [PATCH 0/5] Add support for opening trace.dat files with multuiple buffers Tzvetomir Stoyanov (VMware)
                   ` (3 preceding siblings ...)
  2020-07-27  7:18 ` [PATCH 4/5] KernelShark: Load trace.dat file with ftrace sub-buffers Tzvetomir Stoyanov (VMware)
@ 2020-07-27  7:18 ` Tzvetomir Stoyanov (VMware)
  4 siblings, 0 replies; 9+ messages in thread
From: Tzvetomir Stoyanov (VMware) @ 2020-07-27  7:18 UTC (permalink / raw)
  To: rostedt; +Cc: linux-trace-devel

From: Tzvetomir (VMware)  Stoyanov <tz.stoyanov@gmail.com>

The existing API kshark_load_entries() loads data in a single stream. It
cannot be used in case there are more than one streams in the same file.
A new API is implemented:
	kshark_load_file_entries()
which loads and merges entries in all sessions, related to given
trace file.

Signed-off-by: Tzvetomir (VMware)  Stoyanov <tz.stoyanov@gmail.com>
---
 src/KsUtils.cpp |  4 ++--
 src/libkshark.c | 36 +++++++++++++++++++++++++++++++-----
 src/libkshark.h |  3 +++
 3 files changed, 36 insertions(+), 7 deletions(-)

diff --git a/src/KsUtils.cpp b/src/KsUtils.cpp
index bcb88b5..f3e93ad 100644
--- a/src/KsUtils.cpp
+++ b/src/KsUtils.cpp
@@ -501,7 +501,7 @@ int  KsDataStore::loadDataFile(const QString &file,
 		kshark_handle_dpi(stream, plugin, KSHARK_PLUGIN_INIT);
 	}
 
-	n = kshark_load_entries(kshark_ctx, sd, &_rows);
+	n = kshark_load_file_entries(kshark_ctx, &_rows, file.toStdString().c_str());
 	if (n < 0) {
 		kshark_close(kshark_ctx, sd);
 		return n;
@@ -541,7 +541,7 @@ int KsDataStore::appendDataFile(const QString &file, int64_t offset)
 	*(kshark_ctx->stream[sd]->calib_array) = offset;
 	kshark_ctx->stream[sd]->calib_array_size = 1;
 
-	nApnd = kshark_load_entries(kshark_ctx, sd, &apndRows);
+	nApnd = kshark_load_file_entries(kshark_ctx, &_rows, file.toStdString().c_str());
 	if (nApnd <= 0) {
 		QErrorMessage *em = new QErrorMessage();
 		em->showMessage(QString("File %1 contains no data.").arg(file));
diff --git a/src/libkshark.c b/src/libkshark.c
index 375874d..a5126fd 100644
--- a/src/libkshark.c
+++ b/src/libkshark.c
@@ -1331,7 +1331,7 @@ void kshark_set_clock_offset(struct kshark_context *kshark_ctx,
 }
 
 /**
- * @brief Load the content of the all opened data file into an array of
+ * @brief Load the content of data from given file into an array of
  *	  kshark_entries.
  *	  If one or more filters are set, the "visible" fields of each entry
  *	  is updated according to the criteria provided by the filters. The
@@ -1346,11 +1346,12 @@ void kshark_set_clock_offset(struct kshark_context *kshark_ctx,
  * @returns The size of the outputted data in the case of success, or a
  *	    negative error code on failure.
  */
-ssize_t kshark_load_all_entries(struct kshark_context *kshark_ctx,
-				struct kshark_entry ***data_rows)
+ssize_t kshark_load_file_entries(struct kshark_context *kshark_ctx,
+				 struct kshark_entry ***data_rows, const char *file)
 {
 	size_t data_size = 0;
 	int i, *stream_ids, sd;
+	struct kshark_data_stream *stream;
 
 	if (!kshark_ctx->n_streams)
 		return data_size;
@@ -1359,16 +1360,18 @@ ssize_t kshark_load_all_entries(struct kshark_context *kshark_ctx,
 	sd = stream_ids[0];
 
 	data_size = kshark_load_entries(kshark_ctx, sd, data_rows);
-
 	for (i = 1; i < kshark_ctx->n_streams; ++i) {
 		struct kshark_entry **stream_data_rows = NULL;
 		struct kshark_entry **merged_data_rows;
 		size_t stream_data_size;
 
 		sd = stream_ids[i];
+		stream = kshark_get_data_stream(kshark_ctx, sd);
+		if (!stream || (file && strcmp(stream->file, file)))
+			continue;
+
 		stream_data_size = kshark_load_entries(kshark_ctx, sd,
 						       &stream_data_rows);
-
 		merged_data_rows =
 			kshark_data_merge(*data_rows, data_size,
 					  stream_data_rows, stream_data_size);
@@ -1387,6 +1390,29 @@ ssize_t kshark_load_all_entries(struct kshark_context *kshark_ctx,
 	return data_size;
 }
 
+
+/**
+ * @brief Load the content of the all opened data file into an array of
+ *	  kshark_entries.
+ *	  If one or more filters are set, the "visible" fields of each entry
+ *	  is updated according to the criteria provided by the filters. The
+ *	  field "filter_mask" of the session's context is used to control the
+ *	  level of visibility/invisibility of the filtered entries.
+ *
+ * @param kshark_ctx: Input location for context pointer.
+ * @param data_rows: Output location for the trace data. The user is
+ *		     responsible for freeing the elements of the outputted
+ *		     array.
+ *
+ * @returns The size of the outputted data in the case of success, or a
+ *	    negative error code on failure.
+ */
+ssize_t kshark_load_all_entries(struct kshark_context *kshark_ctx,
+				struct kshark_entry ***data_rows)
+{
+	return kshark_load_file_entries(kshark_ctx, data_rows, NULL);
+}
+
 static inline void free_ptr(void *ptr)
 {
 	if (ptr)
diff --git a/src/libkshark.h b/src/libkshark.h
index 44bec79..a76ec92 100644
--- a/src/libkshark.h
+++ b/src/libkshark.h
@@ -751,6 +751,9 @@ void kshark_set_clock_offset(struct kshark_context *kshark_ctx,
 ssize_t kshark_load_all_entries(struct kshark_context *kshark_ctx,
 				struct kshark_entry ***data_rows);
 
+ssize_t kshark_load_file_entries(struct kshark_context *kshark_ctx,
+				 struct kshark_entry ***data_rows, const char *file);
+
 /**
  * Data collections are used to optimize the search for an entry having an
  * abstract property, defined by a Matching condition function and an array of
-- 
2.26.2


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

* Re: [PATCH 1/5] KernelShark: Add stream name
  2020-07-27  7:18 ` [PATCH 1/5] KernelShark: Add stream name Tzvetomir Stoyanov (VMware)
@ 2020-07-28 13:21   ` Steven Rostedt
  0 siblings, 0 replies; 9+ messages in thread
From: Steven Rostedt @ 2020-07-28 13:21 UTC (permalink / raw)
  To: Tzvetomir Stoyanov (VMware); +Cc: linux-trace-devel

On Mon, 27 Jul 2020 10:18:19 +0300
"Tzvetomir Stoyanov (VMware)" <tz.stoyanov@gmail.com> wrote:

> From: Tzvetomir (VMware)  Stoyanov <tz.stoyanov@gmail.com>
> 
> There are use cases when multiple streams can be loaded from a single
> file. Ftrace instances are such example. In these cases file name could
> not be used to identify the streams. A new member 'name' is added to the
> 'struct kshark_data_stream', used to identify the streams by the user.
> By default name is equal to the file name, in cases where there is onle

 s/onle/only/

> one stream in the file the behaviour is not changed. When there are
> multiple streams in a single file, the name is formed as
> "file name:stream name".

Reviewed-by: Steven Rostedt (VMware) <rostedt@godmis.org>

-- Steve

> 
> Signed-off-by: Tzvetomir (VMware)  Stoyanov <tz.stoyanov@gmail.com>
> ---
>  src/KsAdvFilteringDialog.cpp   | 2 +-
>  src/KsWidgetsLib.cpp           | 6 +++---
>  src/libkshark-plugin.c         | 2 +-
>  src/libkshark.c                | 2 ++
>  src/libkshark.h                | 3 +++
>  src/plugins/KVMCombo.cpp       | 4 ++--
>  src/plugins/event_field_plot.c | 2 +-
>  src/plugins/latency_plot.c     | 4 ++--
>  8 files changed, 15 insertions(+), 10 deletions(-)
> 
> diff --git a/src/KsAdvFilteringDialog.cpp b/src/KsAdvFilteringDialog.cpp
> index 64c4cec..6979903 100644
> --- a/src/KsAdvFilteringDialog.cpp
> +++ b/src/KsAdvFilteringDialog.cpp
> @@ -236,7 +236,7 @@ void KsAdvFilteringDialog::_getFtraceStreams(kshark_context *kshark_ctx)
>  	for (int i = 0; i < kshark_ctx->n_streams; ++i) {
>  		stream = kshark_ctx->stream[streamIds[i]];
>  		if (stream->format == KS_TEP_DATA)
> -			_streamComboBox.addItem(QString(stream->file),
> +			_streamComboBox.addItem(QString(stream->name),
>  						streamIds[i]);
>  	}
>  
> diff --git a/src/KsWidgetsLib.cpp b/src/KsWidgetsLib.cpp
> index e487eb8..f006a13 100644
> --- a/src/KsWidgetsLib.cpp
> +++ b/src/KsWidgetsLib.cpp
> @@ -325,7 +325,7 @@ void KsCheckBoxWidget::_setStream(uint8_t sd)
>  	if (!stream)
>  		return;
>  
> -	_streamName = QString(stream->file);
> +	_streamName = QString(stream->name);
>  
>  	KsUtils::setElidedText(&_stramLabel, _streamName,
>  			       Qt::ElideLeft, width());
> @@ -1148,7 +1148,7 @@ KsDStreamCheckBoxWidget::KsDStreamCheckBoxWidget(QWidget *parent)
>  
>  	for (int i = 0; i < nStreams; ++i) {
>  		stream = kshark_ctx->stream[streamIds[i]];
> -		QString name(stream->file);
> +		QString name(stream->name);
>  		if (name < 40) {
>  			nameItem = new QTableWidgetItem(name);
>  		} else {
> @@ -1235,7 +1235,7 @@ void KsEventFieldSelectWidget::setStreamCombo()
>  		sd = streamIds[i];
>  		stream = kshark_ctx->stream[sd];
>  		if (_streamComboBox.findData(sd) < 0)
> -			_streamComboBox.addItem(QString(stream->file), sd);
> +			_streamComboBox.addItem(QString(stream->name), sd);
>  	}
>  	free(streamIds);
>  }
> diff --git a/src/libkshark-plugin.c b/src/libkshark-plugin.c
> index d341fea..583ea42 100644
> --- a/src/libkshark-plugin.c
> +++ b/src/libkshark-plugin.c
> @@ -584,7 +584,7 @@ static void plugin_init(struct kshark_data_stream *stream,
>  		fprintf(stderr,
>  			"plugin \"%s\" failed to initialize on stream %s\n",
>  			plugin->interface->name,
> -			stream->file);
> +			stream->name);
>  
>  		plugin->status |= KSHARK_PLUGIN_FAILED;
>  		plugin->status &= ~KSHARK_PLUGIN_LOADED;
> diff --git a/src/libkshark.c b/src/libkshark.c
> index 7013d66..375874d 100644
> --- a/src/libkshark.c
> +++ b/src/libkshark.c
> @@ -137,6 +137,7 @@ static void kshark_stream_free(struct kshark_data_stream *stream)
>  
>  	free(stream->calib_array);
>  	free(stream->file);
> +	free(stream->name);
>  	free(stream);
>  }
>  
> @@ -255,6 +256,7 @@ int kshark_stream_open(struct kshark_data_stream *stream, const char *file)
>  		return -EAGAIN;
>  
>  	stream->file = strdup(file);
> +	stream->name = strdup(file);
>  	set_format(kshark_ctx, stream, file);
>  
>  	switch (stream->format) {
> diff --git a/src/libkshark.h b/src/libkshark.h
> index 0b9053d..44bec79 100644
> --- a/src/libkshark.h
> +++ b/src/libkshark.h
> @@ -238,6 +238,9 @@ struct kshark_data_stream {
>  	/** Trace data file pathname. */
>  	char			*file;
>  
> +	/** Stream name. */
> +	char			*name;
> +
>  	/** System clock calibration function. */
>  	time_calib_func		calib;
>  
> diff --git a/src/plugins/KVMCombo.cpp b/src/plugins/KVMCombo.cpp
> index 9b9d7a0..ceb1f47 100644
> --- a/src/plugins/KVMCombo.cpp
> +++ b/src/plugins/KVMCombo.cpp
> @@ -250,7 +250,7 @@ void KsComboPlotDialog::update()
>  		_guestMapCount = ret;
>  
>  	KsUtils::setElidedText(&_hostFileLabel,
> -			       kshark_ctx->stream[_guestMap[0].host_id]->file,
> +			       kshark_ctx->stream[_guestMap[0].host_id]->name,
>  			       Qt::ElideLeft, LABEL_WIDTH);
>  
>  	_guestStreamComboBox.clear();
> @@ -260,7 +260,7 @@ void KsComboPlotDialog::update()
>  		if (sd >= kshark_ctx->n_streams)
>  			continue;
>  
> -		_guestStreamComboBox.addItem(kshark_ctx->stream[sd]->file, sd);
> +		_guestStreamComboBox.addItem(kshark_ctx->stream[sd]->name, sd);
>  		color << colTable[sd];
>  		_guestStreamComboBox.setItemData(i, QBrush(color),
>  						    Qt::BackgroundRole);
> diff --git a/src/plugins/event_field_plot.c b/src/plugins/event_field_plot.c
> index fcc2a19..3c61cbf 100644
> --- a/src/plugins/event_field_plot.c
> +++ b/src/plugins/event_field_plot.c
> @@ -72,7 +72,7 @@ plugin_efp_init_context(struct kshark_data_stream *stream)
>  
>  	if (plugin_ctx->event_id < 0) {
>  		fprintf(stderr, "Event %s not found in stream %s\n",
> -			plugin_ctx->event_name, stream->file);
> +			plugin_ctx->event_name, stream->name);
>  		goto fail;
>  	}
>  
> diff --git a/src/plugins/latency_plot.c b/src/plugins/latency_plot.c
> index bcd27f6..e2238e4 100644
> --- a/src/plugins/latency_plot.c
> +++ b/src/plugins/latency_plot.c
> @@ -75,7 +75,7 @@ plugin_latency_init_context(struct kshark_data_stream *stream)
>  		stream->interface.find_event_id(stream, plugin_ctx->event_name[0]);
>  	if (plugin_ctx->event_id[0] < 0) {
>  		fprintf(stderr, "Event %s not found in stream %s\n",
> -			plugin_ctx->event_name[0], stream->file);
> +			plugin_ctx->event_name[0], stream->name);
>  		goto fail;
>  	}
>  
> @@ -83,7 +83,7 @@ plugin_latency_init_context(struct kshark_data_stream *stream)
>  		stream->interface.find_event_id(stream, plugin_ctx->event_name[1]);
>  	if (plugin_ctx->event_id[1] < 0) {
>  		fprintf(stderr, "Event %s not found in stream %s\n",
> -			plugin_ctx->event_name[1], stream->file);
> +			plugin_ctx->event_name[1], stream->name);
>  		goto fail;
>  	}
>  


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

* Re: [PATCH 2/5] KernelShark: Fix compilation issues on  Fedora 32
  2020-07-27  7:18 ` [PATCH 2/5] KernelShark: Fix compilation issues on Fedora 32 Tzvetomir Stoyanov (VMware)
@ 2020-07-28 13:23   ` Steven Rostedt
  0 siblings, 0 replies; 9+ messages in thread
From: Steven Rostedt @ 2020-07-28 13:23 UTC (permalink / raw)
  To: Tzvetomir Stoyanov (VMware); +Cc: linux-trace-devel

On Mon, 27 Jul 2020 10:18:20 +0300
"Tzvetomir Stoyanov (VMware)" <tz.stoyanov@gmail.com> wrote:

> From: Tzvetomir (VMware)  Stoyanov <tz.stoyanov@gmail.com>
> 
> Included <string.h> to fix this compilation error:

s/<string.h>/<string>

>    "error: ‘string’ in namespace ‘std’ does not name a type"
> Converted fontHeight and stringWidth to inline to fix these
> compilation errors:
>    "multiple definition of `fontHeight';"
>    "multiple definition of `stringWidth';"
> 

Reviewed-by: Steven Rostedt (VMware) <rostedt@goodmis.org>

-- Steve

> Signed-off-by: Tzvetomir (VMware)  Stoyanov <tz.stoyanov@gmail.com>
> ---
>  src/KsPlotTools.cpp | 1 +
>  src/KsPlotTools.hpp | 1 +
>  src/KsUtils.hpp     | 4 ++--
>  3 files changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/src/KsPlotTools.cpp b/src/KsPlotTools.cpp
> index 17db451..7dcd4f2 100644
> --- a/src/KsPlotTools.cpp
> +++ b/src/KsPlotTools.cpp
> @@ -12,6 +12,7 @@
>  // C
>  #include <math.h>
>  #include <cstring>
> +#include <string>
>  
>  // C++
>  #include <algorithm>
> diff --git a/src/KsPlotTools.hpp b/src/KsPlotTools.hpp
> index 75fb4da..c66fea3 100644
> --- a/src/KsPlotTools.hpp
> +++ b/src/KsPlotTools.hpp
> @@ -14,6 +14,7 @@
>  
>  // C
>  #include <math.h>
> +#include <string>
>  
>  // C++
>  #include <limits>
> diff --git a/src/KsUtils.hpp b/src/KsUtils.hpp
> index cfb45f4..5857099 100644
> --- a/src/KsUtils.hpp
> +++ b/src/KsUtils.hpp
> @@ -36,7 +36,7 @@
>  
>  //! @cond Doxygen_Suppress
>  
> -auto fontHeight = []()
> +inline auto fontHeight = []()
>  {
>  	QFont font;
>  	QFontMetrics fm(font);
> @@ -44,7 +44,7 @@ auto fontHeight = []()
>  	return fm.height();
>  };
>  
> -auto stringWidth = [](QString s)
> +inline auto stringWidth = [](QString s)
>  {
>  	QFont font;
>  	QFontMetrics fm(font);


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

* Re: [PATCH 3/5] KernelShark: Fix combo plot plugin crash in case of multiple streams
  2020-07-27  7:18 ` [PATCH 3/5] KernelShark: Fix combo plot plugin crash in case of multiple streams Tzvetomir Stoyanov (VMware)
@ 2020-07-28 13:26   ` Steven Rostedt
  0 siblings, 0 replies; 9+ messages in thread
From: Steven Rostedt @ 2020-07-28 13:26 UTC (permalink / raw)
  To: Tzvetomir Stoyanov (VMware); +Cc: linux-trace-devel

On Mon, 27 Jul 2020 10:18:21 +0300
"Tzvetomir Stoyanov (VMware)" <tz.stoyanov@gmail.com> wrote:

> From: Tzvetomir (VMware)  Stoyanov <tz.stoyanov@gmail.com>
> 
> Added a check if there is a host-guest mapping in the loaded
> multiple streams. If there is no such mapping, print an error and
> exit the KsComboPlotDialog::update() function.
> 
> Signed-off-by: Tzvetomir (VMware)  Stoyanov <tz.stoyanov@gmail.com>
> ---
>  src/plugins/KVMCombo.cpp | 7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)
> 
> diff --git a/src/plugins/KVMCombo.cpp b/src/plugins/KVMCombo.cpp
> index ceb1f47..3ec36b6 100644
> --- a/src/plugins/KVMCombo.cpp
> +++ b/src/plugins/KVMCombo.cpp
> @@ -246,7 +246,12 @@ void KsComboPlotDialog::update()
>  	_guestMap = nullptr;
>  	_guestMapCount = 0;
>  	ret = kshark_tracecmd_get_hostguest_mapping(&_guestMap);
> -	if (ret > 0)
> +	if (ret <= 0) {
> +		QString err("Cannot find host / guest tracing into the loaded streams");
> +		QMessageBox msgBox;
> +		msgBox.critical(nullptr, "Error", err);
> +		return;
> +	} else
>  		_guestMapCount = ret;
>

Just a nit, but if we are following Linux coding styles, the above
should be:

	if (ret <= 0) {
		[..]
	} else {
		_guestMapCount = ret;
	}

As it is looked down upon to have part of an if block have brackets and
another part without. But I'll leave that up to Yordan to decide ;-)

Reviewed-by: Steven Rostedt (VMware) <rostedt@goodmis.org>


-- Steve
 
>  	KsUtils::setElidedText(&_hostFileLabel,


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

end of thread, back to index

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-27  7:18 [PATCH 0/5] Add support for opening trace.dat files with multuiple buffers Tzvetomir Stoyanov (VMware)
2020-07-27  7:18 ` [PATCH 1/5] KernelShark: Add stream name Tzvetomir Stoyanov (VMware)
2020-07-28 13:21   ` Steven Rostedt
2020-07-27  7:18 ` [PATCH 2/5] KernelShark: Fix compilation issues on Fedora 32 Tzvetomir Stoyanov (VMware)
2020-07-28 13:23   ` Steven Rostedt
2020-07-27  7:18 ` [PATCH 3/5] KernelShark: Fix combo plot plugin crash in case of multiple streams Tzvetomir Stoyanov (VMware)
2020-07-28 13:26   ` Steven Rostedt
2020-07-27  7:18 ` [PATCH 4/5] KernelShark: Load trace.dat file with ftrace sub-buffers Tzvetomir Stoyanov (VMware)
2020-07-27  7:18 ` [PATCH 5/5] KernelShark: New libkshark API for loading all entries from given file 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