Mesa (main): util/perf: add options to enable/disable tracepoints

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu May 26 07:42:20 UTC 2022


Module: Mesa
Branch: main
Commit: e1811af75d5b9385f9811724557a81570d0ef98e
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=e1811af75d5b9385f9811724557a81570d0ef98e

Author: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Date:   Sun May 22 15:49:56 2022 +0300

util/perf: add options to enable/disable tracepoints

We want to add more tracepoints for intel drivers. Having them all
enabled at the same time can be both costly and unreadable.

This allows a driver to specify an environment variable and values to
enable/disable tracepoints.

v2: s/TRACEPOINTS_ENABLES/TRACEPOINTS_TOGGLES/ (Danylo)
    s/config_name/toggle_name/

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Reviewed-by: Danylo Piliaiev <dpiliaiev at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16717>

---

 src/util/perf/u_trace.py | 89 ++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 83 insertions(+), 6 deletions(-)

diff --git a/src/util/perf/u_trace.py b/src/util/perf/u_trace.py
index 7647c2e512d..37a3d172569 100644
--- a/src/util/perf/u_trace.py
+++ b/src/util/perf/u_trace.py
@@ -27,11 +27,12 @@ from enum import IntEnum
 import os
 
 TRACEPOINTS = {}
+TRACEPOINTS_TOGGLES = {}
 
 class Tracepoint(object):
     """Class that represents all the information about a tracepoint
     """
-    def __init__(self, name, args=[],
+    def __init__(self, name, args=[], toggle_name=None,
                  tp_struct=None, tp_print=None, tp_perfetto=None,
                  end_of_pipe=False):
         """Parameters:
@@ -57,12 +58,23 @@ class Tracepoint(object):
         self.tp_print = tp_print
         self.tp_perfetto = tp_perfetto
         self.end_of_pipe = end_of_pipe
+        self.toggle_name = toggle_name
 
         TRACEPOINTS[name] = self
+        if toggle_name is not None and toggle_name not in TRACEPOINTS_TOGGLES:
+            TRACEPOINTS_TOGGLES[toggle_name] = len(TRACEPOINTS_TOGGLES)
 
     def can_generate_print(self):
         return self.args is not None and len(self.args) > 0
 
+    def enabled_expr(self, trace_toggle_name):
+        if trace_toggle_name is None:
+            return "true"
+        assert self.toggle_name is not None
+        return "({0} & {1}_{2})".format(trace_toggle_name,
+                                        trace_toggle_name.upper(),
+                                        self.toggle_name.upper())
+
 class TracepointArgStruct():
     """Represents struct that is being passed as an argument
     """
@@ -179,6 +191,18 @@ extern "C" {
 ${declaration.decl};
 % endfor
 
+% if trace_toggle_name is not None:
+enum ${trace_toggle_name.lower()} {
+%    for toggle_name, config_id in TRACEPOINTS_TOGGLES.items():
+   ${trace_toggle_name.upper()}_${toggle_name.upper()} = 1ull << ${config_id},
+%    endfor
+};
+
+extern uint64_t ${trace_toggle_name};
+
+void ${trace_toggle_name}_config_variable(void);
+% endif
+
 % for trace_name, trace in TRACEPOINTS.items():
 
 /*
@@ -228,9 +252,11 @@ static inline void trace_${trace_name}(
 %    endfor
 ) {
 %    if trace.tp_perfetto is not None:
-   if (!unlikely(ut->enabled || ut_trace_instrument || ut_perfetto_enabled))
+   if (!unlikely((ut->enabled || ut_trace_instrument || ut_perfetto_enabled) &&
+                 ${trace.enabled_expr(trace_toggle_name)}))
 %    else:
-   if (!unlikely(ut->enabled || ut_trace_instrument))
+   if (!unlikely((ut->enabled || ut_trace_instrument) &&
+                 ${trace.enabled_expr(trace_toggle_name)}))
 %    endif
       return;
    __trace_${trace_name}(
@@ -282,8 +308,42 @@ src_template = """\
 #include "${hdr}"
 
 #define __NEEDS_TRACE_PRIV
+#include "util/debug.h"
 #include "util/perf/u_trace_priv.h"
 
+% if trace_toggle_name is not None:
+static const struct debug_control config_control[] = {
+%    for toggle_name in TRACEPOINTS_TOGGLES.keys():
+   { "${toggle_name}", ${trace_toggle_name.upper()}_${toggle_name.upper()}, },
+%    endfor
+};
+uint64_t ${trace_toggle_name} = 0;
+
+static void
+${trace_toggle_name}_variable_once(void)
+{
+   uint64_t default_value = 0
+%    for name in trace_toggle_defaults:
+     | ${trace_toggle_name.upper()}_${name.upper()}
+%    endfor
+     ;
+
+   ${trace_toggle_name} =
+      parse_enable_string(getenv("${trace_toggle_name.upper()}"),
+                          default_value,
+                          config_control);
+}
+
+void
+${trace_toggle_name}_config_variable(void)
+{
+   static once_flag process_${trace_toggle_name}_variable_flag = ONCE_FLAG_INIT;
+
+   call_once(&process_${trace_toggle_name}_variable_flag,
+             ${trace_toggle_name}_variable_once);
+}
+% endif
+
 % for trace_name, trace in TRACEPOINTS.items():
 /*
  * ${trace_name}
@@ -379,7 +439,19 @@ void __trace_${trace_name}(
 % endfor
 """
 
-def utrace_generate(cpath, hpath, ctx_param, need_cs_param=True):
+def utrace_generate(cpath, hpath, ctx_param, need_cs_param=True,
+                    trace_toggle_name=None, trace_toggle_defaults=[]):
+    """Parameters:
+
+    - cpath: c file to generate.
+    - hpath: h file to generate.
+    - ctx_param: type of the first parameter to the perfetto vfuncs.
+    - need_cs_param: whether tracepoint functions need an additional cs
+      parameter.
+    - trace_toggle_name: (optional) name of the environment variable
+      enabling/disabling tracepoints.
+    - trace_toggle_defaults: (optional) list of tracepoints enabled by default.
+    """
     cs_param_value = 'NULL'
     if need_cs_param:
         cs_param_value = 'cs'
@@ -391,8 +463,11 @@ def utrace_generate(cpath, hpath, ctx_param, need_cs_param=True):
                 ctx_param=ctx_param,
                 need_cs_param=need_cs_param,
                 cs_param_value=cs_param_value,
+                trace_toggle_name=trace_toggle_name,
+                trace_toggle_defaults=trace_toggle_defaults,
                 HEADERS=[h for h in HEADERS if h.scope & HeaderScope.SOURCE],
-                TRACEPOINTS=TRACEPOINTS))
+                TRACEPOINTS=TRACEPOINTS,
+                TRACEPOINTS_TOGGLES=TRACEPOINTS_TOGGLES))
 
     if hpath is not None:
         hdr = os.path.basename(hpath)
@@ -401,9 +476,11 @@ def utrace_generate(cpath, hpath, ctx_param, need_cs_param=True):
                 hdrname=hdr.rstrip('.h').upper(),
                 ctx_param=ctx_param,
                 need_cs_param=need_cs_param,
+                trace_toggle_name=trace_toggle_name,
                 HEADERS=[h for h in HEADERS if h.scope & HeaderScope.HEADER],
                 FORWARD_DECLS=FORWARD_DECLS,
-                TRACEPOINTS=TRACEPOINTS))
+                TRACEPOINTS=TRACEPOINTS,
+                TRACEPOINTS_TOGGLES=TRACEPOINTS_TOGGLES))
 
 
 perfetto_utils_hdr_template = """\



More information about the mesa-commit mailing list