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