Module: Mesa Branch: main Commit: e1811af75d5b9385f9811724557a81570d0ef98e URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=e1811af75d5b9385f9811724557a81570d0ef98e
Author: Lionel Landwerlin <[email protected]> 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 <[email protected]> Reviewed-by: Danylo Piliaiev <[email protected]> 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 = """\
