qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [PATCH 2/2] trace: check backend dstate in trace_event_get_


From: Stefan Hajnoczi
Subject: [Qemu-devel] [PATCH 2/2] trace: check backend dstate in trace_event_get_state()
Date: Fri, 28 Jul 2017 10:20:53 +0100

Code that checks dstate is unaware of SystemTap and LTTng UST dstate, so
the following trace event will not fire when solely enabled by SystemTap
or LTTng UST:

  if (trace_event_get_state(TRACE_MY_EVENT)) {
      str = g_strdup_printf("Expensive string to generate ...",
                            ...);
      trace_my_event(str);
      g_free(str);
  }

Most users of trace_event_get_state() want to know both QEMU and backend
dstate for the event.  Update the macro to include backend dstate.

Introduce trace_event_get_state_qemu() for those callers who really only
want QEMU dstate.  This includes the trace backends (like 'log') which
should only trigger when event are enabled via QEMU.

Signed-off-by: Stefan Hajnoczi <address@hidden>
---
 trace/control.h                     | 20 ++++++++++++++++++--
 scripts/tracetool/backend/ftrace.py |  2 +-
 scripts/tracetool/backend/log.py    |  3 ++-
 scripts/tracetool/backend/simple.py |  2 +-
 scripts/tracetool/backend/syslog.py |  3 ++-
 5 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/trace/control.h b/trace/control.h
index b931824d60..b996c34c08 100644
--- a/trace/control.h
+++ b/trace/control.h
@@ -93,16 +93,32 @@ static bool trace_event_is_vcpu(TraceEvent *ev);
 static const char * trace_event_get_name(TraceEvent *ev);
 
 /**
+ * trace_event_get_state_qemu:
+ * @id: Event identifier name.
+ *
+ * Get the tracing state of an event, both static and the QEMU dynamic state.
+ * Note that some backends maintain their own dynamic state, use
+ * trace_event_get_state() instead if you wish to include it.
+ *
+ * If the event has the disabled property, the check will have no performance
+ * impact.
+ */
+#define trace_event_get_state_qemu(id)                       \
+    ((id ##_ENABLED) && trace_event_get_state_dynamic_by_id(id))
+
+/**
  * trace_event_get_state:
  * @id: Event identifier name.
  *
- * Get the tracing state of an event (both static and dynamic).
+ * Get the tracing state of an event (both static and dynamic).  Both QEMU and
+ * backend-specific dynamic state are included.
  *
  * If the event has the disabled property, the check will have no performance
  * impact.
  */
 #define trace_event_get_state(id)                       \
-    ((id ##_ENABLED) && trace_event_get_state_dynamic_by_id(id))
+    ((id ##_ENABLED) && (trace_event_get_state_dynamic_by_id(id) || \
+                         id ##_BACKEND_DSTATE()))
 
 /**
  * trace_event_get_vcpu_state:
diff --git a/scripts/tracetool/backend/ftrace.py 
b/scripts/tracetool/backend/ftrace.py
index dd0eda4441..fba637b376 100644
--- a/scripts/tracetool/backend/ftrace.py
+++ b/scripts/tracetool/backend/ftrace.py
@@ -33,7 +33,7 @@ def generate_h(event, group):
         '        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_qemu(%(event_id)s)) {',
         '            trlen = snprintf(ftrace_buf, MAX_TRACE_STRLEN,',
         '                             "%(name)s " %(fmt)s "\\n" 
%(argnames)s);',
         '            trlen = MIN(trlen, MAX_TRACE_STRLEN - 1);',
diff --git a/scripts/tracetool/backend/log.py b/scripts/tracetool/backend/log.py
index 54f0a69886..4562b9d12d 100644
--- a/scripts/tracetool/backend/log.py
+++ b/scripts/tracetool/backend/log.py
@@ -33,7 +33,8 @@ def generate_h(event, group):
         # 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_qemu(%s)" % \
+               ("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 f983670ee1..a39bbdc5c6 100644
--- a/scripts/tracetool/backend/simple.py
+++ b/scripts/tracetool/backend/simple.py
@@ -73,7 +73,7 @@ def generate_c(event, group):
         # already checked on the generic format code
         cond = "true"
     else:
-        cond = "trace_event_get_state(%s)" % event_id
+        cond = "trace_event_get_state_qemu(%s)" % event_id
 
     out('',
         '    if (!%(cond)s) {',
diff --git a/scripts/tracetool/backend/syslog.py 
b/scripts/tracetool/backend/syslog.py
index 1ce627f0fc..3ee07bf7fd 100644
--- a/scripts/tracetool/backend/syslog.py
+++ b/scripts/tracetool/backend/syslog.py
@@ -33,7 +33,8 @@ def generate_h(event, group):
         # 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_qemu(%s)" % \
+               ("TRACE_" + event.name.upper())
 
     out('    if (%(cond)s) {',
         '        syslog(LOG_INFO, "%(name)s " %(fmt)s %(argnames)s);',
-- 
2.13.3




reply via email to

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