]> Git Repo - qemu.git/commitdiff
trace: add TRACE_<event>_BACKEND_DSTATE()
authorStefan Hajnoczi <[email protected]>
Mon, 31 Jul 2017 14:07:17 +0000 (15:07 +0100)
committerStefan Hajnoczi <[email protected]>
Tue, 1 Aug 2017 11:07:48 +0000 (12:07 +0100)
QEMU keeps track of trace event enabled/disabled state and provides
monitor commands to inspect and modify the "dstate".  SystemTap and
LTTng UST maintain independent enabled/disabled states for each trace
event, the other backends rely on QEMU dstate.

Introduce a new per-event macro that combines backend-specific dstate
like this:

  #define TRACE_MY_EVENT_BACKEND_DSTATE() ( \
      QEMU_MY_EVENT_ENABLED() || /* SystemTap */ \
      tracepoint_enabled(qemu, my_event) /* LTTng UST */ || \
      false)

This will be used to extend trace_event_get_state() in the next patch.

[Daniel Berrange pointed out that QEMU_MY_EVENT_ENABLED() must be true
by default, not false.  This way events will fire even if the DTrace
implementation does not implement the SystemTap semaphores feature.

Ubuntu Precise uses lttng-ust-dev 2.0.2 which does not have
tracepoint_enabled(), so we need a compatibility wrapper to keep Travis
builds passing.
--Stefan]

Signed-off-by: Stefan Hajnoczi <[email protected]>
Message-id: 20170731140718[email protected]
Signed-off-by: Stefan Hajnoczi <[email protected]>
fixup! trace: add TRACE_<event>_BACKEND_DSTATE()

scripts/tracetool/__init__.py
scripts/tracetool/backend/__init__.py
scripts/tracetool/backend/dtrace.py
scripts/tracetool/backend/ftrace.py
scripts/tracetool/backend/log.py
scripts/tracetool/backend/simple.py
scripts/tracetool/backend/syslog.py
scripts/tracetool/backend/ust.py
scripts/tracetool/format/h.py

index d4c204a4725cb06531eb9c35a234dff30283f5ab..0670ec17d598c4a2c63fc9b7141f30fb4869e1dc 100644 (file)
@@ -271,6 +271,7 @@ class Event(object):
     QEMU_TRACE_NOCHECK       = "_nocheck__" + QEMU_TRACE
     QEMU_TRACE_TCG           = QEMU_TRACE + "_tcg"
     QEMU_DSTATE              = "_TRACE_%(NAME)s_DSTATE"
+    QEMU_BACKEND_DSTATE      = "TRACE_%(NAME)s_BACKEND_DSTATE"
     QEMU_EVENT               = "_TRACE_%(NAME)s_EVENT"
 
     def api(self, fmt=None):
index f735a259c097fe08e9820d06e460b7e690f1af8c..259c6a6531c6ae25df4a86f57b5ab21d6b5be76f 100644 (file)
@@ -119,5 +119,8 @@ class Wrapper:
     def generate(self, event, group):
         self._run_function("generate_%s", event, group)
 
+    def generate_backend_dstate(self, event, group):
+        self._run_function("generate_%s_backend_dstate", event, group)
+
     def generate_end(self, events, group):
         self._run_function("generate_%s_end", events, group)
index c6812b70a256ce2c101cd4ce976b6a8f52bef969..c2f3a4e5a882cb3c6405bb197632e6c0acb3596d 100644 (file)
@@ -44,8 +44,20 @@ def generate_h_begin(events, group):
     out('#include "%s"' % header,
         '')
 
+    # SystemTap defines <provider>_<name>_ENABLED() but other DTrace
+    # implementations might not.
+    for e in events:
+        out('#ifndef QEMU_%(uppername)s_ENABLED',
+            '#define QEMU_%(uppername)s_ENABLED() true',
+            '#endif',
+            uppername=e.name.upper())
 
 def generate_h(event, group):
     out('    QEMU_%(uppername)s(%(argnames)s);',
         uppername=event.name.upper(),
         argnames=", ".join(event.args.names()))
+
+
+def generate_h_backend_dstate(event, group):
+    out('    QEMU_%(uppername)s_ENABLED() || \\',
+        uppername=event.name.upper())
index dd0eda44416042f3c465d9061c8a187bfe1f02fe..92f71b28f9473b7beae877d7fe003d9a480fd793 100644 (file)
@@ -45,3 +45,8 @@ def generate_h(event, group):
         event_id="TRACE_" + event.name.upper(),
         fmt=event.fmt.rstrip("\n"),
         argnames=argnames)
+
+
+def generate_h_backend_dstate(event, group):
+    out('    trace_event_get_state_dynamic_by_id(%(event_id)s) || \\',
+        event_id="TRACE_" + event.name.upper())
index 54f0a69886e90ff154f8e9ca640144708e300a27..da86f6b88213da5c4c85d3f7c6d13f8f552f85d6 100644 (file)
@@ -48,3 +48,8 @@ def generate_h(event, group):
         name=event.name,
         fmt=event.fmt.rstrip("\n"),
         argnames=argnames)
+
+
+def generate_h_backend_dstate(event, group):
+    out('    trace_event_get_state_dynamic_by_id(%(event_id)s) || \\',
+        event_id="TRACE_" + event.name.upper())
index f983670ee11a649c362394bff22f446c8b906243..c2fd1c24c4a9e38dbbe30d7d06f2ba4e23fcd86b 100644 (file)
@@ -42,6 +42,11 @@ def generate_h(event, group):
         args=", ".join(event.args.names()))
 
 
+def generate_h_backend_dstate(event, group):
+    out('    trace_event_get_state_dynamic_by_id(%(event_id)s) || \\',
+        event_id="TRACE_" + event.name.upper())
+
+
 def generate_c_begin(events, group):
     out('#include "qemu/osdep.h"',
         '#include "trace/control.h"',
index 1ce627f0fcaa7dc126f5f2cc638ca6c933960294..668fb73fee5361ec5b16c9dcef9b1c39958b00a7 100644 (file)
@@ -42,3 +42,8 @@ def generate_h(event, group):
         name=event.name,
         fmt=event.fmt.rstrip("\n"),
         argnames=argnames)
+
+
+def generate_h_backend_dstate(event, group):
+    out('    trace_event_get_state_dynamic_by_id(%(event_id)s) || \\',
+        event_id="TRACE_" + event.name.upper())
index 2adaf548d5cda11ef34def80d1ee96417fa3f1e5..280cb7c106528822fb63bcac0f1e29e94f111454 100644 (file)
@@ -27,6 +27,11 @@ def generate_h_begin(events, group):
 
     out('#include <lttng/tracepoint.h>',
         '#include "%s"' % header,
+        '',
+        '/* tracepoint_enabled() was introduced in LTTng UST 2.7 */',
+        '#ifndef tracepoint_enabled',
+        '#define tracepoint_enabled(a, b) true',
+        '#endif',
         '')
 
 
@@ -38,3 +43,8 @@ def generate_h(event, group):
     out('    tracepoint(qemu, %(name)s%(tp_args)s);',
         name=event.name,
         tp_args=argnames)
+
+
+def generate_h_backend_dstate(event, group):
+    out('    tracepoint_enabled(qemu, %(name)s) || \\',
+        name=event.name)
index aecf249d662ee52a352467fb08c72addabac2792..e06f0f27c52e875f56736c8246de9c13b828032f 100644 (file)
@@ -49,6 +49,16 @@ def generate(events, backend, group):
     backend.generate_begin(events, group)
 
     for e in events:
+        # tracer-specific dstate
+        out('',
+            '#define %(api)s() ( \\',
+            api=e.api(e.QEMU_BACKEND_DSTATE))
+
+        if "disable" not in e.properties:
+            backend.generate_backend_dstate(e, group)
+
+        out('    false)')
+
         # tracer without checks
         out('',
             'static inline void %(api)s(%(args)s)',
This page took 0.035653 seconds and 4 git commands to generate.