qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH for-2.8 v1 15/60] trace: introduce a formal group na


From: Daniel P. Berrange
Subject: [Qemu-devel] [PATCH for-2.8 v1 15/60] trace: introduce a formal group name for trace events
Date: Tue, 9 Aug 2016 16:31:43 +0100

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.

Signed-off-by: Daniel P. Berrange <address@hidden>
---
 hw/usb/hcd-ohci.c                                |  6 +++--
 scripts/tracetool.py                             | 10 ++++++--
 scripts/tracetool/__init__.py                    | 10 ++++++--
 scripts/tracetool/backend/__init__.py            | 12 ++++-----
 scripts/tracetool/backend/dtrace.py              |  4 +--
 scripts/tracetool/backend/ftrace.py              |  7 +++---
 scripts/tracetool/backend/log.py                 |  6 ++---
 scripts/tracetool/backend/simple.py              | 10 ++++----
 scripts/tracetool/backend/ust.py                 |  4 +--
 scripts/tracetool/format/__init__.py             |  4 +--
 scripts/tracetool/format/c.py                    | 23 +++++++++--------
 scripts/tracetool/format/d.py                    |  2 +-
 scripts/tracetool/format/h.py                    | 32 ++++++++++++------------
 scripts/tracetool/format/simpletrace_stap.py     |  2 +-
 scripts/tracetool/format/stap.py                 |  2 +-
 scripts/tracetool/format/tcg_h.py                |  2 +-
 scripts/tracetool/format/tcg_helper_c.py         |  2 +-
 scripts/tracetool/format/tcg_helper_h.py         |  2 +-
 scripts/tracetool/format/tcg_helper_wrapper_h.py |  2 +-
 scripts/tracetool/format/ust_events_c.py         |  2 +-
 scripts/tracetool/format/ust_events_h.py         |  8 +++---
 21 files changed, 85 insertions(+), 67 deletions(-)

diff --git a/hw/usb/hcd-ohci.c b/hw/usb/hcd-ohci.c
index 87508a7..43b5181 100644
--- a/hw/usb/hcd-ohci.c
+++ b/hw/usb/hcd-ohci.c
@@ -937,8 +937,10 @@ static int ohci_service_iso_td(OHCIState *ohci, struct 
ohci_ed *ed,
 #ifdef trace_event_get_state
 static void ohci_td_pkt(const char *msg, const uint8_t *buf, size_t len)
 {
-    bool print16 = !!trace_event_get_state(dstate, 
TRACE_USB_OHCI_TD_PKT_SHORT);
-    bool printall = !!trace_event_get_state(dstate, 
TRACE_USB_OHCI_TD_PKT_FULL);
+    bool print16 = !!trace_event_get_state(common_dstate,
+                                           TRACE_USB_OHCI_TD_PKT_SHORT);
+    bool printall = !!trace_event_get_state(common_dstate,
+                                            TRACE_USB_OHCI_TD_PKT_FULL);
     const int width = 16;
     int i;
     char tmp[3 * width + 1];
diff --git a/scripts/tracetool.py b/scripts/tracetool.py
index 7b82959..1ce8799 100755
--- a/scripts/tracetool.py
+++ b/scripts/tracetool.py
@@ -44,6 +44,7 @@ Options:
     --help                   This help message.
     --list-backends          Print list of available backends.
     --check-backends         Check if the given backend is valid.
+    --group <name>           Name of the event group
     --binary <path>          Full path to QEMU binary.
     --target-type <type>     QEMU emulator target type ('system' or 'user').
     --target-name <name>     QEMU emulator target name.
@@ -67,7 +68,8 @@ def main(args):
 
     long_opts = ["backends=", "format=", "help", "list-backends",
                  "check-backends"]
-    long_opts += ["binary=", "target-type=", "target-name=", "probe-prefix="]
+    long_opts += ["binary=", "target-type=", "target-name=", "probe-prefix=",
+                  "group="]
 
     try:
         opts, args = getopt.getopt(args[1:], "", long_opts)
@@ -81,6 +83,7 @@ def main(args):
     target_type = None
     target_name = None
     probe_prefix = None
+    group = None
     for opt, arg in opts:
         if opt == "--help":
             error_opt()
@@ -105,6 +108,8 @@ def main(args):
             target_name = arg
         elif opt == '--probe-prefix':
             probe_prefix = arg
+        elif opt == '--group':
+            group = arg
 
         else:
             error_opt("unhandled option: %s" % opt)
@@ -131,7 +136,8 @@ def main(args):
 
     try:
         tracetool.generate(sys.stdin, arg_format, arg_backends,
-                           binary=binary, probe_prefix=probe_prefix)
+                           binary=binary, probe_prefix=probe_prefix,
+                           group=group)
     except tracetool.TracetoolError as e:
         error_opt(str(e))
 
diff --git a/scripts/tracetool/__init__.py b/scripts/tracetool/__init__.py
index be24039..aebabaf 100644
--- a/scripts/tracetool/__init__.py
+++ b/scripts/tracetool/__init__.py
@@ -353,7 +353,8 @@ def try_import(mod_name, attr_name=None, attr_default=None):
 
 
 def generate(fevents, format, backends,
-             binary=None, probe_prefix=None):
+             binary=None, probe_prefix=None,
+             group=None):
     """Generate the output for the given (format, backends) pair.
 
     Parameters
@@ -368,6 +369,8 @@ def generate(fevents, format, backends,
         See tracetool.backend.dtrace.BINARY.
     probe_prefix : str or None
         See tracetool.backend.dtrace.PROBEPREFIX.
+    group: str
+        Name of the tracing group
     """
     # fix strange python error (UnboundLocalError tracetool)
     import tracetool
@@ -378,6 +381,9 @@ def generate(fevents, format, backends,
     if not tracetool.format.exists(format):
         raise TracetoolError("unknown format: %s" % format)
 
+    if group is None:
+        group = "common"
+
     if len(backends) is 0:
         raise TracetoolError("no backends specified")
     for backend in backends:
@@ -391,4 +397,4 @@ def generate(fevents, format, backends,
 
     events = _read_events(fevents)
 
-    tracetool.format.generate(events, format, backend)
+    tracetool.format.generate(events, format, backend, group)
diff --git a/scripts/tracetool/backend/__init__.py 
b/scripts/tracetool/backend/__init__.py
index d4b6dab..f735a25 100644
--- a/scripts/tracetool/backend/__init__.py
+++ b/scripts/tracetool/backend/__init__.py
@@ -113,11 +113,11 @@ class Wrapper:
             if func is not None:
                 func(*args, **kwargs)
 
-    def generate_begin(self, events):
-        self._run_function("generate_%s_begin", events)
+    def generate_begin(self, events, group):
+        self._run_function("generate_%s_begin", events, group)
 
-    def generate(self, event):
-        self._run_function("generate_%s", event)
+    def generate(self, event, group):
+        self._run_function("generate_%s", event, group)
 
-    def generate_end(self, events):
-        self._run_function("generate_%s_end", events)
+    def generate_end(self, events, group):
+        self._run_function("generate_%s_end", events, group)
diff --git a/scripts/tracetool/backend/dtrace.py 
b/scripts/tracetool/backend/dtrace.py
index ab9ecfa..79505c6 100644
--- a/scripts/tracetool/backend/dtrace.py
+++ b/scripts/tracetool/backend/dtrace.py
@@ -35,12 +35,12 @@ def binary():
     return BINARY
 
 
-def generate_h_begin(events):
+def generate_h_begin(events, group):
     out('#include "trace/generated-tracers-dtrace.h"',
         '')
 
 
-def generate_h(event):
+def generate_h(event, group):
     out('        QEMU_%(uppername)s(%(argnames)s);',
         uppername=event.name.upper(),
         argnames=", ".join(event.args.names()))
diff --git a/scripts/tracetool/backend/ftrace.py 
b/scripts/tracetool/backend/ftrace.py
index 80dcf30..9bda5f9 100644
--- a/scripts/tracetool/backend/ftrace.py
+++ b/scripts/tracetool/backend/ftrace.py
@@ -19,13 +19,13 @@ from tracetool import out
 PUBLIC = True
 
 
-def generate_h_begin(events):
+def generate_h_begin(events, group):
     out('#include "trace/ftrace.h"',
         '#include "trace/control.h"',
         '')
 
 
-def generate_h(event):
+def generate_h(event, group):
     argnames = ", ".join(event.args.names())
     if len(event.args) > 0:
         argnames = ", " + argnames
@@ -34,13 +34,14 @@ def generate_h(event):
         '            char ftrace_buf[MAX_TRACE_STRLEN];',
         '            int unused __attribute__ ((unused));',
         '            int trlen;',
-        '            if (trace_event_get_state(%(event_id)s)) {',
+        '            if (trace_event_get_state(%(group)s_dstate, 
%(event_id)s)) {',
         '                trlen = snprintf(ftrace_buf, MAX_TRACE_STRLEN,',
         '                                 "%(name)s " %(fmt)s "\\n" 
%(argnames)s);',
         '                trlen = MIN(trlen, MAX_TRACE_STRLEN - 1);',
         '                unused = write(trace_marker_fd, ftrace_buf, trlen);',
         '            }',
         '        }',
+        group=group.lower(),
         name=event.name,
         args=event.args,
         event_id="TRACE_" + event.name.upper(),
diff --git a/scripts/tracetool/backend/log.py b/scripts/tracetool/backend/log.py
index b3ff064..8438b83 100644
--- a/scripts/tracetool/backend/log.py
+++ b/scripts/tracetool/backend/log.py
@@ -19,13 +19,13 @@ from tracetool import out
 PUBLIC = True
 
 
-def generate_h_begin(events):
+def generate_h_begin(events, group):
     out('#include "trace/control.h"',
         '#include "qemu/log.h"',
         '')
 
 
-def generate_h(event):
+def generate_h(event, group):
     argnames = ", ".join(event.args.names())
     if len(event.args) > 0:
         argnames = ", " + argnames
@@ -34,7 +34,7 @@ def generate_h(event):
         # already checked on the generic format code
         cond = "true"
     else:
-        cond = "trace_event_get_state(%s)" % ("TRACE_" + event.name.upper())
+        cond = "trace_event_get_state(%s_dstate, %s)" % (group.lower(), 
"TRACE_" + event.name.upper())
 
     out('        if (%(cond)s) {',
         '            struct timeval _now;',
diff --git a/scripts/tracetool/backend/simple.py 
b/scripts/tracetool/backend/simple.py
index c2a8468..8c27b68 100644
--- a/scripts/tracetool/backend/simple.py
+++ b/scripts/tracetool/backend/simple.py
@@ -27,7 +27,7 @@ def is_string(arg):
         return False
 
 
-def generate_h_begin(events):
+def generate_h_begin(events, group):
     for event in events:
         out('void _simple_%(api)s(%(args)s);',
             api=event.api(),
@@ -35,13 +35,13 @@ def generate_h_begin(events):
     out('')
 
 
-def generate_h(event):
+def generate_h(event, group):
     out('        _simple_%(api)s(%(args)s);',
         api=event.api(),
         args=", ".join(event.args.names()))
 
 
-def generate_c_begin(events):
+def generate_c_begin(events, group):
     out('#include "qemu/osdep.h"',
         '#include "trace.h"',
         '#include "trace/control.h"',
@@ -49,7 +49,7 @@ def generate_c_begin(events):
         '')
 
 
-def generate_c(event):
+def generate_c(event, group):
     out('void _simple_%(api)s(%(args)s)',
         '{',
         '    TraceBufferRecord rec;',
@@ -73,7 +73,7 @@ def generate_c(event):
         # already checked on the generic format code
         cond = "true"
     else:
-        cond = "trace_event_get_state(dstate, %s)" % event_id
+        cond = "trace_event_get_state(%s_dstate, %s)" % (group.lower(), 
event_id)
 
     out('',
         '    if (!%(cond)s) {',
diff --git a/scripts/tracetool/backend/ust.py b/scripts/tracetool/backend/ust.py
index ed4c227..4594db6 100644
--- a/scripts/tracetool/backend/ust.py
+++ b/scripts/tracetool/backend/ust.py
@@ -19,13 +19,13 @@ from tracetool import out
 PUBLIC = True
 
 
-def generate_h_begin(events):
+def generate_h_begin(events, group):
     out('#include <lttng/tracepoint.h>',
         '#include "trace/generated-ust-provider.h"',
         '')
 
 
-def generate_h(event):
+def generate_h(event, group):
     argnames = ", ".join(event.args.names())
     if len(event.args) > 0:
         argnames = ", " + argnames
diff --git a/scripts/tracetool/format/__init__.py 
b/scripts/tracetool/format/__init__.py
index 812570f..cf6e0e2 100644
--- a/scripts/tracetool/format/__init__.py
+++ b/scripts/tracetool/format/__init__.py
@@ -74,7 +74,7 @@ def exists(name):
     return tracetool.try_import("tracetool.format." + name)[1]
 
 
-def generate(events, format, backend):
+def generate(events, format, backend, group):
     if not exists(format):
         raise ValueError("unknown format: %s" % format)
     format = format.replace("-", "_")
@@ -82,4 +82,4 @@ def generate(events, format, backend):
                                 "generate")[1]
     if func is None:
         raise AttributeError("format has no 'generate': %s" % format)
-    func(events, backend)
+    func(events, backend, group)
diff --git a/scripts/tracetool/format/c.py b/scripts/tracetool/format/c.py
index d496109..d98785d 100644
--- a/scripts/tracetool/format/c.py
+++ b/scripts/tracetool/format/c.py
@@ -16,7 +16,7 @@ __email__      = "address@hidden"
 from tracetool import out
 
 
-def generate(events, backend):
+def generate(events, backend, group):
     active_events = [e for e in events
                      if "disable" not in e.properties]
 
@@ -26,10 +26,10 @@ def generate(events, backend):
         '#include "trace.h"',
         '')
 
-    out('uint16_t dstate[TRACE_EVENT_COUNT];')
-    out('bool dstate_init[TRACE_EVENT_COUNT];')
+    out('uint16_t %s_dstate[TRACE_%s_EVENT_COUNT];' % (group.lower(), 
group.upper()))
+    out('bool %s_dstate_init[TRACE_%s_EVENT_COUNT];' % (group.lower(), 
group.upper()))
 
-    out('static TraceEvent trace_events[TRACE_EVENT_COUNT] = {')
+    out('static TraceEvent %s_trace_events[TRACE_%s_EVENT_COUNT] = {' % 
(group.lower(), group.upper()))
 
     for e in events:
         if "vcpu" in e.properties:
@@ -47,13 +47,16 @@ def generate(events, backend):
     out('};',
         '')
 
-    out('void trace_register_events(void)',
+    out('void trace_%s_register_events(void)' % group.lower(),
         '{',
-        '    trace_event_register_group(trace_events, TRACE_EVENT_COUNT, 
dstate, dstate_init);',
+        '    trace_event_register_group(%s_trace_events,' % group.lower(),
+        '                               TRACE_%s_EVENT_COUNT,' % group.upper(),
+        '                               %s_dstate,' % group.lower(),
+        '                               %s_dstate_init);' % group.lower(),
         '}',
-        'trace_init(trace_register_events)')
+        'trace_init(trace_%s_register_events)' % group.lower())
 
-    backend.generate_begin(active_events)
+    backend.generate_begin(active_events, group)
     for event in active_events:
-        backend.generate(event)
-    backend.generate_end(active_events)
+        backend.generate(event, group)
+    backend.generate_end(active_events, group)
diff --git a/scripts/tracetool/format/d.py b/scripts/tracetool/format/d.py
index c77d5b7..78397c2 100644
--- a/scripts/tracetool/format/d.py
+++ b/scripts/tracetool/format/d.py
@@ -29,7 +29,7 @@ RESERVED_WORDS = (
 )
 
 
-def generate(events, backend):
+def generate(events, backend, group):
     events = [e for e in events
               if "disable" not in e.properties]
 
diff --git a/scripts/tracetool/format/h.py b/scripts/tracetool/format/h.py
index 4b53ee2..25ffe2b 100644
--- a/scripts/tracetool/format/h.py
+++ b/scripts/tracetool/format/h.py
@@ -16,34 +16,34 @@ __email__      = "address@hidden"
 from tracetool import out
 
 
-def generate(events, backend):
+def generate(events, backend, group):
     out('/* This file is autogenerated by tracetool, do not edit. */',
         '',
-        '#ifndef TRACE__GENERATED_TRACERS_H',
-        '#define TRACE__GENERATED_TRACERS_H',
+        '#ifndef TRACE_%s_GENERATED_TRACERS_H' % group.upper(),
+        '#define TRACE_%s_GENERATED_TRACERS_H' % group.upper(),
         '',
         '#include "qemu-common.h"',
         '#include "trace/control.h"',
         '')
 
     # event identifiers
-    out('typedef enum {')
+    out('enum {')
 
     for e in events:
         out('    TRACE_%s,' % e.name.upper())
 
-    out('    TRACE_EVENT_COUNT',
-        '} TraceEventID;')
+    out('    TRACE_%s_EVENT_COUNT' % group.upper(),
+        '};')
 
     # per-vCPU event identifiers
-    out('typedef enum {')
+    out('enum {')
 
     for e in events:
         if "vcpu" in e.properties:
             out('    TRACE_VCPU_%s,' % e.name.upper())
 
-    out('    TRACE_VCPU_EVENT_COUNT',
-        '} TraceEventVCPUID;')
+    out('    TRACE_%s_VCPU_EVENT_COUNT' % group.upper(),
+        '};')
 
     # static state
     for e in events:
@@ -58,12 +58,12 @@ def generate(events, backend):
                 enabled=enabled)
         out('#define TRACE_%s_ENABLED %d' % (e.name.upper(), enabled))
 
-    out('extern uint16_t dstate[TRACE_EVENT_COUNT];')
-    out('extern bool dstate_init[TRACE_EVENT_COUNT];')
+    out('extern uint16_t %s_dstate[TRACE_%s_EVENT_COUNT];' % (group.lower(), 
group.upper()))
+    out('extern bool %s_dstate_init[TRACE_%s_EVENT_COUNT];' % (group.lower(), 
group.upper()))
 
-    out('void trace_register_events(void);')
+    out('void trace_%s_register_events(void);' % group.lower())
 
-    backend.generate_begin(events)
+    backend.generate_begin(events, group)
 
     for e in events:
         if "vcpu" in e.properties:
@@ -86,11 +86,11 @@ def generate(events, backend):
             cond=cond)
 
         if "disable" not in e.properties:
-            backend.generate(e)
+            backend.generate(e, group)
 
         out('    }',
             '}')
 
-    backend.generate_end(events)
+    backend.generate_end(events, group)
 
-    out('#endif /* TRACE__GENERATED_TRACERS_H */')
+    out('#endif /* TRACE_%s_GENERATED_TRACERS_H */' % group.upper())
diff --git a/scripts/tracetool/format/simpletrace_stap.py 
b/scripts/tracetool/format/simpletrace_stap.py
index 7e44bc1..c8b3850 100644
--- a/scripts/tracetool/format/simpletrace_stap.py
+++ b/scripts/tracetool/format/simpletrace_stap.py
@@ -19,7 +19,7 @@ from tracetool.backend.simple import is_string
 from tracetool.format.stap import stap_escape
 
 
-def generate(events, backend):
+def generate(events, backend, group):
     out('/* This file is autogenerated by tracetool, do not edit. */',
         '')
 
diff --git a/scripts/tracetool/format/stap.py b/scripts/tracetool/format/stap.py
index 9e780f1..e8ef3e7 100644
--- a/scripts/tracetool/format/stap.py
+++ b/scripts/tracetool/format/stap.py
@@ -34,7 +34,7 @@ def stap_escape(identifier):
     return identifier
 
 
-def generate(events, backend):
+def generate(events, backend, group):
     events = [e for e in events
               if "disable" not in e.properties]
 
diff --git a/scripts/tracetool/format/tcg_h.py 
b/scripts/tracetool/format/tcg_h.py
index e2331f2..628388a 100644
--- a/scripts/tracetool/format/tcg_h.py
+++ b/scripts/tracetool/format/tcg_h.py
@@ -27,7 +27,7 @@ def vcpu_transform_args(args):
     ])
 
 
-def generate(events, backend):
+def generate(events, backend, group):
     out('/* This file is autogenerated by tracetool, do not edit. */',
         '/* You must include this file after the inclusion of helper.h */',
         '',
diff --git a/scripts/tracetool/format/tcg_helper_c.py 
b/scripts/tracetool/format/tcg_helper_c.py
index e3485b7..cc26e03 100644
--- a/scripts/tracetool/format/tcg_helper_c.py
+++ b/scripts/tracetool/format/tcg_helper_c.py
@@ -40,7 +40,7 @@ def vcpu_transform_args(args, mode):
             assert False
 
 
-def generate(events, backend):
+def generate(events, backend, group):
     events = [e for e in events
               if "disable" not in e.properties]
 
diff --git a/scripts/tracetool/format/tcg_helper_h.py 
b/scripts/tracetool/format/tcg_helper_h.py
index dc76c15..6b184b6 100644
--- a/scripts/tracetool/format/tcg_helper_h.py
+++ b/scripts/tracetool/format/tcg_helper_h.py
@@ -18,7 +18,7 @@ from tracetool.transform import *
 import tracetool.vcpu
 
 
-def generate(events, backend):
+def generate(events, backend, group):
     events = [e for e in events
               if "disable" not in e.properties]
 
diff --git a/scripts/tracetool/format/tcg_helper_wrapper_h.py 
b/scripts/tracetool/format/tcg_helper_wrapper_h.py
index 020f442..ff53447 100644
--- a/scripts/tracetool/format/tcg_helper_wrapper_h.py
+++ b/scripts/tracetool/format/tcg_helper_wrapper_h.py
@@ -18,7 +18,7 @@ from tracetool.transform import *
 import tracetool.vcpu
 
 
-def generate(events, backend):
+def generate(events, backend, group):
     events = [e for e in events
               if "disable" not in e.properties]
 
diff --git a/scripts/tracetool/format/ust_events_c.py 
b/scripts/tracetool/format/ust_events_c.py
index 9967c7a..cd87d8a 100644
--- a/scripts/tracetool/format/ust_events_c.py
+++ b/scripts/tracetool/format/ust_events_c.py
@@ -16,7 +16,7 @@ __email__      = "address@hidden"
 from tracetool import out
 
 
-def generate(events, backend):
+def generate(events, backend, group):
     events = [e for e in events
               if "disabled" not in e.properties]
 
diff --git a/scripts/tracetool/format/ust_events_h.py 
b/scripts/tracetool/format/ust_events_h.py
index 3e8a7cd..00b69d9 100644
--- a/scripts/tracetool/format/ust_events_h.py
+++ b/scripts/tracetool/format/ust_events_h.py
@@ -16,7 +16,7 @@ __email__      = "address@hidden"
 from tracetool import out
 
 
-def generate(events, backend):
+def generate(events, backend, group):
     events = [e for e in events
               if "disabled" not in e.properties]
 
@@ -28,8 +28,8 @@ def generate(events, backend):
         '#undef TRACEPOINT_INCLUDE_FILE',
         '#define TRACEPOINT_INCLUDE_FILE ./generated-ust-provider.h',
         '',
-        '#if !defined (TRACE__GENERATED_UST_H) || 
defined(TRACEPOINT_HEADER_MULTI_READ)',
-        '#define TRACE__GENERATED_UST_H',
+        '#if !defined (TRACE_%s_GENERATED_UST_H) || 
defined(TRACEPOINT_HEADER_MULTI_READ)' % group.upper(),
+        '#define TRACE_%s_GENERATED_UST_H' % group.upper(),
         '',
         '#include "qemu-common.h"',
         '#include <lttng/tracepoint.h>',
@@ -94,7 +94,7 @@ def generate(events, backend):
                 '',
                 name=e.name)
 
-    out('#endif /* TRACE__GENERATED_UST_H */',
+    out('#endif /* TRACE_%s_GENERATED_UST_H */' % group.upper(),
         '',
         '/* This part must be outside ifdef protection */',
         '#include <lttng/tracepoint-event.h>')
-- 
2.7.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]