All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 1/3] KernelShark: Add xenomai_cobalt_switch_events plugin for KernelShark
@ 2022-03-02  2:57 Hongzhan Chen
  2022-03-02  2:57 ` [PATCH v2 2/3] Add --with-kernelshark option Hongzhan Chen
                   ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Hongzhan Chen @ 2022-03-02  2:57 UTC (permalink / raw)
  To: xenomai, jan.kiszka

For Xenomai-cobalt enabled system, cobalt_switch_context means
that there is schedule and context switch in companion core(realtime
core), which we may need to do special treatment and take correct
action as main kernel sched_switch to visualize out-of-band state
of realtime tasks running in cobalt core. To achive our target,
we implement following:

  1. store corresponding cobalt_switch_context events into
     container data.
  2. modify pid stored in entry to be equal to next_pid to
     show correct color in cpu bar when cobalt_switch_context
     event happen.
  3. show blue hollow box to mark out-of-band state according to
     cobalt_switch_context events.
  4. clickable cobalt_switch_context plugin shapes.

Signed-off-by: Hongzhan Chen <hongzhan.chen@intel.com>
---
 tracing/Makefile.am                           |   6 +
 tracing/kernelshark/CobaltSwitchEvents.cpp    | 156 ++++++++++++++++
 tracing/kernelshark/Makefile.am               |  18 ++
 tracing/kernelshark/README                    |  75 ++++++++
 .../xenomai_cobalt_switch_events.c            | 174 ++++++++++++++++++
 .../xenomai_cobalt_switch_events.h            |  58 ++++++
 6 files changed, 487 insertions(+)
 create mode 100644 tracing/Makefile.am
 create mode 100644 tracing/kernelshark/CobaltSwitchEvents.cpp
 create mode 100644 tracing/kernelshark/Makefile.am
 create mode 100644 tracing/kernelshark/README
 create mode 100644 tracing/kernelshark/xenomai_cobalt_switch_events.c
 create mode 100644 tracing/kernelshark/xenomai_cobalt_switch_events.h

diff --git a/tracing/Makefile.am b/tracing/Makefile.am
new file mode 100644
index 000000000..8bdf1f906
--- /dev/null
+++ b/tracing/Makefile.am
@@ -0,0 +1,6 @@
+
+SUBDIRS =		\
+	kernelshark
+
+DIST_SUBDIRS = 		\
+	kernelshark
diff --git a/tracing/kernelshark/CobaltSwitchEvents.cpp b/tracing/kernelshark/CobaltSwitchEvents.cpp
new file mode 100644
index 000000000..3a521bdfc
--- /dev/null
+++ b/tracing/kernelshark/CobaltSwitchEvents.cpp
@@ -0,0 +1,156 @@
+// SPDX-License-Identifier: LGPL-2.1
+
+/*
+ * Copyright (C) 2021 Intel Inc, Hongzhan Chen <hongzhan.chen@intel.com>
+ */
+
+/**
+ *  @file    CobaltSwitchEvents.cpp
+ *  @brief   Defines a callback function for Xenomai Cobalt context switch
+ *           events used to plot in cobalt blue the out-of-band state of
+ *           the task
+ */
+
+// KernelShark
+#include "libkshark.h"
+#include "libkshark-plugin.h"
+#include "xenomai_cobalt_switch_events.h"
+#include "KsPlotTools.hpp"
+#include "KsPlugins.hpp"
+#include "KsPluginsGUI.hpp"
+
+static void *ks4xenomai_ptr;
+
+/**
+ * @brief Provide the plugin with a pointer to the KsMainWindow object (the GUI
+ * itself) such that the plugin can manipulate the GUI.
+ */
+__hidden void *plugin_set_gui_ptr(void *gui_ptr)
+{
+	ks4xenomai_ptr = gui_ptr;
+	return nullptr;
+}
+
+/**
+ * This class represents the graphical element visualizing OOB state between
+ *  two cobalt_switch_context events.
+ */
+class XenomaiSwitchBox : public LatencyBox
+{
+	/** On double click do. */
+	void _doubleClick() const override
+	{
+		markEntryB(ks4xenomai_ptr, _data[1]->entry);
+		markEntryA(ks4xenomai_ptr, _data[0]->entry);
+	}
+};
+
+/*
+ * Ideally, the cobalt_switch_context has to be the last trace event recorded before
+ * the task is preempted. Because of this, when the data is loaded (the first pass),
+ * the "pid" field of the cobalt_switch_context entries gets edited by this plugin
+ * to be equal to the "next pid" of the cobalt_switch_context event. However, in
+ * reality the cobalt_switch_context event may be followed by some trailing events
+ * from the same task (printk events for example). This has the effect of extending
+ * the graph of the task outside of the actual duration of the task. The "second
+ * pass" over the data is used to fix this problem. It takes advantage of the
+ * "next" field of the entry (this field is set during the first pass) to search
+ * for trailing events after the "cobalt_switch_context". In addition, when
+ * we find that it try to switch in-band because next-pid is zero, we prefer to
+ * skip this event because it try to leave oob not enterring.
+ */
+static void secondPass(plugin_cobalt_context *plugin_ctx)
+{
+	kshark_data_container *cSS;
+	kshark_entry *e;
+	int pid_rec, switch_inband;
+
+	cSS = plugin_ctx->cs_data;
+	for (ssize_t i = 0; i < cSS->size; ++i) {
+		switch_inband = plugin_cobalt_check_switch_inband(
+				cSS->data[i]->field);
+
+		/* we skip cobalt_switch_context that try to
+		 * switch into in-band state because we just handle
+		 * out-of-band
+		 */
+		if (switch_inband)
+			continue;
+		pid_rec = plugin_sched_get_pid(cSS->data[i]->field);
+		e = cSS->data[i]->entry;
+		if (!e->next || e->pid == 0 ||
+		    e->event_id == e->next->event_id ||
+		    pid_rec != e->next->pid)
+			continue;
+
+		e = e->next;
+		/* Find all trailing events. */
+		for (; e->next; e = e->next) {
+			if (e->pid == plugin_sched_get_pid(
+						cSS->data[i]->field)) {
+				/*
+				 * Change the "pid" to be equal to the "next
+				 * pid" of the cobalt_switch_context event
+				 * and leave a sign that you edited this
+				 * entry.
+				 */
+				e->pid = cSS->data[i]->entry->pid;
+				e->visible &= ~KS_PLUGIN_UNTOUCHED_MASK;
+
+				/*  This is the last trailing event, we finish
+				 *  this round.
+				 */
+				if (e->next->pid != plugin_sched_get_pid(
+						cSS->data[i]->field))
+					break;
+			}
+		}
+	}
+}
+
+/**
+ * @brief Plugin's draw function.
+ *
+ * @param argv_c: A C pointer to be converted to KsCppArgV (C++ struct).
+ * @param sd: Data stream identifier.
+ * @param pid: Process Id.
+ * @param draw_action: Draw action identifier.
+ */
+__hidden void plugin_cobalt_draw(kshark_cpp_argv *argv_c,
+			  int sd, int pid, int draw_action)
+{
+	plugin_cobalt_context *plugin_ctx;
+
+	if (!(draw_action & KSHARK_TASK_DRAW) || pid == 0)
+		return;
+
+	plugin_ctx = __get_context(sd);
+	if (!plugin_ctx)
+		return;
+
+	KsCppArgV *argvCpp = KS_ARGV_TO_CPP(argv_c);
+
+	if (!plugin_ctx->second_pass_done) {
+		/* The second pass is not done yet. */
+		secondPass(plugin_ctx);
+		plugin_ctx->second_pass_done = true;
+	}
+
+	IsApplicableFunc checkFieldCS = [=] (kshark_data_container *d,
+					     ssize_t i) {
+		return !(plugin_cobalt_check_switch_inband(d->data[i]->field)) &&
+			d->data[i]->entry->pid == pid;
+	};
+
+	IsApplicableFunc checkEntryPid = [=] (kshark_data_container *d,
+					      ssize_t i) {
+		return plugin_sched_get_pid(d->data[i]->field) == pid;
+	};
+
+	eventFieldIntervalPlot(argvCpp,
+			       plugin_ctx->cs_data, checkFieldCS,
+			       plugin_ctx->cs_data, checkEntryPid,
+			       makeLatencyBox<XenomaiSwitchBox>,
+			       {0, 71, 171}, // Cobalt Blue
+			       -1);         // Default size
+}
diff --git a/tracing/kernelshark/Makefile.am b/tracing/kernelshark/Makefile.am
new file mode 100644
index 000000000..17c4ff217
--- /dev/null
+++ b/tracing/kernelshark/Makefile.am
@@ -0,0 +1,18 @@
+
+lib_LTLIBRARIES = libplugin_xenomai_cobalt_switch_events.la
+
+KS_INCLUDS         ?= /usr/local/include/kernelshark
+TRACECMD_INCLUDS   ?= /usr/local/include/trace-cmd
+TRACEFS_INCLUDS    ?= /usr/local/include/tracefs
+TRACEEVENR_INCLUDS ?= /usr/local/include/traceevent
+
+libplugin_xenomai_cobalt_switch_events_la_SOURCES =	\
+	CobaltSwitchEvents.cpp			\
+	xenomai_cobalt_switch_events.c		\
+	xenomai_cobalt_switch_events.h
+
+libplugin_xenomai_cobalt_switch_events_la_CPPFLAGS =	\
+	-I$(KS_INCLUDS)					\
+	-I$(TRACECMD_INCLUDS)				\
+	-I$(TRACEFS_INCLUDS)				\
+	-I$(TRACEEVENR_INCLUDS)
diff --git a/tracing/kernelshark/README b/tracing/kernelshark/README
new file mode 100644
index 000000000..4ed28dd0a
--- /dev/null
+++ b/tracing/kernelshark/README
@@ -0,0 +1,75 @@
+
+What is it?
+=============
+
+  It is Xenomai plugin for KernelShark to visualize out-of-band state
+  of realtime thread running in companion core with making use of
+  cobalt_switch_context events in trace log.
+
+  For more introductions about KernelShark , please refer to [1].
+
+How to build?
+================================
+
+Preparation:
+
+  - compile and install third party softwares that KernelShark depends on:
+      please refer to "Third Party Software" in [2].
+
+  - GIT clone:
+      git clone https://git.kernel.org/pub/scm/utils/trace-cmd/kernel-shark.git
+
+  - build kernel-shark and install both the GUI and libkshark-devel:
+
+      cd kernel-shark/build
+      cmake ../
+      make
+      sudo make install
+
+     Note:
+       Building standlone xenomai plugin based on kernel-shark
+       depends on following patchset after kernelshark-v2.1.0:
+         kernel-shark: Install missing headers (commit 5419186f4bbad68aa16849882a8f12fa9adb22c5)
+         kernel-shark: Add KsPluginsGUI.hpp/.cpp (commit 59b5763c7c52b703e3b8e05be801f7c85365c9d3)
+         kernel-shark: Load 'ctrl' interface for user plugins (commit e35970770b71f0cc849870512a806dff96bf19e1)
+
+How to use the plugin with KernelShark?
+====================================
+
+    kernelshark -p your_path_of_libplugin_xenomai_cobalt_switch_events.so your_path_of_trace.dat
+
+What the difference is after Xenomai plug works?
+===============================================
+
+  1. For those trace log which does not include cobalt_switch_context event, you may
+     not expect that there is any difference after Xenomai plugin is loaded.
+
+  2. But when there is cobalt_switch_context event in trace log, the plugin would
+     try to analysis cobalt_switch_context event and visualize the OOB state
+     with cobalt blue hollow box in the corresponding task bar.
+
+How to check OOB state with cobalt blue hollow box?
+==================================================
+
+  1. Please check if there is cobalt_switch_context events existing in the log using
+     search boxes in the list area of kernelshark GUI.
+
+  2. When there is cobalt_switch_context events existing in the log, please goto
+     task plots dialog to choose tasks that you may want to check its OOB state by
+     clicking menu Plots->Tasks and then hit "Apply".
+
+  3. Selected tasks would be added to the bottom of the graph area as task plots.
+     You may zoom in to check if there is cobalt blue hollow box showing in
+     the corresponding task bar/plot if the time span is really large and
+     there is too much events.
+
+  4. When you double click the hollow box, there is two vertical lines
+     that marked as "Mark A" and "Mark B" which you may use to measure time of
+     running in OOB state between two cobalt_switch_context events.
+
+  Note:
+    Please refer to [1] about introduction of search boxes or task plot or  "Mark A" &
+    "Mark B" on Graph Control Area for more detailed info.
+
+[1]: https://kernelshark.org/Documentation.html
+[2]: https://git.kernel.org/pub/scm/utils/trace-cmd/kernel-shark.git/tree/README
diff --git a/tracing/kernelshark/xenomai_cobalt_switch_events.c b/tracing/kernelshark/xenomai_cobalt_switch_events.c
new file mode 100644
index 000000000..758966df7
--- /dev/null
+++ b/tracing/kernelshark/xenomai_cobalt_switch_events.c
@@ -0,0 +1,174 @@
+// SPDX-License-Identifier: LGPL-2.1
+
+/*
+ * Copyright (C) 2021 Intel Inc, Hongzhan Chen <hongzhan.chen@intel.com>
+ */
+
+/**
+ *  @file    xenomai_cobalt_switch_events.c
+ *  @brief   handle xenomai cobalt switch context event
+ */
+
+// C
+#include <stdlib.h>
+#include <stdio.h>
+
+// trace-cmd
+#include <trace-cmd.h>
+
+// KernelShark
+#include "xenomai_cobalt_switch_events.h"
+#include "libkshark-tepdata.h"
+
+/** Plugin context instance. */
+
+//! @cond Doxygen_Suppress
+
+#define SWITCH_INBAND_SHIFT	PREV_STATE_SHIFT
+
+#define SWITCH_INBAND_MASK	PREV_STATE_MASK
+
+//! @endcond
+
+static void cobalt_free_context(struct plugin_cobalt_context *plugin_ctx)
+{
+	if (!plugin_ctx)
+		return;
+
+	kshark_free_data_container(plugin_ctx->cs_data);
+}
+
+/* Use the most significant byte to store state marking switch in-band. */
+static void plugin_cobalt_set_switch_inband_state(ks_num_field_t *field,
+					ks_num_field_t inband_state)
+{
+	unsigned long long mask = SWITCH_INBAND_MASK << SWITCH_INBAND_SHIFT;
+	*field &= ~mask;
+	*field |= (inband_state & SWITCH_INBAND_MASK) << SWITCH_INBAND_SHIFT;
+}
+
+/**
+ * @brief Retrieve the state of switch-in-band from the data field stored in
+ *        the kshark_data_container object.
+ *
+ * @param field: Input location for the data field.
+ */
+__hidden int plugin_cobalt_check_switch_inband(ks_num_field_t field)
+{
+	unsigned long long mask = SWITCH_INBAND_MASK << SWITCH_INBAND_SHIFT;
+
+	return (field & mask) >> SWITCH_INBAND_SHIFT;
+}
+
+/** A general purpose macro is used to define plugin context. */
+KS_DEFINE_PLUGIN_CONTEXT(struct plugin_cobalt_context, cobalt_free_context);
+
+static bool plugin_cobalt_init_context(struct kshark_data_stream *stream,
+				      struct plugin_cobalt_context *plugin_ctx)
+{
+	struct tep_event *event;
+
+	if (!kshark_is_tep(stream))
+		return false;
+
+	plugin_ctx->tep = kshark_get_tep(stream);
+
+	event = tep_find_event_by_name(plugin_ctx->tep,
+					"cobalt_core", "cobalt_switch_context");
+	if (!event)
+		return false;
+
+	plugin_ctx->cobalt_switch_event = event;
+	plugin_ctx->cobalt_switch_next_field =
+		tep_find_any_field(event, "next_pid");
+
+	plugin_ctx->second_pass_done = false;
+
+	plugin_ctx->cs_data = kshark_init_data_container();
+	if (!plugin_ctx->cs_data)
+		return false;
+
+	return true;
+}
+
+static void plugin_cobalt_switch_action(struct kshark_data_stream *stream,
+				      void *rec, struct kshark_entry *entry)
+{
+	struct tep_record *record = (struct tep_record *) rec;
+	struct plugin_cobalt_context *plugin_ctx;
+	unsigned long long next_pid;
+	ks_num_field_t ks_field = 0;
+	int ret;
+
+	plugin_ctx = __get_context(stream->stream_id);
+	if (!plugin_ctx)
+		return;
+
+	ret = tep_read_number_field(plugin_ctx->cobalt_switch_next_field,
+				    record->data, &next_pid);
+
+	if (ret == 0 && next_pid >= 0) {
+		plugin_sched_set_pid(&ks_field, entry->pid);
+		if (next_pid == 0) {
+			plugin_cobalt_set_switch_inband_state(&ks_field,
+					SWITCH_INBAND_STATE);
+		}
+
+		kshark_data_container_append(plugin_ctx->cs_data,
+				entry, ks_field);
+
+		if (next_pid > 0)
+			entry->pid = next_pid;
+	}
+}
+
+/** Load this plugin. */
+int KSHARK_PLOT_PLUGIN_INITIALIZER(struct kshark_data_stream *stream)
+{
+	struct plugin_cobalt_context *plugin_ctx;
+
+	plugin_ctx = __init(stream->stream_id);
+	if (!plugin_ctx || !plugin_cobalt_init_context(stream, plugin_ctx)) {
+		__close(stream->stream_id);
+		return 0;
+	}
+
+	if (plugin_ctx->cobalt_switch_event) {
+		kshark_register_event_handler(stream,
+						plugin_ctx->cobalt_switch_event->id,
+						plugin_cobalt_switch_action);
+	}
+
+	kshark_register_draw_handler(stream, plugin_cobalt_draw);
+
+	return 1;
+}
+
+/** Unload this plugin. */
+int KSHARK_PLOT_PLUGIN_DEINITIALIZER(struct kshark_data_stream *stream)
+{
+	struct plugin_cobalt_context *plugin_ctx = __get_context(stream->stream_id);
+	int ret = 0;
+
+	if (plugin_ctx) {
+		if (plugin_ctx->cobalt_switch_event) {
+			kshark_unregister_event_handler(stream,
+							plugin_ctx->cobalt_switch_event->id,
+							plugin_cobalt_switch_action);
+		}
+
+		kshark_unregister_draw_handler(stream, plugin_cobalt_draw);
+
+		ret = 1;
+	}
+
+	__close(stream->stream_id);
+
+	return ret;
+}
+
+/** Initialize the control interface of the plugin. */
+void *KSHARK_MENU_PLUGIN_INITIALIZER(void *gui_ptr)
+{
+	return plugin_set_gui_ptr(gui_ptr);
+}
diff --git a/tracing/kernelshark/xenomai_cobalt_switch_events.h b/tracing/kernelshark/xenomai_cobalt_switch_events.h
new file mode 100644
index 000000000..f7f4593ff
--- /dev/null
+++ b/tracing/kernelshark/xenomai_cobalt_switch_events.h
@@ -0,0 +1,58 @@
+/* SPDX-License-Identifier: LGPL-2.1 */
+
+/*
+ * Copyright (C) 2021 Intel Inc, Hongzhan Chen<hongzhan.chen@intel.com>
+ */
+
+/**
+ *  @file    xenomai_cobalt_switch_events.h
+ *  @brief   Plugin for xenomai cobalt switch context event
+ */
+
+#ifndef _KS_PLUGIN_COBALT_SWITCH_H
+#define _KS_PLUGIN_COBALT_SWITCH_H
+
+// KernelShark
+#include "libkshark.h"
+#include "plugins/common_sched.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** cobalt_switch_context is trying to switch in-band. */
+#define SWITCH_INBAND_STATE	1
+
+/** Structure representing a plugin-specific context. */
+struct plugin_cobalt_context {
+	/** Page event used to parse the page. */
+	struct tep_handle	*tep;
+
+	/** Pointer to the cobalt_switch_event object. */
+	struct tep_event	*cobalt_switch_event;
+
+	 /** Pointer to the cobalt_switch_next_field format descriptor. */
+	struct tep_format_field *cobalt_switch_next_field;
+
+	/** True if the second pass is already done. */
+	bool	second_pass_done;
+
+	/** Data container for cobalt_switch_context data. */
+	struct kshark_data_container	*cs_data;
+
+};
+
+KS_DECLARE_PLUGIN_CONTEXT_METHODS(struct plugin_cobalt_context)
+
+int plugin_cobalt_check_switch_inband(ks_num_field_t field);
+
+void plugin_cobalt_draw(struct kshark_cpp_argv *argv, int sd, int pid,
+		 int draw_action);
+
+void *plugin_set_gui_ptr(void *gui_ptr);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
-- 
2.17.1



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

* [PATCH v2 2/3] Add --with-kernelshark option
  2022-03-02  2:57 [PATCH v2 1/3] KernelShark: Add xenomai_cobalt_switch_events plugin for KernelShark Hongzhan Chen
@ 2022-03-02  2:57 ` Hongzhan Chen
  2022-03-03  6:25   ` Jan Kiszka
  2022-03-02  2:57 ` [PATCH v2 3/3] libtraceevent: Add xenomai_schedparams plugin for libtraceevent Hongzhan Chen
  2022-03-03  6:38 ` [PATCH v2 1/3] KernelShark: Add xenomai_cobalt_switch_events plugin for KernelShark Jan Kiszka
  2 siblings, 1 reply; 11+ messages in thread
From: Hongzhan Chen @ 2022-03-02  2:57 UTC (permalink / raw)
  To: xenomai, jan.kiszka

option to build kernelshark plugin

Signed-off-by: Hongzhan Chen <hongzhan.chen@intel.com>
---
 Makefile.am         |  4 ++++
 configure.ac        | 16 ++++++++++++++++
 tracing/Makefile.am |  3 ++-
 3 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/Makefile.am b/Makefile.am
index 604644277..bd3e4bfb1 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -18,6 +18,9 @@ SUBDIRS += 		\
 	testsuite
 endif
 
+SUBDIRS +=		\
+	tracing
+
 EXTRA_DIST = kernel debian
 
 DIST_SUBDIRS =		\
@@ -26,6 +29,7 @@ DIST_SUBDIRS =		\
 	doc		\
 	include		\
 	lib 		\
+	tracing		\
 	scripts		\
 	testsuite	\
 	utils
diff --git a/configure.ac b/configure.ac
index 16cffd8f8..b8e9ca143 100644
--- a/configure.ac
+++ b/configure.ac
@@ -826,6 +826,20 @@ AC_ARG_WITH(demodir,
     ], [XENO_DEMO_DIR=$demodir])
 AC_MSG_RESULT($XENO_DEMO_DIR)
 
+xeno_build_kernelshark=false
+AC_MSG_CHECKING(build kernelshark plugins)
+AC_ARG_WITH(kernelshark,
+    AS_HELP_STRING([--with-kernelshark],[build kernelshark related plugins]),
+    [
+	case "$withval" in
+	"" | y | ye | yes) xeno_build_kernelshark=true;;
+	n | no) xeno_build_kernelshark=false;;
+	esac
+    ], [xeno_build_kernelshark=false])
+AC_MSG_RESULT($xeno_build_kernelshark)
+
+AM_CONDITIONAL([BUILD_KERNELSHARK], [test x$xeno_build_kernelshark = xtrue])
+
 AC_MSG_CHECKING([for test source generation])
 AC_RUN_IFELSE([AC_LANG_PROGRAM([[ ]], [[ ]])],
     [AC_MSG_RESULT(ok)], [AC_MSG_RESULT(failed)], [AC_MSG_RESULT(untestable)])
@@ -943,6 +957,8 @@ AC_CONFIG_FILES([ \
 	scripts/Makefile \
 	scripts/xeno-config:scripts/xeno-config-$rtcore_type.in \
 	scripts/xeno \
+	tracing/Makefile \
+	tracing/kernelshark/Makefile \
 	lib/Makefile \
 	lib/boilerplate/Makefile \
 	lib/boilerplate/init/Makefile \
diff --git a/tracing/Makefile.am b/tracing/Makefile.am
index 8bdf1f906..7925ae9c6 100644
--- a/tracing/Makefile.am
+++ b/tracing/Makefile.am
@@ -1,6 +1,7 @@
-
+if BUILD_KERNELSHARK
 SUBDIRS =		\
 	kernelshark
+endif
 
 DIST_SUBDIRS = 		\
 	kernelshark
-- 
2.17.1



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

* [PATCH v2 3/3] libtraceevent: Add xenomai_schedparams plugin for libtraceevent
  2022-03-02  2:57 [PATCH v2 1/3] KernelShark: Add xenomai_cobalt_switch_events plugin for KernelShark Hongzhan Chen
  2022-03-02  2:57 ` [PATCH v2 2/3] Add --with-kernelshark option Hongzhan Chen
@ 2022-03-02  2:57 ` Hongzhan Chen
  2022-03-02  8:58   ` Bezdeka, Florian
  2022-03-03  6:38 ` [PATCH v2 1/3] KernelShark: Add xenomai_cobalt_switch_events plugin for KernelShark Jan Kiszka
  2 siblings, 1 reply; 11+ messages in thread
From: Hongzhan Chen @ 2022-03-02  2:57 UTC (permalink / raw)
  To: xenomai, jan.kiszka

For cobalt thread, there is special struct param_ex data stored in
data record, we need to parse and print its content out correctly
to hint user.

Signed-off-by: Hongzhan Chen <hongzhan.chen@intel.com>
---
 configure.ac                                  |  17 +-
 tracing/Makefile.am                           |  13 +-
 tracing/libtraceevent/Makefile.am             |  10 +
 tracing/libtraceevent/README                  |  30 +++
 .../plugin_xenomai_schedparams.c              | 201 ++++++++++++++++++
 5 files changed, 268 insertions(+), 3 deletions(-)
 create mode 100644 tracing/libtraceevent/Makefile.am
 create mode 100644 tracing/libtraceevent/README
 create mode 100644 tracing/libtraceevent/plugin_xenomai_schedparams.c

diff --git a/configure.ac b/configure.ac
index b8e9ca143..5858b3b22 100644
--- a/configure.ac
+++ b/configure.ac
@@ -829,7 +829,7 @@ AC_MSG_RESULT($XENO_DEMO_DIR)
 xeno_build_kernelshark=false
 AC_MSG_CHECKING(build kernelshark plugins)
 AC_ARG_WITH(kernelshark,
-    AS_HELP_STRING([--with-kernelshark],[build kernelshark related plugins]),
+    AS_HELP_STRING([--with-kernelshark],[build kernelshark related plugins including libtraceevent plugin]),
     [
 	case "$withval" in
 	"" | y | ye | yes) xeno_build_kernelshark=true;;
@@ -840,6 +840,20 @@ AC_MSG_RESULT($xeno_build_kernelshark)
 
 AM_CONDITIONAL([BUILD_KERNELSHARK], [test x$xeno_build_kernelshark = xtrue])
 
+xeno_build_libtraceevent=false
+AC_MSG_CHECKING(build libtraceevent plugin)
+AC_ARG_WITH(libtraceevent,
+    AS_HELP_STRING([--with-libtraceevent],[build libtraceevent plugin]),
+    [
+	case "$withval" in
+	"" | y | ye | yes) xeno_build_libtraceevent=true;;
+	n | no) xeno_build_libtraceevent=false;;
+	esac
+    ], [xeno_build_libtraceevent=false])
+AC_MSG_RESULT($xeno_build_libtraceevent)
+
+AM_CONDITIONAL([BUILD_LIBTRACEEVENT], [test x$xeno_build_libtraceevent = xtrue])
+
 AC_MSG_CHECKING([for test source generation])
 AC_RUN_IFELSE([AC_LANG_PROGRAM([[ ]], [[ ]])],
     [AC_MSG_RESULT(ok)], [AC_MSG_RESULT(failed)], [AC_MSG_RESULT(untestable)])
@@ -959,6 +973,7 @@ AC_CONFIG_FILES([ \
 	scripts/xeno \
 	tracing/Makefile \
 	tracing/kernelshark/Makefile \
+	tracing/libtraceevent/Makefile \
 	lib/Makefile \
 	lib/boilerplate/Makefile \
 	lib/boilerplate/init/Makefile \
diff --git a/tracing/Makefile.am b/tracing/Makefile.am
index 7925ae9c6..1351a98d2 100644
--- a/tracing/Makefile.am
+++ b/tracing/Makefile.am
@@ -1,7 +1,16 @@
 if BUILD_KERNELSHARK
 SUBDIRS =		\
-	kernelshark
+	kernelshark	\
+	libtraceevent
+else
+
+if BUILD_LIBTRACEEVENT
+SUBDIRS =		\
+	libtraceevent
+endif
+
 endif
 
 DIST_SUBDIRS = 		\
-	kernelshark
+	kernelshark	\
+	libtraceevent
diff --git a/tracing/libtraceevent/Makefile.am b/tracing/libtraceevent/Makefile.am
new file mode 100644
index 000000000..e6ae6f319
--- /dev/null
+++ b/tracing/libtraceevent/Makefile.am
@@ -0,0 +1,10 @@
+
+lib_LTLIBRARIES = libplugin_xenomai_schedparams.la
+
+TRACEEVENR_INCLUDS ?= /usr/local/include/traceevent
+
+libplugin_xenomai_schedparams_la_SOURCES =	\
+	plugin_xenomai_schedparams.c
+
+libplugin_xenomai_schedparams_la_CPPFLAGS =	\
+	-I$(TRACEEVENR_INCLUDS)
diff --git a/tracing/libtraceevent/README b/tracing/libtraceevent/README
new file mode 100644
index 000000000..c15088b02
--- /dev/null
+++ b/tracing/libtraceevent/README
@@ -0,0 +1,30 @@
+
+What is it?
+=============
+
+  It is Xenomai plugin on libtracevent to parse struct param_ex
+  out correctly for trace log.
+
+How to compile?
+================================
+
+Preparation:
+
+  - GIT clone:
+
+      https://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git
+
+  - build and install libtraceevent:
+
+      make;
+      sudo make install
+
+How to use built lib?
+===============================
+
+  Please copy built libplugin_xenomai_schedparams.so to
+  /usr/local/lib/traceevent/plugins/ or
+  /usr/local/lib64/traceevent/plugins/ depending on your system.
+  While libtracevent and its plugins is installed correctly, the plugins
+  would be loaded automatically by other module such as libtracecmd after
+  corresponding tracing tool run such as kernelshark or tracecmd.
diff --git a/tracing/libtraceevent/plugin_xenomai_schedparams.c b/tracing/libtraceevent/plugin_xenomai_schedparams.c
new file mode 100644
index 000000000..731e525ba
--- /dev/null
+++ b/tracing/libtraceevent/plugin_xenomai_schedparams.c
@@ -0,0 +1,201 @@
+// SPDX-License-Identifier: LGPL-2.1
+/*
+ * Copyright (C) 2021 Intel Inc, Hongzhan Chen <hongzhan.chen@intel.com>
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <linux/sched.h>
+
+#include "event-parse.h"
+#include "trace-seq.h"
+
+
+#define SCHED_SPORADIC		10
+#define SCHED_TP		11
+#define SCHED_QUOTA		12
+
+#define SCHED_COBALT		42
+#define SCHED_WEAK		43
+
+struct __sched_ss_param {
+	int __sched_low_priority;
+	struct timespec __sched_repl_period;
+	struct timespec __sched_init_budget;
+	int __sched_max_repl;
+};
+
+struct __sched_rr_param {
+	struct timespec __sched_rr_quantum;
+};
+
+struct __sched_tp_param {
+	int __sched_partition;
+};
+
+struct __sched_quota_param {
+	int __sched_group;
+};
+
+struct sched_param_ex {
+	int sched_priority;
+	union {
+		struct __sched_ss_param ss;
+		struct __sched_rr_param rr;
+		struct __sched_tp_param tp;
+		struct __sched_quota_param quota;
+	} sched_u;
+};
+
+#define sched_quota_group	sched_u.quota.__sched_group
+#define sched_tp_partition	sched_u.tp.__sched_partition
+#define sched_ss_low_priority	sched_u.ss.__sched_low_priority
+#define sched_ss_repl_period	sched_u.ss.__sched_repl_period
+#define sched_ss_init_budget	sched_u.ss.__sched_init_budget
+#define sched_ss_max_repl	sched_u.ss.__sched_max_repl
+
+static void write_policy(struct trace_seq *p, int policy)
+{
+	trace_seq_printf(p, "policy=");
+
+	switch (policy) {
+	case SCHED_QUOTA:
+		trace_seq_printf(p, "quota ");
+		break;
+	case SCHED_TP:
+		trace_seq_printf(p, "tp ");
+		break;
+	case SCHED_NORMAL:
+		trace_seq_printf(p, "normal ");
+		break;
+	case SCHED_SPORADIC:
+		trace_seq_printf(p, "sporadic ");
+		break;
+	case SCHED_RR:
+		trace_seq_printf(p, "rr ");
+		break;
+	case SCHED_FIFO:
+		trace_seq_printf(p, "fifo ");
+		break;
+	case SCHED_COBALT:
+		trace_seq_printf(p, "cobalt ");
+		break;
+	case SCHED_WEAK:
+		trace_seq_printf(p, "weak ");
+		break;
+	default:
+		trace_seq_printf(p, "unknown ");
+		break;
+	}
+}
+
+/* save param */
+static void write_param(struct tep_format_field *field,
+				struct tep_record *record,
+				struct trace_seq *p, int policy)
+{
+	int offset;
+	struct sched_param_ex *params;
+
+	offset = field->offset;
+
+	if (!strncmp(field->type, "__data_loc", 10)) {
+		unsigned long long v;
+
+		if (tep_read_number_field(field, record->data, &v)) {
+			trace_seq_printf(p, "invalid_data_loc");
+			return;
+		}
+		offset = v & 0xffff;
+
+	}
+
+	params = (struct sched_param_ex *)((char *)record->data + offset);
+
+	trace_seq_printf(p, "param: { ");
+
+	switch (policy) {
+	case SCHED_QUOTA:
+		trace_seq_printf(p, "priority=%d, group=%d",
+				 params->sched_priority,
+				 params->sched_quota_group);
+		break;
+	case SCHED_TP:
+		trace_seq_printf(p, "priority=%d, partition=%d",
+				 params->sched_priority,
+				 params->sched_tp_partition);
+		break;
+	case SCHED_NORMAL:
+		break;
+	case SCHED_SPORADIC:
+		trace_seq_printf(p, "priority=%d, low_priority=%d, ",
+				 params->sched_priority,
+				 params->sched_ss_low_priority);
+
+		trace_seq_printf(p, "budget=(%ld.%09ld), period=(%ld.%09ld), ",
+				 params->sched_ss_init_budget.tv_sec,
+				 params->sched_ss_init_budget.tv_nsec);
+
+		trace_seq_printf(p, "maxrepl=%d",
+				 params->sched_ss_max_repl);
+		break;
+	case SCHED_RR:
+	case SCHED_FIFO:
+	case SCHED_COBALT:
+	case SCHED_WEAK:
+	default:
+		trace_seq_printf(p, "priority=%d", params->sched_priority);
+		break;
+	}
+	trace_seq_printf(p, " }");
+	trace_seq_putc(p, '\0');
+
+}
+
+static int cobalt_schedparam_handler(struct trace_seq *s,
+				struct tep_record *record,
+				struct tep_event *event, void *context)
+{
+	struct tep_format_field *field;
+	unsigned long long val;
+
+	if (tep_get_field_val(s, event, "pth", record, &val, 1))
+		return trace_seq_putc(s, '!');
+	trace_seq_puts(s, "pth: ");
+	trace_seq_printf(s, "0x%08llx ", val);
+
+	if (tep_get_field_val(s, event, "policy", record, &val, 1) == 0)
+		write_policy(s, val);
+
+	field = tep_find_field(event, "param_ex");
+	if (field)
+		write_param(field, record, s, val);
+
+	return 0;
+}
+
+int TEP_PLUGIN_LOADER(struct tep_handle *tep)
+{
+	tep_register_event_handler(tep, -1, "cobalt_posix", "cobalt_pthread_setschedparam",
+					cobalt_schedparam_handler, NULL);
+
+	tep_register_event_handler(tep, -1, "cobalt_posix", "cobalt_pthread_getschedparam",
+					cobalt_schedparam_handler, NULL);
+
+	tep_register_event_handler(tep, -1, "cobalt_posix", "cobalt_pthread_create",
+					cobalt_schedparam_handler, NULL);
+
+	return 0;
+}
+
+void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
+{
+	tep_unregister_event_handler(tep, -1, "cobalt_posix", "cobalt_pthread_setschedparam",
+					cobalt_schedparam_handler, NULL);
+
+	tep_unregister_event_handler(tep, -1, "cobalt_posix", "cobalt_pthread_getschedparam",
+					cobalt_schedparam_handler, NULL);
+
+	tep_unregister_event_handler(tep, -1, "cobalt_posix", "cobalt_pthread_create",
+					cobalt_schedparam_handler, NULL);
+}
-- 
2.17.1



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

* Re: [PATCH v2 3/3] libtraceevent: Add xenomai_schedparams plugin for libtraceevent
  2022-03-02  2:57 ` [PATCH v2 3/3] libtraceevent: Add xenomai_schedparams plugin for libtraceevent Hongzhan Chen
@ 2022-03-02  8:58   ` Bezdeka, Florian
  0 siblings, 0 replies; 11+ messages in thread
From: Bezdeka, Florian @ 2022-03-02  8:58 UTC (permalink / raw)
  To: hongzhan.chen, xenomai, jan.kiszka

On Tue, 2022-03-01 at 21:57 -0500, Hongzhan Chen via Xenomai wrote:
> For cobalt thread, there is special struct param_ex data stored in
> data record, we need to parse and print its content out correctly
> to hint user.
> 
> Signed-off-by: Hongzhan Chen <hongzhan.chen@intel.com>
> ---
>  configure.ac                                  |  17 +-
>  tracing/Makefile.am                           |  13 +-
>  tracing/libtraceevent/Makefile.am             |  10 +
>  tracing/libtraceevent/README                  |  30 +++
>  .../plugin_xenomai_schedparams.c              | 201 ++++++++++++++++++
>  5 files changed, 268 insertions(+), 3 deletions(-)
>  create mode 100644 tracing/libtraceevent/Makefile.am
>  create mode 100644 tracing/libtraceevent/README
>  create mode 100644 tracing/libtraceevent/plugin_xenomai_schedparams.c
> 
> diff --git a/configure.ac b/configure.ac
> index b8e9ca143..5858b3b22 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -829,7 +829,7 @@ AC_MSG_RESULT($XENO_DEMO_DIR)
>  xeno_build_kernelshark=false
>  AC_MSG_CHECKING(build kernelshark plugins)
>  AC_ARG_WITH(kernelshark,
> -    AS_HELP_STRING([--with-kernelshark],[build kernelshark related plugins]),
> +    AS_HELP_STRING([--with-kernelshark],[build kernelshark related plugins including libtraceevent plugin]),
>      [
>  	case "$withval" in
>  	"" | y | ye | yes) xeno_build_kernelshark=true;;
> @@ -840,6 +840,20 @@ AC_MSG_RESULT($xeno_build_kernelshark)
>  
>  AM_CONDITIONAL([BUILD_KERNELSHARK], [test x$xeno_build_kernelshark = xtrue])
>  
> +xeno_build_libtraceevent=false
> +AC_MSG_CHECKING(build libtraceevent plugin)
> +AC_ARG_WITH(libtraceevent,
> +    AS_HELP_STRING([--with-libtraceevent],[build libtraceevent plugin]),
> +    [
> +	case "$withval" in
> +	"" | y | ye | yes) xeno_build_libtraceevent=true;;
> +	n | no) xeno_build_libtraceevent=false;;
> +	esac
> +    ], [xeno_build_libtraceevent=false])
> +AC_MSG_RESULT($xeno_build_libtraceevent)
> +
> +AM_CONDITIONAL([BUILD_LIBTRACEEVENT], [test x$xeno_build_libtraceevent = xtrue])
> +
>  AC_MSG_CHECKING([for test source generation])
>  AC_RUN_IFELSE([AC_LANG_PROGRAM([[ ]], [[ ]])],
>      [AC_MSG_RESULT(ok)], [AC_MSG_RESULT(failed)], [AC_MSG_RESULT(untestable)])
> @@ -959,6 +973,7 @@ AC_CONFIG_FILES([ \
>  	scripts/xeno \
>  	tracing/Makefile \
>  	tracing/kernelshark/Makefile \
> +	tracing/libtraceevent/Makefile \
>  	lib/Makefile \
>  	lib/boilerplate/Makefile \
>  	lib/boilerplate/init/Makefile \
> diff --git a/tracing/Makefile.am b/tracing/Makefile.am
> index 7925ae9c6..1351a98d2 100644
> --- a/tracing/Makefile.am
> +++ b/tracing/Makefile.am
> @@ -1,7 +1,16 @@
>  if BUILD_KERNELSHARK
>  SUBDIRS =		\
> -	kernelshark
> +	kernelshark	\
> +	libtraceevent
> +else
> +
> +if BUILD_LIBTRACEEVENT
> +SUBDIRS =		\
> +	libtraceevent
> +endif
> +
>  endif
>  
>  DIST_SUBDIRS = 		\
> -	kernelshark
> +	kernelshark	\
> +	libtraceevent
> diff --git a/tracing/libtraceevent/Makefile.am b/tracing/libtraceevent/Makefile.am
> new file mode 100644
> index 000000000..e6ae6f319
> --- /dev/null
> +++ b/tracing/libtraceevent/Makefile.am
> @@ -0,0 +1,10 @@
> +
> +lib_LTLIBRARIES = libplugin_xenomai_schedparams.la
> +
> +TRACEEVENR_INCLUDS ?= /usr/local/include/traceevent
> +
> +libplugin_xenomai_schedparams_la_SOURCES =	\
> +	plugin_xenomai_schedparams.c
> +
> +libplugin_xenomai_schedparams_la_CPPFLAGS =	\
> +	-I$(TRACEEVENR_INCLUDS)
> diff --git a/tracing/libtraceevent/README b/tracing/libtraceevent/README
> new file mode 100644
> index 000000000..c15088b02
> --- /dev/null
> +++ b/tracing/libtraceevent/README
> @@ -0,0 +1,30 @@
> +
> +What is it?
> +=============
> +
> +  It is Xenomai plugin on libtracevent to parse struct param_ex
> +  out correctly for trace log.
> +
> +How to compile?
> +================================
> +
> +Preparation:
> +
> +  - GIT clone:
> +
> +      https://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git
> +
> +  - build and install libtraceevent:
> +
> +      make;
> +      sudo make install
> +
> +How to use built lib?
> +===============================
> +
> +  Please copy built libplugin_xenomai_schedparams.so to
> +  /usr/local/lib/traceevent/plugins/ or
> +  /usr/local/lib64/traceevent/plugins/ depending on your system.
> +  While libtracevent and its plugins is installed correctly, the plugins
> +  would be loaded automatically by other module such as libtracecmd after
> +  corresponding tracing tool run such as kernelshark or tracecmd.
> diff --git a/tracing/libtraceevent/plugin_xenomai_schedparams.c b/tracing/libtraceevent/plugin_xenomai_schedparams.c
> new file mode 100644
> index 000000000..731e525ba
> --- /dev/null
> +++ b/tracing/libtraceevent/plugin_xenomai_schedparams.c
> @@ -0,0 +1,201 @@
> +// SPDX-License-Identifier: LGPL-2.1
> +/*
> + * Copyright (C) 2021 Intel Inc, Hongzhan Chen <hongzhan.chen@intel.com>
> + */
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <linux/sched.h>
> +
> +#include "event-parse.h"
> +#include "trace-seq.h"
> +
> +
> +#define SCHED_SPORADIC		10
> +#define SCHED_TP		11
> +#define SCHED_QUOTA		12
> +
> +#define SCHED_COBALT		42
> +#define SCHED_WEAK		43
> +
> +struct __sched_ss_param {
> +	int __sched_low_priority;
> +	struct timespec __sched_repl_period;
> +	struct timespec __sched_init_budget;
> +	int __sched_max_repl;
> +};
> +
> +struct __sched_rr_param {
> +	struct timespec __sched_rr_quantum;
> +};
> +
> +struct __sched_tp_param {
> +	int __sched_partition;
> +};
> +
> +struct __sched_quota_param {
> +	int __sched_group;
> +};
> +
> +struct sched_param_ex {
> +	int sched_priority;
> +	union {
> +		struct __sched_ss_param ss;
> +		struct __sched_rr_param rr;
> +		struct __sched_tp_param tp;
> +		struct __sched_quota_param quota;
> +	} sched_u;
> +};
> +
> +#define sched_quota_group	sched_u.quota.__sched_group
> +#define sched_tp_partition	sched_u.tp.__sched_partition
> +#define sched_ss_low_priority	sched_u.ss.__sched_low_priority
> +#define sched_ss_repl_period	sched_u.ss.__sched_repl_period
> +#define sched_ss_init_budget	sched_u.ss.__sched_init_budget
> +#define sched_ss_max_repl	sched_u.ss.__sched_max_repl

Why can't you include the xenomai header that actually already defines
such types and their helpers? I might overlook something, but it looks
like a redefinition to me which might break as soon as we have to touch
such types inside Xenomai. Everything around sched_param_ex is y2038
affected for example, so there might be the need to change...

> +
> +static void write_policy(struct trace_seq *p, int policy)
> +{
> +	trace_seq_printf(p, "policy=");
> +
> +	switch (policy) {
> +	case SCHED_QUOTA:
> +		trace_seq_printf(p, "quota ");
> +		break;
> +	case SCHED_TP:
> +		trace_seq_printf(p, "tp ");
> +		break;
> +	case SCHED_NORMAL:
> +		trace_seq_printf(p, "normal ");
> +		break;
> +	case SCHED_SPORADIC:
> +		trace_seq_printf(p, "sporadic ");
> +		break;
> +	case SCHED_RR:
> +		trace_seq_printf(p, "rr ");
> +		break;
> +	case SCHED_FIFO:
> +		trace_seq_printf(p, "fifo ");
> +		break;
> +	case SCHED_COBALT:
> +		trace_seq_printf(p, "cobalt ");
> +		break;
> +	case SCHED_WEAK:
> +		trace_seq_printf(p, "weak ");
> +		break;
> +	default:
> +		trace_seq_printf(p, "unknown ");
> +		break;
> +	}
> +}
> +
> +/* save param */
> +static void write_param(struct tep_format_field *field,
> +				struct tep_record *record,
> +				struct trace_seq *p, int policy)
> +{
> +	int offset;
> +	struct sched_param_ex *params;
> +
> +	offset = field->offset;
> +
> +	if (!strncmp(field->type, "__data_loc", 10)) {
> +		unsigned long long v;
> +
> +		if (tep_read_number_field(field, record->data, &v)) {
> +			trace_seq_printf(p, "invalid_data_loc");
> +			return;
> +		}
> +		offset = v & 0xffff;
> +
> +	}
> +
> +	params = (struct sched_param_ex *)((char *)record->data + offset);
> +
> +	trace_seq_printf(p, "param: { ");
> +
> +	switch (policy) {
> +	case SCHED_QUOTA:
> +		trace_seq_printf(p, "priority=%d, group=%d",
> +				 params->sched_priority,
> +				 params->sched_quota_group);
> +		break;
> +	case SCHED_TP:
> +		trace_seq_printf(p, "priority=%d, partition=%d",
> +				 params->sched_priority,
> +				 params->sched_tp_partition);
> +		break;
> +	case SCHED_NORMAL:
> +		break;
> +	case SCHED_SPORADIC:
> +		trace_seq_printf(p, "priority=%d, low_priority=%d, ",
> +				 params->sched_priority,
> +				 params->sched_ss_low_priority);
> +
> +		trace_seq_printf(p, "budget=(%ld.%09ld), period=(%ld.%09ld), ",
> +				 params->sched_ss_init_budget.tv_sec,
> +				 params->sched_ss_init_budget.tv_nsec);
> +
> +		trace_seq_printf(p, "maxrepl=%d",
> +				 params->sched_ss_max_repl);
> +		break;
> +	case SCHED_RR:
> +	case SCHED_FIFO:
> +	case SCHED_COBALT:
> +	case SCHED_WEAK:
> +	default:
> +		trace_seq_printf(p, "priority=%d", params->sched_priority);
> +		break;
> +	}
> +	trace_seq_printf(p, " }");
> +	trace_seq_putc(p, '\0');
> +
> +}
> +
> +static int cobalt_schedparam_handler(struct trace_seq *s,
> +				struct tep_record *record,
> +				struct tep_event *event, void *context)
> +{
> +	struct tep_format_field *field;
> +	unsigned long long val;
> +
> +	if (tep_get_field_val(s, event, "pth", record, &val, 1))
> +		return trace_seq_putc(s, '!');
> +	trace_seq_puts(s, "pth: ");
> +	trace_seq_printf(s, "0x%08llx ", val);
> +
> +	if (tep_get_field_val(s, event, "policy", record, &val, 1) == 0)
> +		write_policy(s, val);
> +
> +	field = tep_find_field(event, "param_ex");
> +	if (field)
> +		write_param(field, record, s, val);
> +
> +	return 0;
> +}
> +
> +int TEP_PLUGIN_LOADER(struct tep_handle *tep)
> +{
> +	tep_register_event_handler(tep, -1, "cobalt_posix", "cobalt_pthread_setschedparam",
> +					cobalt_schedparam_handler, NULL);
> +
> +	tep_register_event_handler(tep, -1, "cobalt_posix", "cobalt_pthread_getschedparam",
> +					cobalt_schedparam_handler, NULL);
> +
> +	tep_register_event_handler(tep, -1, "cobalt_posix", "cobalt_pthread_create",
> +					cobalt_schedparam_handler, NULL);
> +
> +	return 0;
> +}
> +
> +void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
> +{
> +	tep_unregister_event_handler(tep, -1, "cobalt_posix", "cobalt_pthread_setschedparam",
> +					cobalt_schedparam_handler, NULL);
> +
> +	tep_unregister_event_handler(tep, -1, "cobalt_posix", "cobalt_pthread_getschedparam",
> +					cobalt_schedparam_handler, NULL);
> +
> +	tep_unregister_event_handler(tep, -1, "cobalt_posix", "cobalt_pthread_create",
> +					cobalt_schedparam_handler, NULL);
> +}


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

* Re: [PATCH v2 2/3] Add --with-kernelshark option
  2022-03-02  2:57 ` [PATCH v2 2/3] Add --with-kernelshark option Hongzhan Chen
@ 2022-03-03  6:25   ` Jan Kiszka
  2022-03-03  6:30     ` Chen, Hongzhan
  0 siblings, 1 reply; 11+ messages in thread
From: Jan Kiszka @ 2022-03-03  6:25 UTC (permalink / raw)
  To: Hongzhan Chen, xenomai

On 02.03.22 03:57, Hongzhan Chen wrote:
> option to build kernelshark plugin
> 
> Signed-off-by: Hongzhan Chen <hongzhan.chen@intel.com>
> ---
>  Makefile.am         |  4 ++++
>  configure.ac        | 16 ++++++++++++++++
>  tracing/Makefile.am |  3 ++-
>  3 files changed, 22 insertions(+), 1 deletion(-)
> 
> diff --git a/Makefile.am b/Makefile.am
> index 604644277..bd3e4bfb1 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -18,6 +18,9 @@ SUBDIRS += 		\
>  	testsuite
>  endif
>  
> +SUBDIRS +=		\
> +	tracing
> +
>  EXTRA_DIST = kernel debian
>  
>  DIST_SUBDIRS =		\
> @@ -26,6 +29,7 @@ DIST_SUBDIRS =		\
>  	doc		\
>  	include		\
>  	lib 		\
> +	tracing		\
>  	scripts		\
>  	testsuite	\
>  	utils
> diff --git a/configure.ac b/configure.ac
> index 16cffd8f8..b8e9ca143 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -826,6 +826,20 @@ AC_ARG_WITH(demodir,
>      ], [XENO_DEMO_DIR=$demodir])
>  AC_MSG_RESULT($XENO_DEMO_DIR)
>  
> +xeno_build_kernelshark=false
> +AC_MSG_CHECKING(build kernelshark plugins)
> +AC_ARG_WITH(kernelshark,
> +    AS_HELP_STRING([--with-kernelshark],[build kernelshark related plugins]),
> +    [
> +	case "$withval" in
> +	"" | y | ye | yes) xeno_build_kernelshark=true;;
> +	n | no) xeno_build_kernelshark=false;;
> +	esac
> +    ], [xeno_build_kernelshark=false])
> +AC_MSG_RESULT($xeno_build_kernelshark)
> +
> +AM_CONDITIONAL([BUILD_KERNELSHARK], [test x$xeno_build_kernelshark = xtrue])
> +
>  AC_MSG_CHECKING([for test source generation])
>  AC_RUN_IFELSE([AC_LANG_PROGRAM([[ ]], [[ ]])],
>      [AC_MSG_RESULT(ok)], [AC_MSG_RESULT(failed)], [AC_MSG_RESULT(untestable)])
> @@ -943,6 +957,8 @@ AC_CONFIG_FILES([ \
>  	scripts/Makefile \
>  	scripts/xeno-config:scripts/xeno-config-$rtcore_type.in \
>  	scripts/xeno \
> +	tracing/Makefile \
> +	tracing/kernelshark/Makefile \
>  	lib/Makefile \
>  	lib/boilerplate/Makefile \
>  	lib/boilerplate/init/Makefile \
> diff --git a/tracing/Makefile.am b/tracing/Makefile.am
> index 8bdf1f906..7925ae9c6 100644
> --- a/tracing/Makefile.am
> +++ b/tracing/Makefile.am
> @@ -1,6 +1,7 @@
> -
> +if BUILD_KERNELSHARK
>  SUBDIRS =		\
>  	kernelshark
> +endif
>  
>  DIST_SUBDIRS = 		\
>  	kernelshark

Seems you lost the AC_PROG_CXX - things do not build now.

Jan

-- 
Siemens AG, Technology
Competence Center Embedded Linux


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

* RE: [PATCH v2 2/3] Add --with-kernelshark option
  2022-03-03  6:25   ` Jan Kiszka
@ 2022-03-03  6:30     ` Chen, Hongzhan
  2022-03-03  6:39       ` Jan Kiszka
  0 siblings, 1 reply; 11+ messages in thread
From: Chen, Hongzhan @ 2022-03-03  6:30 UTC (permalink / raw)
  To: Kiszka, Jan, xenomai




>> +	tracing/Makefile \
>> +	tracing/kernelshark/Makefile \
>>  	lib/Makefile \
>>  	lib/boilerplate/Makefile \
>>  	lib/boilerplate/init/Makefile \
>> diff --git a/tracing/Makefile.am b/tracing/Makefile.am
>> index 8bdf1f906..7925ae9c6 100644
>> --- a/tracing/Makefile.am
>> +++ b/tracing/Makefile.am
>> @@ -1,6 +1,7 @@
>> -
>> +if BUILD_KERNELSHARK
>>  SUBDIRS =		\
>>  	kernelshark
>> +endif
>>  
>>  DIST_SUBDIRS = 		\
>>  	kernelshark
>
>Seems you lost the AC_PROG_CXX - things do not build now.

Sorry, I assumed that patch [1] pass review , so I have not committed again to review.
Could you apply this patch?

https://xenomai.org/pipermail/xenomai/2022-February/047262.html

Regards

Hongzhan Chen

>
>Jan
>
>-- 
>Siemens AG, Technology
>Competence Center Embedded Linux
>
>
>
>

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

* Re: [PATCH v2 1/3] KernelShark: Add xenomai_cobalt_switch_events plugin for KernelShark
  2022-03-02  2:57 [PATCH v2 1/3] KernelShark: Add xenomai_cobalt_switch_events plugin for KernelShark Hongzhan Chen
  2022-03-02  2:57 ` [PATCH v2 2/3] Add --with-kernelshark option Hongzhan Chen
  2022-03-02  2:57 ` [PATCH v2 3/3] libtraceevent: Add xenomai_schedparams plugin for libtraceevent Hongzhan Chen
@ 2022-03-03  6:38 ` Jan Kiszka
  2022-03-03  6:44   ` Jan Kiszka
  2 siblings, 1 reply; 11+ messages in thread
From: Jan Kiszka @ 2022-03-03  6:38 UTC (permalink / raw)
  To: Hongzhan Chen, xenomai

On 02.03.22 03:57, Hongzhan Chen wrote:
> For Xenomai-cobalt enabled system, cobalt_switch_context means
> that there is schedule and context switch in companion core(realtime
> core), which we may need to do special treatment and take correct
> action as main kernel sched_switch to visualize out-of-band state
> of realtime tasks running in cobalt core. To achive our target,
> we implement following:
> 
>   1. store corresponding cobalt_switch_context events into
>      container data.
>   2. modify pid stored in entry to be equal to next_pid to
>      show correct color in cpu bar when cobalt_switch_context
>      event happen.
>   3. show blue hollow box to mark out-of-band state according to
>      cobalt_switch_context events.
>   4. clickable cobalt_switch_context plugin shapes.
> 
> Signed-off-by: Hongzhan Chen <hongzhan.chen@intel.com>
> ---
>  tracing/Makefile.am                           |   6 +
>  tracing/kernelshark/CobaltSwitchEvents.cpp    | 156 ++++++++++++++++
>  tracing/kernelshark/Makefile.am               |  18 ++
>  tracing/kernelshark/README                    |  75 ++++++++
>  .../xenomai_cobalt_switch_events.c            | 174 ++++++++++++++++++
>  .../xenomai_cobalt_switch_events.h            |  58 ++++++
>  6 files changed, 487 insertions(+)
>  create mode 100644 tracing/Makefile.am
>  create mode 100644 tracing/kernelshark/CobaltSwitchEvents.cpp
>  create mode 100644 tracing/kernelshark/Makefile.am
>  create mode 100644 tracing/kernelshark/README
>  create mode 100644 tracing/kernelshark/xenomai_cobalt_switch_events.c
>  create mode 100644 tracing/kernelshark/xenomai_cobalt_switch_events.h
> 

...

> diff --git a/tracing/kernelshark/Makefile.am b/tracing/kernelshark/Makefile.am
> new file mode 100644
> index 000000000..17c4ff217
> --- /dev/null
> +++ b/tracing/kernelshark/Makefile.am
> @@ -0,0 +1,18 @@
> +
> +lib_LTLIBRARIES = libplugin_xenomai_cobalt_switch_events.la
> +
> +KS_INCLUDS         ?= /usr/local/include/kernelshark
> +TRACECMD_INCLUDS   ?= /usr/local/include/trace-cmd
> +TRACEFS_INCLUDS    ?= /usr/local/include/tracefs
> +TRACEEVENR_INCLUDS ?= /usr/local/include/traceevent

configure.ac needs to gain a way to make this configurable (kernelshark
and libtraceevent folders). And then you can also drop these defaults.

Jan

-- 
Siemens AG, Technology
Competence Center Embedded Linux


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

* Re: [PATCH v2 2/3] Add --with-kernelshark option
  2022-03-03  6:30     ` Chen, Hongzhan
@ 2022-03-03  6:39       ` Jan Kiszka
  2022-03-03  6:48         ` Chen, Hongzhan
  0 siblings, 1 reply; 11+ messages in thread
From: Jan Kiszka @ 2022-03-03  6:39 UTC (permalink / raw)
  To: Chen, Hongzhan, xenomai

On 03.03.22 07:30, Chen, Hongzhan wrote:
> 
> 
> 
>>> +	tracing/Makefile \
>>> +	tracing/kernelshark/Makefile \
>>>  	lib/Makefile \
>>>  	lib/boilerplate/Makefile \
>>>  	lib/boilerplate/init/Makefile \
>>> diff --git a/tracing/Makefile.am b/tracing/Makefile.am
>>> index 8bdf1f906..7925ae9c6 100644
>>> --- a/tracing/Makefile.am
>>> +++ b/tracing/Makefile.am
>>> @@ -1,6 +1,7 @@
>>> -
>>> +if BUILD_KERNELSHARK
>>>  SUBDIRS =		\
>>>  	kernelshark
>>> +endif
>>>  
>>>  DIST_SUBDIRS = 		\
>>>  	kernelshark
>>
>> Seems you lost the AC_PROG_CXX - things do not build now.
> 
> Sorry, I assumed that patch [1] pass review , so I have not committed again to review.
> Could you apply this patch?
> 
> https://xenomai.org/pipermail/xenomai/2022-February/047262.html
> 

When sending v4 after my review remarks, please include all patches.

Jan

-- 
Siemens AG, Technology
Competence Center Embedded Linux


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

* Re: [PATCH v2 1/3] KernelShark: Add xenomai_cobalt_switch_events plugin for KernelShark
  2022-03-03  6:38 ` [PATCH v2 1/3] KernelShark: Add xenomai_cobalt_switch_events plugin for KernelShark Jan Kiszka
@ 2022-03-03  6:44   ` Jan Kiszka
  0 siblings, 0 replies; 11+ messages in thread
From: Jan Kiszka @ 2022-03-03  6:44 UTC (permalink / raw)
  To: Hongzhan Chen, xenomai

On 03.03.22 07:38, Jan Kiszka via Xenomai wrote:
> On 02.03.22 03:57, Hongzhan Chen wrote:
>> For Xenomai-cobalt enabled system, cobalt_switch_context means
>> that there is schedule and context switch in companion core(realtime
>> core), which we may need to do special treatment and take correct
>> action as main kernel sched_switch to visualize out-of-band state
>> of realtime tasks running in cobalt core. To achive our target,
>> we implement following:
>>
>>   1. store corresponding cobalt_switch_context events into
>>      container data.
>>   2. modify pid stored in entry to be equal to next_pid to
>>      show correct color in cpu bar when cobalt_switch_context
>>      event happen.
>>   3. show blue hollow box to mark out-of-band state according to
>>      cobalt_switch_context events.
>>   4. clickable cobalt_switch_context plugin shapes.
>>
>> Signed-off-by: Hongzhan Chen <hongzhan.chen@intel.com>
>> ---
>>  tracing/Makefile.am                           |   6 +
>>  tracing/kernelshark/CobaltSwitchEvents.cpp    | 156 ++++++++++++++++
>>  tracing/kernelshark/Makefile.am               |  18 ++
>>  tracing/kernelshark/README                    |  75 ++++++++
>>  .../xenomai_cobalt_switch_events.c            | 174 ++++++++++++++++++
>>  .../xenomai_cobalt_switch_events.h            |  58 ++++++
>>  6 files changed, 487 insertions(+)
>>  create mode 100644 tracing/Makefile.am
>>  create mode 100644 tracing/kernelshark/CobaltSwitchEvents.cpp
>>  create mode 100644 tracing/kernelshark/Makefile.am
>>  create mode 100644 tracing/kernelshark/README
>>  create mode 100644 tracing/kernelshark/xenomai_cobalt_switch_events.c
>>  create mode 100644 tracing/kernelshark/xenomai_cobalt_switch_events.h
>>
> 
> ...
> 
>> diff --git a/tracing/kernelshark/Makefile.am b/tracing/kernelshark/Makefile.am
>> new file mode 100644
>> index 000000000..17c4ff217
>> --- /dev/null
>> +++ b/tracing/kernelshark/Makefile.am
>> @@ -0,0 +1,18 @@
>> +
>> +lib_LTLIBRARIES = libplugin_xenomai_cobalt_switch_events.la
>> +
>> +KS_INCLUDS         ?= /usr/local/include/kernelshark
>> +TRACECMD_INCLUDS   ?= /usr/local/include/trace-cmd
>> +TRACEFS_INCLUDS    ?= /usr/local/include/tracefs
>> +TRACEEVENR_INCLUDS ?= /usr/local/include/traceevent
> 
> configure.ac needs to gain a way to make this configurable (kernelshark
> and libtraceevent folders). And then you can also drop these defaults.
> 

Use case: Local installation of self-built kernelshark/libtraceevent
under uncommon paths. Allows to test new versions of them without
uninstalling an existing one, maybe even a distro package.

Jan

-- 
Siemens AG, Technology
Competence Center Embedded Linux


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

* RE: [PATCH v2 2/3] Add --with-kernelshark option
  2022-03-03  6:39       ` Jan Kiszka
@ 2022-03-03  6:48         ` Chen, Hongzhan
  2022-03-03  6:51           ` Jan Kiszka
  0 siblings, 1 reply; 11+ messages in thread
From: Chen, Hongzhan @ 2022-03-03  6:48 UTC (permalink / raw)
  To: Kiszka, Jan, xenomai



>-----Original Message-----
>From: Jan Kiszka <jan.kiszka@siemens.com> 
>Sent: Thursday, March 3, 2022 2:39 PM
>To: Chen, Hongzhan <hongzhan.chen@intel.com>; xenomai@xenomai.org
>Subject: Re: [PATCH v2 2/3] Add --with-kernelshark option
>
>On 03.03.22 07:30, Chen, Hongzhan wrote:
>> 
>> 
>> 
>>>> +	tracing/Makefile \
>>>> +	tracing/kernelshark/Makefile \
>>>>  	lib/Makefile \
>>>>  	lib/boilerplate/Makefile \
>>>>  	lib/boilerplate/init/Makefile \
>>>> diff --git a/tracing/Makefile.am b/tracing/Makefile.am
>>>> index 8bdf1f906..7925ae9c6 100644
>>>> --- a/tracing/Makefile.am
>>>> +++ b/tracing/Makefile.am
>>>> @@ -1,6 +1,7 @@
>>>> -
>>>> +if BUILD_KERNELSHARK
>>>>  SUBDIRS =		\
>>>>  	kernelshark
>>>> +endif
>>>>  
>>>>  DIST_SUBDIRS = 		\
>>>>  	kernelshark
>>>
>>> Seems you lost the AC_PROG_CXX - things do not build now.
>> 
>> Sorry, I assumed that patch [1] pass review , so I have not committed again to review.
>> Could you apply this patch?
>> 
>> https://xenomai.org/pipermail/xenomai/2022-February/047262.html
>> 
>
>When sending v4 after my review remarks, please include all patches.

If it already pass review , why cannot we merge it at first?

Regards

Hongzhan Chen
>
>Jan
>
>-- 
>Siemens AG, Technology
>Competence Center Embedded Linux
>

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

* Re: [PATCH v2 2/3] Add --with-kernelshark option
  2022-03-03  6:48         ` Chen, Hongzhan
@ 2022-03-03  6:51           ` Jan Kiszka
  0 siblings, 0 replies; 11+ messages in thread
From: Jan Kiszka @ 2022-03-03  6:51 UTC (permalink / raw)
  To: Chen, Hongzhan, xenomai

On 03.03.22 07:48, Chen, Hongzhan wrote:
> 
> 
>> -----Original Message-----
>> From: Jan Kiszka <jan.kiszka@siemens.com> 
>> Sent: Thursday, March 3, 2022 2:39 PM
>> To: Chen, Hongzhan <hongzhan.chen@intel.com>; xenomai@xenomai.org
>> Subject: Re: [PATCH v2 2/3] Add --with-kernelshark option
>>
>> On 03.03.22 07:30, Chen, Hongzhan wrote:
>>>
>>>
>>>
>>>>> +	tracing/Makefile \
>>>>> +	tracing/kernelshark/Makefile \
>>>>>  	lib/Makefile \
>>>>>  	lib/boilerplate/Makefile \
>>>>>  	lib/boilerplate/init/Makefile \
>>>>> diff --git a/tracing/Makefile.am b/tracing/Makefile.am
>>>>> index 8bdf1f906..7925ae9c6 100644
>>>>> --- a/tracing/Makefile.am
>>>>> +++ b/tracing/Makefile.am
>>>>> @@ -1,6 +1,7 @@
>>>>> -
>>>>> +if BUILD_KERNELSHARK
>>>>>  SUBDIRS =		\
>>>>>  	kernelshark
>>>>> +endif
>>>>>  
>>>>>  DIST_SUBDIRS = 		\
>>>>>  	kernelshark
>>>>
>>>> Seems you lost the AC_PROG_CXX - things do not build now.
>>>
>>> Sorry, I assumed that patch [1] pass review , so I have not committed again to review.
>>> Could you apply this patch?
>>>
>>> https://xenomai.org/pipermail/xenomai/2022-February/047262.html
>>>
>>
>> When sending v4 after my review remarks, please include all patches.
> 
> If it already pass review , why cannot we merge it at first?
> 

It belongs logically to the kernelshark/libtraceevent series and is not
needed otherwise.

Jan

-- 
Siemens AG, Technology
Competence Center Embedded Linux


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

end of thread, other threads:[~2022-03-03  6:51 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-03-02  2:57 [PATCH v2 1/3] KernelShark: Add xenomai_cobalt_switch_events plugin for KernelShark Hongzhan Chen
2022-03-02  2:57 ` [PATCH v2 2/3] Add --with-kernelshark option Hongzhan Chen
2022-03-03  6:25   ` Jan Kiszka
2022-03-03  6:30     ` Chen, Hongzhan
2022-03-03  6:39       ` Jan Kiszka
2022-03-03  6:48         ` Chen, Hongzhan
2022-03-03  6:51           ` Jan Kiszka
2022-03-02  2:57 ` [PATCH v2 3/3] libtraceevent: Add xenomai_schedparams plugin for libtraceevent Hongzhan Chen
2022-03-02  8:58   ` Bezdeka, Florian
2022-03-03  6:38 ` [PATCH v2 1/3] KernelShark: Add xenomai_cobalt_switch_events plugin for KernelShark Jan Kiszka
2022-03-03  6:44   ` Jan Kiszka

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.