verification/rvgen: Restructure the templates files
authorNam Cao <namcao@linutronix.de>
Fri, 4 Jul 2025 13:20:03 +0000 (15:20 +0200)
committerSteven Rostedt (Google) <rostedt@goodmis.org>
Thu, 24 Jul 2025 14:42:46 +0000 (10:42 -0400)
To simply the scripts and to allow easy integration of new monitor types,
restructure the template files as followed:

1. Move the template files to be in the same directory as the rvgen
   package. Furthermore, the installation will now only install the
   templates to the package directory, not /usr/share/. This simplify
   templates reading, as the scripts do not need to find the templates at
   multiple places.

2. Move dot2k_templates/* to:
     - templates/dot2k/
     - templates/container/

   This allows sharing templates reading code between DA monitor generation
   and container generation (and any future generation type).

   For template files which can be shared between different generation
   types, support putting them in templates/

This restructure aligns with the recommendation from:
https://python-packaging.readthedocs.io/en/latest/non-code-files.html

Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Link: https://lore.kernel.org/462d90273f96804d3ba850474877d5f727031258.1751634289.git.namcao@linutronix.de
Reviewed-by: Gabriele Monaco <gmonaco@redhat.com>
Signed-off-by: Nam Cao <namcao@linutronix.de>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
14 files changed:
tools/verification/rvgen/Makefile
tools/verification/rvgen/dot2k_templates/Kconfig [deleted file]
tools/verification/rvgen/dot2k_templates/Kconfig_container [deleted file]
tools/verification/rvgen/dot2k_templates/main.c [deleted file]
tools/verification/rvgen/dot2k_templates/main_container.c [deleted file]
tools/verification/rvgen/dot2k_templates/main_container.h [deleted file]
tools/verification/rvgen/dot2k_templates/trace.h [deleted file]
tools/verification/rvgen/rvgen/dot2k.py
tools/verification/rvgen/rvgen/templates/Kconfig [new file with mode: 0644]
tools/verification/rvgen/rvgen/templates/container/Kconfig [new file with mode: 0644]
tools/verification/rvgen/rvgen/templates/container/main.c [new file with mode: 0644]
tools/verification/rvgen/rvgen/templates/container/main.h [new file with mode: 0644]
tools/verification/rvgen/rvgen/templates/dot2k/main.c [new file with mode: 0644]
tools/verification/rvgen/rvgen/templates/dot2k/trace.h [new file with mode: 0644]

index cea9c21c3bced83b4db2697ec92d817346516fba..8d08825e7e546d00354e3b7e94b7490a135b19ad 100644 (file)
@@ -3,7 +3,6 @@ INSTALL=install
 prefix  ?= /usr
 bindir  ?= $(prefix)/bin
 mandir  ?= $(prefix)/share/man
-miscdir ?= $(prefix)/share/rvgen
 srcdir  ?= $(prefix)/src
 
 PYLIB  ?= $(shell python3 -c 'import sysconfig;  print (sysconfig.get_path("purelib"))')
@@ -21,6 +20,4 @@ install:
        $(INSTALL) dot2c -D -m 755 $(DESTDIR)$(bindir)/
        $(INSTALL) rvgen/dot2k.py -D -m 644 $(DESTDIR)$(PYLIB)/rvgen/dot2k.py
        $(INSTALL) __main__.py -D -m 755 $(DESTDIR)$(bindir)/rvgen
-
-       mkdir -p ${miscdir}/
-       cp -rp dot2k_templates $(DESTDIR)$(miscdir)/
+       cp -rp rvgen/templates $(DESTDIR)$(PYLIB)/rvgen/
diff --git a/tools/verification/rvgen/dot2k_templates/Kconfig b/tools/verification/rvgen/dot2k_templates/Kconfig
deleted file mode 100644 (file)
index 291b29e..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-only
-#
-config RV_MON_%%MODEL_NAME_UP%%
-       depends on RV
-%%MONITOR_DEPS%%
-       select %%MONITOR_CLASS_TYPE%%
-       bool "%%MODEL_NAME%% monitor"
-       help
-         %%DESCRIPTION%%
diff --git a/tools/verification/rvgen/dot2k_templates/Kconfig_container b/tools/verification/rvgen/dot2k_templates/Kconfig_container
deleted file mode 100644 (file)
index a606111..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-config RV_MON_%%MODEL_NAME_UP%%
-       depends on RV
-       bool "%%MODEL_NAME%% monitor"
-       help
-         %%DESCRIPTION%%
diff --git a/tools/verification/rvgen/dot2k_templates/main.c b/tools/verification/rvgen/dot2k_templates/main.c
deleted file mode 100644 (file)
index 83044a2..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-#include <linux/ftrace.h>
-#include <linux/tracepoint.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/rv.h>
-#include <rv/instrumentation.h>
-#include <rv/da_monitor.h>
-
-#define MODULE_NAME "%%MODEL_NAME%%"
-
-/*
- * XXX: include required tracepoint headers, e.g.,
- * #include <trace/events/sched.h>
- */
-#include <rv_trace.h>
-%%INCLUDE_PARENT%%
-/*
- * This is the self-generated part of the monitor. Generally, there is no need
- * to touch this section.
- */
-#include "%%MODEL_NAME%%.h"
-
-/*
- * Declare the deterministic automata monitor.
- *
- * The rv monitor reference is needed for the monitor declaration.
- */
-static struct rv_monitor rv_%%MODEL_NAME%%;
-DECLARE_DA_MON_%%MONITOR_TYPE%%(%%MODEL_NAME%%, %%MIN_TYPE%%);
-
-/*
- * This is the instrumentation part of the monitor.
- *
- * This is the section where manual work is required. Here the kernel events
- * are translated into model's event.
- *
- */
-%%TRACEPOINT_HANDLERS_SKEL%%
-static int enable_%%MODEL_NAME%%(void)
-{
-       int retval;
-
-       retval = da_monitor_init_%%MODEL_NAME%%();
-       if (retval)
-               return retval;
-
-%%TRACEPOINT_ATTACH%%
-
-       return 0;
-}
-
-static void disable_%%MODEL_NAME%%(void)
-{
-       rv_%%MODEL_NAME%%.enabled = 0;
-
-%%TRACEPOINT_DETACH%%
-
-       da_monitor_destroy_%%MODEL_NAME%%();
-}
-
-/*
- * This is the monitor register section.
- */
-static struct rv_monitor rv_%%MODEL_NAME%% = {
-       .name = "%%MODEL_NAME%%",
-       .description = "%%DESCRIPTION%%",
-       .enable = enable_%%MODEL_NAME%%,
-       .disable = disable_%%MODEL_NAME%%,
-       .reset = da_monitor_reset_all_%%MODEL_NAME%%,
-       .enabled = 0,
-};
-
-static int __init register_%%MODEL_NAME%%(void)
-{
-       rv_register_monitor(&rv_%%MODEL_NAME%%, %%PARENT%%);
-       return 0;
-}
-
-static void __exit unregister_%%MODEL_NAME%%(void)
-{
-       rv_unregister_monitor(&rv_%%MODEL_NAME%%);
-}
-
-module_init(register_%%MODEL_NAME%%);
-module_exit(unregister_%%MODEL_NAME%%);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("dot2k: auto-generated");
-MODULE_DESCRIPTION("%%MODEL_NAME%%: %%DESCRIPTION%%");
diff --git a/tools/verification/rvgen/dot2k_templates/main_container.c b/tools/verification/rvgen/dot2k_templates/main_container.c
deleted file mode 100644 (file)
index 89fc17c..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/rv.h>
-
-#define MODULE_NAME "%%MODEL_NAME%%"
-
-#include "%%MODEL_NAME%%.h"
-
-struct rv_monitor rv_%%MODEL_NAME%%;
-
-struct rv_monitor rv_%%MODEL_NAME%% = {
-       .name = "%%MODEL_NAME%%",
-       .description = "%%DESCRIPTION%%",
-       .enable = NULL,
-       .disable = NULL,
-       .reset = NULL,
-       .enabled = 0,
-};
-
-static int __init register_%%MODEL_NAME%%(void)
-{
-       rv_register_monitor(&rv_%%MODEL_NAME%%, NULL);
-       return 0;
-}
-
-static void __exit unregister_%%MODEL_NAME%%(void)
-{
-       rv_unregister_monitor(&rv_%%MODEL_NAME%%);
-}
-
-module_init(register_%%MODEL_NAME%%);
-module_exit(unregister_%%MODEL_NAME%%);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("dot2k: auto-generated");
-MODULE_DESCRIPTION("%%MODEL_NAME%%: %%DESCRIPTION%%");
diff --git a/tools/verification/rvgen/dot2k_templates/main_container.h b/tools/verification/rvgen/dot2k_templates/main_container.h
deleted file mode 100644 (file)
index 0f6883a..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-
-extern struct rv_monitor rv_%%MODEL_NAME%%;
diff --git a/tools/verification/rvgen/dot2k_templates/trace.h b/tools/verification/rvgen/dot2k_templates/trace.h
deleted file mode 100644 (file)
index 87d3a13..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-
-/*
- * Snippet to be included in rv_trace.h
- */
-
-#ifdef CONFIG_RV_MON_%%MODEL_NAME_UP%%
-DEFINE_EVENT(event_%%MONITOR_CLASS%%, event_%%MODEL_NAME%%,
-%%TRACEPOINT_ARGS_SKEL_EVENT%%);
-
-DEFINE_EVENT(error_%%MONITOR_CLASS%%, error_%%MODEL_NAME%%,
-%%TRACEPOINT_ARGS_SKEL_ERROR%%);
-#endif /* CONFIG_RV_MON_%%MODEL_NAME_UP%% */
index e294624131943a4070ddd8b3788b908da52dca3a..a9ed97d0b224b0aeb26520983f8866ed0deaf935 100644 (file)
@@ -14,14 +14,16 @@ import os
 
 class dot2k(Dot2c):
     monitor_types = { "global" : 1, "per_cpu" : 2, "per_task" : 3 }
-    monitor_templates_dir = "rvgen/dot2k_templates/"
     rv_dir = "kernel/trace/rv"
     monitor_type = "per_cpu"
 
     def __init__(self, file_path, MonitorType, extra_params={}):
         self.container = extra_params.get("subcmd") == "container"
         self.parent = extra_params.get("parent")
-        self.__fill_rv_templates_dir()
+        if self.container:
+            self.abs_template_dir = os.path.join(os.path.dirname(__file__), "templates/container")
+        else:
+            self.abs_template_dir = os.path.join(os.path.dirname(__file__), "templates/dot2k")
 
         if self.container:
             if file_path:
@@ -33,9 +35,7 @@ class dot2k(Dot2c):
             self.name = extra_params.get("model_name")
             self.events = []
             self.states = []
-            self.main_c = self.__read_file(self.monitor_templates_dir + "main_container.c")
-            self.main_h = self.__read_file(self.monitor_templates_dir + "main_container.h")
-            self.kconfig = self.__read_file(self.monitor_templates_dir + "Kconfig_container")
+            self.main_h = self._read_template_file("main.h")
         else:
             super().__init__(file_path, extra_params.get("model_name"))
 
@@ -43,35 +43,16 @@ class dot2k(Dot2c):
             if self.monitor_type is None:
                 raise ValueError("Unknown monitor type: %s" % MonitorType)
             self.monitor_type = MonitorType
-            self.main_c = self.__read_file(self.monitor_templates_dir + "main.c")
-            self.trace_h = self.__read_file(self.monitor_templates_dir + "trace.h")
-            self.kconfig = self.__read_file(self.monitor_templates_dir + "Kconfig")
+            self.trace_h = self._read_template_file("trace.h")
+
+        self.main_c = self._read_template_file("main.c")
+        self.kconfig = self._read_template_file("Kconfig")
         self.enum_suffix = "_%s" % self.name
         self.description = extra_params.get("description", self.name) or "auto-generated"
         self.auto_patch = extra_params.get("auto_patch")
         if self.auto_patch:
             self.__fill_rv_kernel_dir()
 
-    def __fill_rv_templates_dir(self):
-
-        if os.path.exists(self.monitor_templates_dir):
-            return
-
-        if platform.system() != "Linux":
-            raise OSError("I can only run on Linux.")
-
-        kernel_path = "/lib/modules/%s/build/tools/verification/rvgen/dot2k_templates/" % (platform.release())
-
-        if os.path.exists(kernel_path):
-            self.monitor_templates_dir = kernel_path
-            return
-
-        if os.path.exists("/usr/share/rvgen/dot2k_templates/"):
-            self.monitor_templates_dir = "/usr/share/rvgen/dot2k_templates/"
-            return
-
-        raise FileNotFoundError("Could not find the template directory, do you have the kernel source installed?")
-
     def __fill_rv_kernel_dir(self):
 
         # first try if we are running in the kernel tree root
@@ -109,6 +90,16 @@ class dot2k(Dot2c):
         fd.close()
         return content
 
+    def _read_template_file(self, file):
+        try:
+            path = os.path.join(self.abs_template_dir, file)
+            return self.__read_file(path)
+        except Exception:
+            # Specific template file not found. Try the generic template file in the template/
+            # directory, which is one level up
+            path = os.path.join(self.abs_template_dir, "..", file)
+            return self.__read_file(path)
+
     def fill_monitor_type(self):
         return self.monitor_type.upper()
 
diff --git a/tools/verification/rvgen/rvgen/templates/Kconfig b/tools/verification/rvgen/rvgen/templates/Kconfig
new file mode 100644 (file)
index 0000000..291b29e
--- /dev/null
@@ -0,0 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+config RV_MON_%%MODEL_NAME_UP%%
+       depends on RV
+%%MONITOR_DEPS%%
+       select %%MONITOR_CLASS_TYPE%%
+       bool "%%MODEL_NAME%% monitor"
+       help
+         %%DESCRIPTION%%
diff --git a/tools/verification/rvgen/rvgen/templates/container/Kconfig b/tools/verification/rvgen/rvgen/templates/container/Kconfig
new file mode 100644 (file)
index 0000000..a606111
--- /dev/null
@@ -0,0 +1,5 @@
+config RV_MON_%%MODEL_NAME_UP%%
+       depends on RV
+       bool "%%MODEL_NAME%% monitor"
+       help
+         %%DESCRIPTION%%
diff --git a/tools/verification/rvgen/rvgen/templates/container/main.c b/tools/verification/rvgen/rvgen/templates/container/main.c
new file mode 100644 (file)
index 0000000..89fc17c
--- /dev/null
@@ -0,0 +1,38 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/rv.h>
+
+#define MODULE_NAME "%%MODEL_NAME%%"
+
+#include "%%MODEL_NAME%%.h"
+
+struct rv_monitor rv_%%MODEL_NAME%%;
+
+struct rv_monitor rv_%%MODEL_NAME%% = {
+       .name = "%%MODEL_NAME%%",
+       .description = "%%DESCRIPTION%%",
+       .enable = NULL,
+       .disable = NULL,
+       .reset = NULL,
+       .enabled = 0,
+};
+
+static int __init register_%%MODEL_NAME%%(void)
+{
+       rv_register_monitor(&rv_%%MODEL_NAME%%, NULL);
+       return 0;
+}
+
+static void __exit unregister_%%MODEL_NAME%%(void)
+{
+       rv_unregister_monitor(&rv_%%MODEL_NAME%%);
+}
+
+module_init(register_%%MODEL_NAME%%);
+module_exit(unregister_%%MODEL_NAME%%);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("dot2k: auto-generated");
+MODULE_DESCRIPTION("%%MODEL_NAME%%: %%DESCRIPTION%%");
diff --git a/tools/verification/rvgen/rvgen/templates/container/main.h b/tools/verification/rvgen/rvgen/templates/container/main.h
new file mode 100644 (file)
index 0000000..0f6883a
--- /dev/null
@@ -0,0 +1,3 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+extern struct rv_monitor rv_%%MODEL_NAME%%;
diff --git a/tools/verification/rvgen/rvgen/templates/dot2k/main.c b/tools/verification/rvgen/rvgen/templates/dot2k/main.c
new file mode 100644 (file)
index 0000000..83044a2
--- /dev/null
@@ -0,0 +1,91 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <linux/ftrace.h>
+#include <linux/tracepoint.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/rv.h>
+#include <rv/instrumentation.h>
+#include <rv/da_monitor.h>
+
+#define MODULE_NAME "%%MODEL_NAME%%"
+
+/*
+ * XXX: include required tracepoint headers, e.g.,
+ * #include <trace/events/sched.h>
+ */
+#include <rv_trace.h>
+%%INCLUDE_PARENT%%
+/*
+ * This is the self-generated part of the monitor. Generally, there is no need
+ * to touch this section.
+ */
+#include "%%MODEL_NAME%%.h"
+
+/*
+ * Declare the deterministic automata monitor.
+ *
+ * The rv monitor reference is needed for the monitor declaration.
+ */
+static struct rv_monitor rv_%%MODEL_NAME%%;
+DECLARE_DA_MON_%%MONITOR_TYPE%%(%%MODEL_NAME%%, %%MIN_TYPE%%);
+
+/*
+ * This is the instrumentation part of the monitor.
+ *
+ * This is the section where manual work is required. Here the kernel events
+ * are translated into model's event.
+ *
+ */
+%%TRACEPOINT_HANDLERS_SKEL%%
+static int enable_%%MODEL_NAME%%(void)
+{
+       int retval;
+
+       retval = da_monitor_init_%%MODEL_NAME%%();
+       if (retval)
+               return retval;
+
+%%TRACEPOINT_ATTACH%%
+
+       return 0;
+}
+
+static void disable_%%MODEL_NAME%%(void)
+{
+       rv_%%MODEL_NAME%%.enabled = 0;
+
+%%TRACEPOINT_DETACH%%
+
+       da_monitor_destroy_%%MODEL_NAME%%();
+}
+
+/*
+ * This is the monitor register section.
+ */
+static struct rv_monitor rv_%%MODEL_NAME%% = {
+       .name = "%%MODEL_NAME%%",
+       .description = "%%DESCRIPTION%%",
+       .enable = enable_%%MODEL_NAME%%,
+       .disable = disable_%%MODEL_NAME%%,
+       .reset = da_monitor_reset_all_%%MODEL_NAME%%,
+       .enabled = 0,
+};
+
+static int __init register_%%MODEL_NAME%%(void)
+{
+       rv_register_monitor(&rv_%%MODEL_NAME%%, %%PARENT%%);
+       return 0;
+}
+
+static void __exit unregister_%%MODEL_NAME%%(void)
+{
+       rv_unregister_monitor(&rv_%%MODEL_NAME%%);
+}
+
+module_init(register_%%MODEL_NAME%%);
+module_exit(unregister_%%MODEL_NAME%%);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("dot2k: auto-generated");
+MODULE_DESCRIPTION("%%MODEL_NAME%%: %%DESCRIPTION%%");
diff --git a/tools/verification/rvgen/rvgen/templates/dot2k/trace.h b/tools/verification/rvgen/rvgen/templates/dot2k/trace.h
new file mode 100644 (file)
index 0000000..87d3a13
--- /dev/null
@@ -0,0 +1,13 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+/*
+ * Snippet to be included in rv_trace.h
+ */
+
+#ifdef CONFIG_RV_MON_%%MODEL_NAME_UP%%
+DEFINE_EVENT(event_%%MONITOR_CLASS%%, event_%%MODEL_NAME%%,
+%%TRACEPOINT_ARGS_SKEL_EVENT%%);
+
+DEFINE_EVENT(error_%%MONITOR_CLASS%%, error_%%MODEL_NAME%%,
+%%TRACEPOINT_ARGS_SKEL_ERROR%%);
+#endif /* CONFIG_RV_MON_%%MODEL_NAME_UP%% */