qemu with hax to log dma reads & writes jcs.org/2018/11/12/vfio

trace: introduce a formal group name for trace events

The declarations in the generated-tracers.h file are
assuming there's only ever going to be one instance
of this header, as they are not namespaced. When we
have one header per event group, if a single source
file needs to include multiple sets of trace events,
the symbols will all clash.

This change thus introduces a '--group NAME' arg to the
'tracetool' program. This will cause all the symbols in
the generated header files to be given a unique namespace.

If no group is given, the group name 'common' is used,
which is suitable for the current usage where there is
only one global trace-events file used for code generation.

Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
Reviewed-by: Lluís Vilanova <vilanova@ac.upc.edu>
Message-id: 1475588159-30598-21-git-send-email-berrange@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>

authored by

Daniel P. Berrange and committed by
Stefan Hajnoczi
80dd5c49 0bc6484d

+73 -55
+14 -1
scripts/tracetool.py
··· 15 15 16 16 import sys 17 17 import getopt 18 + import os.path 19 + import re 18 20 19 21 from tracetool import error_write, out 20 22 import tracetool.backend ··· 60 62 else: 61 63 sys.exit(1) 62 64 65 + def make_group_name(filename): 66 + dirname = os.path.realpath(os.path.dirname(filename)) 67 + basedir = os.path.join(os.path.dirname(__file__), os.pardir) 68 + basedir = os.path.realpath(os.path.abspath(basedir)) 69 + dirname = dirname[len(basedir) + 1:] 70 + 71 + if dirname == "": 72 + return "common" 73 + return re.sub(r"/|-", "_", dirname) 63 74 64 75 def main(args): 65 76 global _SCRIPT ··· 134 145 with open(args[0], "r") as fh: 135 146 events = tracetool.read_events(fh) 136 147 148 + group = make_group_name(args[0]) 149 + 137 150 try: 138 - tracetool.generate(events, arg_format, arg_backends, 151 + tracetool.generate(events, group, arg_format, arg_backends, 139 152 binary=binary, probe_prefix=probe_prefix) 140 153 except tracetool.TracetoolError as e: 141 154 error_opt(str(e))
+4 -2
scripts/tracetool/__init__.py
··· 364 364 return False, None 365 365 366 366 367 - def generate(events, format, backends, 367 + def generate(events, group, format, backends, 368 368 binary=None, probe_prefix=None): 369 369 """Generate the output for the given (format, backends) pair. 370 370 ··· 372 372 ---------- 373 373 events : list 374 374 list of Event objects to generate for 375 + group: str 376 + Name of the tracing group 375 377 format : str 376 378 Output format name. 377 379 backends : list ··· 401 403 tracetool.backend.dtrace.BINARY = binary 402 404 tracetool.backend.dtrace.PROBEPREFIX = probe_prefix 403 405 404 - tracetool.format.generate(events, format, backend) 406 + tracetool.format.generate(events, format, backend, group)
+6 -6
scripts/tracetool/backend/__init__.py
··· 113 113 if func is not None: 114 114 func(*args, **kwargs) 115 115 116 - def generate_begin(self, events): 117 - self._run_function("generate_%s_begin", events) 116 + def generate_begin(self, events, group): 117 + self._run_function("generate_%s_begin", events, group) 118 118 119 - def generate(self, event): 120 - self._run_function("generate_%s", event) 119 + def generate(self, event, group): 120 + self._run_function("generate_%s", event, group) 121 121 122 - def generate_end(self, events): 123 - self._run_function("generate_%s_end", events) 122 + def generate_end(self, events, group): 123 + self._run_function("generate_%s_end", events, group)
+2 -2
scripts/tracetool/backend/dtrace.py
··· 35 35 return BINARY 36 36 37 37 38 - def generate_h_begin(events): 38 + def generate_h_begin(events, group): 39 39 out('#include "trace/generated-tracers-dtrace.h"', 40 40 '') 41 41 42 42 43 - def generate_h(event): 43 + def generate_h(event, group): 44 44 out(' QEMU_%(uppername)s(%(argnames)s);', 45 45 uppername=event.name.upper(), 46 46 argnames=", ".join(event.args.names()))
+2 -2
scripts/tracetool/backend/ftrace.py
··· 19 19 PUBLIC = True 20 20 21 21 22 - def generate_h_begin(events): 22 + def generate_h_begin(events, group): 23 23 out('#include "trace/ftrace.h"', 24 24 '') 25 25 26 26 27 - def generate_h(event): 27 + def generate_h(event, group): 28 28 argnames = ", ".join(event.args.names()) 29 29 if len(event.args) > 0: 30 30 argnames = ", " + argnames
+2 -2
scripts/tracetool/backend/log.py
··· 19 19 PUBLIC = True 20 20 21 21 22 - def generate_h_begin(events): 22 + def generate_h_begin(events, group): 23 23 out('#include "qemu/log.h"', 24 24 '') 25 25 26 26 27 - def generate_h(event): 27 + def generate_h(event, group): 28 28 argnames = ", ".join(event.args.names()) 29 29 if len(event.args) > 0: 30 30 argnames = ", " + argnames
+4 -4
scripts/tracetool/backend/simple.py
··· 27 27 return False 28 28 29 29 30 - def generate_h_begin(events): 30 + def generate_h_begin(events, group): 31 31 for event in events: 32 32 out('void _simple_%(api)s(%(args)s);', 33 33 api=event.api(), ··· 35 35 out('') 36 36 37 37 38 - def generate_h(event): 38 + def generate_h(event, group): 39 39 out(' _simple_%(api)s(%(args)s);', 40 40 api=event.api(), 41 41 args=", ".join(event.args.names())) 42 42 43 43 44 - def generate_c_begin(events): 44 + def generate_c_begin(events, group): 45 45 out('#include "qemu/osdep.h"', 46 46 '#include "trace.h"', 47 47 '#include "trace/control.h"', ··· 49 49 '') 50 50 51 51 52 - def generate_c(event): 52 + def generate_c(event, group): 53 53 out('void _simple_%(api)s(%(args)s)', 54 54 '{', 55 55 ' TraceBufferRecord rec;',
+2 -2
scripts/tracetool/backend/syslog.py
··· 19 19 PUBLIC = True 20 20 21 21 22 - def generate_h_begin(events): 22 + def generate_h_begin(events, group): 23 23 out('#include <syslog.h>', 24 24 '') 25 25 26 26 27 - def generate_h(event): 27 + def generate_h(event, group): 28 28 argnames = ", ".join(event.args.names()) 29 29 if len(event.args) > 0: 30 30 argnames = ", " + argnames
+2 -2
scripts/tracetool/backend/ust.py
··· 19 19 PUBLIC = True 20 20 21 21 22 - def generate_h_begin(events): 22 + def generate_h_begin(events, group): 23 23 out('#include <lttng/tracepoint.h>', 24 24 '#include "trace/generated-ust-provider.h"', 25 25 '') 26 26 27 27 28 - def generate_h(event): 28 + def generate_h(event, group): 29 29 argnames = ", ".join(event.args.names()) 30 30 if len(event.args) > 0: 31 31 argnames = ", " + argnames
+2 -2
scripts/tracetool/format/__init__.py
··· 74 74 return tracetool.try_import("tracetool.format." + name)[1] 75 75 76 76 77 - def generate(events, format, backend): 77 + def generate(events, format, backend, group): 78 78 if not exists(format): 79 79 raise ValueError("unknown format: %s" % format) 80 80 format = format.replace("-", "_") ··· 82 82 "generate")[1] 83 83 if func is None: 84 84 raise AttributeError("format has no 'generate': %s" % format) 85 - func(events, backend) 85 + func(events, backend, group)
+10 -8
scripts/tracetool/format/c.py
··· 16 16 from tracetool import out 17 17 18 18 19 - def generate(events, backend): 19 + def generate(events, backend, group): 20 20 active_events = [e for e in events 21 21 if "disable" not in e.properties] 22 22 ··· 47 47 sstate = "TRACE_%s_ENABLED" % e.name.upper(), 48 48 dstate = e.api(e.QEMU_DSTATE)) 49 49 50 - out('TraceEvent *trace_events[] = {') 50 + out('TraceEvent *%(group)s_trace_events[] = {', 51 + group = group.lower()) 51 52 52 53 for e in events: 53 54 out(' &%(event)s,', event = e.api(e.QEMU_EVENT)) ··· 56 57 '};', 57 58 '') 58 59 59 - out('static void trace_register_events(void)', 60 + out('static void trace_%(group)s_register_events(void)', 60 61 '{', 61 - ' trace_event_register_group(trace_events);', 62 + ' trace_event_register_group(%(group)s_trace_events);', 62 63 '}', 63 - 'trace_init(trace_register_events)') 64 + 'trace_init(trace_%(group)s_register_events)', 65 + group = group.lower()) 64 66 65 - backend.generate_begin(active_events) 67 + backend.generate_begin(active_events, group) 66 68 for event in active_events: 67 - backend.generate(event) 68 - backend.generate_end(active_events) 69 + backend.generate(event, group) 70 + backend.generate_end(active_events, group)
+1 -1
scripts/tracetool/format/d.py
··· 29 29 ) 30 30 31 31 32 - def generate(events, backend): 32 + def generate(events, backend, group): 33 33 events = [e for e in events 34 34 if "disable" not in e.properties] 35 35
+7 -7
scripts/tracetool/format/h.py
··· 16 16 from tracetool import out 17 17 18 18 19 - def generate(events, backend): 19 + def generate(events, backend, group): 20 20 out('/* This file is autogenerated by tracetool, do not edit. */', 21 21 '', 22 - '#ifndef TRACE__GENERATED_TRACERS_H', 23 - '#define TRACE__GENERATED_TRACERS_H', 22 + '#ifndef TRACE_%s_GENERATED_TRACERS_H' % group.upper(), 23 + '#define TRACE_%s_GENERATED_TRACERS_H' % group.upper(), 24 24 '', 25 25 '#include "qemu-common.h"', 26 26 '#include "trace/control.h"', ··· 46 46 enabled=enabled) 47 47 out('#define TRACE_%s_ENABLED %d' % (e.name.upper(), enabled)) 48 48 49 - backend.generate_begin(events) 49 + backend.generate_begin(events, group) 50 50 51 51 for e in events: 52 52 if "vcpu" in e.properties: ··· 68 68 cond=cond) 69 69 70 70 if "disable" not in e.properties: 71 - backend.generate(e) 71 + backend.generate(e, group) 72 72 73 73 out(' }', 74 74 '}') 75 75 76 - backend.generate_end(events) 76 + backend.generate_end(events, group) 77 77 78 - out('#endif /* TRACE__GENERATED_TRACERS_H */') 78 + out('#endif /* TRACE_%s_GENERATED_TRACERS_H */' % group.upper())
+1 -1
scripts/tracetool/format/simpletrace_stap.py
··· 19 19 from tracetool.format.stap import stap_escape 20 20 21 21 22 - def generate(events, backend): 22 + def generate(events, backend, group): 23 23 out('/* This file is autogenerated by tracetool, do not edit. */', 24 24 '', 25 25 'global event_name_to_id_map',
+1 -1
scripts/tracetool/format/stap.py
··· 34 34 return identifier 35 35 36 36 37 - def generate(events, backend): 37 + def generate(events, backend, group): 38 38 events = [e for e in events 39 39 if "disable" not in e.properties] 40 40
+4 -4
scripts/tracetool/format/tcg_h.py
··· 27 27 ]) 28 28 29 29 30 - def generate(events, backend): 30 + def generate(events, backend, group): 31 31 out('/* This file is autogenerated by tracetool, do not edit. */', 32 32 '/* You must include this file after the inclusion of helper.h */', 33 33 '', 34 - '#ifndef TRACE__GENERATED_TCG_TRACERS_H', 35 - '#define TRACE__GENERATED_TCG_TRACERS_H', 34 + '#ifndef TRACE_%s_GENERATED_TCG_TRACERS_H' % group.upper(), 35 + '#define TRACE_%s_GENERATED_TCG_TRACERS_H' % group.upper(), 36 36 '', 37 37 '#include "trace.h"', 38 38 '#include "exec/helper-proto.h"', ··· 63 63 out('}') 64 64 65 65 out('', 66 - '#endif /* TRACE__GENERATED_TCG_TRACERS_H */') 66 + '#endif /* TRACE_%s_GENERATED_TCG_TRACERS_H */' % group.upper())
+1 -1
scripts/tracetool/format/tcg_helper_c.py
··· 40 40 assert False 41 41 42 42 43 - def generate(events, backend): 43 + def generate(events, backend, group): 44 44 events = [e for e in events 45 45 if "disable" not in e.properties] 46 46
+1 -1
scripts/tracetool/format/tcg_helper_h.py
··· 18 18 import tracetool.vcpu 19 19 20 20 21 - def generate(events, backend): 21 + def generate(events, backend, group): 22 22 events = [e for e in events 23 23 if "disable" not in e.properties] 24 24
+1 -1
scripts/tracetool/format/tcg_helper_wrapper_h.py
··· 18 18 import tracetool.vcpu 19 19 20 20 21 - def generate(events, backend): 21 + def generate(events, backend, group): 22 22 events = [e for e in events 23 23 if "disable" not in e.properties] 24 24
+1 -1
scripts/tracetool/format/ust_events_c.py
··· 16 16 from tracetool import out 17 17 18 18 19 - def generate(events, backend): 19 + def generate(events, backend, group): 20 20 events = [e for e in events 21 21 if "disabled" not in e.properties] 22 22
+5 -4
scripts/tracetool/format/ust_events_h.py
··· 16 16 from tracetool import out 17 17 18 18 19 - def generate(events, backend): 19 + def generate(events, backend, group): 20 20 events = [e for e in events 21 21 if "disabled" not in e.properties] 22 22 ··· 28 28 '#undef TRACEPOINT_INCLUDE_FILE', 29 29 '#define TRACEPOINT_INCLUDE_FILE ./generated-ust-provider.h', 30 30 '', 31 - '#if !defined (TRACE__GENERATED_UST_H) || defined(TRACEPOINT_HEADER_MULTI_READ)', 32 - '#define TRACE__GENERATED_UST_H', 31 + '#if !defined (TRACE_%s_GENERATED_UST_H) || \\' % group.upper(), 32 + ' defined(TRACEPOINT_HEADER_MULTI_READ)', 33 + '#define TRACE_%s_GENERATED_UST_H' % group.upper(), 33 34 '', 34 35 '#include "qemu-common.h"', 35 36 '#include <lttng/tracepoint.h>', ··· 94 95 '', 95 96 name=e.name) 96 97 97 - out('#endif /* TRACE__GENERATED_UST_H */', 98 + out('#endif /* TRACE_%s_GENERATED_UST_H */' % group.upper(), 98 99 '', 99 100 '/* This part must be outside ifdef protection */', 100 101 '#include <lttng/tracepoint-event.h>')