qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Harsh Prateek Bora <harsh@linux.vnet.ibm.com>
To: qemu-devel@nongnu.org
Cc: stefanha@gmail.com, vilanova@ac.upc.edu, aneesh.kumar@linux.vnet.ibm.com
Subject: [Qemu-devel] [RFC PATCH v4 10/14] trace: Provide a per-event status define for conditional compilation
Date: Wed, 15 Feb 2012 21:16:19 +0530	[thread overview]
Message-ID: <1329320783-6365-11-git-send-email-harsh@linux.vnet.ibm.com> (raw)
In-Reply-To: <1329320783-6365-1-git-send-email-harsh@linux.vnet.ibm.com>

From: Lluís Vilanova <vilanova@ac.upc.edu>

NOTE: This is a port of a patch in Stefanha's tracing tree to the new
pythonic tracetool version.

Adds a 'TRACE_${NAME}_ENABLED' preprocessor define for each tracing event
in "trace.h".

This lets the user conditionally compile code with a relatively high
execution cost that is only necessary when producing the tracing
information for an event that is enabled.

Note that events using this define will probably have the "disable"
property by default, in order to avoid such costs on regular builds.

Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu>
Signed-off-by: Harsh Prateek Bora <harsh@linux.vnet.ibm.com>
---
 docs/tracing.txt     |   50 ++++++++++++++++++++++++++++++++++++++++++--------
 scripts/tracetool.py |    7 +++++++
 2 files changed, 49 insertions(+), 8 deletions(-)

diff --git a/docs/tracing.txt b/docs/tracing.txt
index 95ca16c..ab9048c 100644
--- a/docs/tracing.txt
+++ b/docs/tracing.txt
@@ -39,12 +39,12 @@ generate code for the trace events.  Trace events are invoked directly from
 source code like this:
 
     #include "trace.h"  /* needed for trace event prototype */
-    
+
     void *qemu_vmalloc(size_t size)
     {
         void *ptr;
         size_t align = QEMU_VMALLOC_ALIGN;
-     
+
         if (size < align) {
             align = getpagesize();
         }
@@ -98,12 +98,6 @@ respectively.  This ensures portability between 32- and 64-bit platforms.
 4. Name trace events after their function.  If there are multiple trace events
    in one function, append a unique distinguisher at the end of the name.
 
-5. If specific trace events are going to be called a huge number of times, this
-   might have a noticeable performance impact even when the trace events are
-   programmatically disabled. In this case you should declare the trace event
-   with the "disable" property, which will effectively disable it at compile
-   time (using the "nop" backend).
-
 == Generic interface and monitor commands ==
 
 You can programmatically query and control the dynamic state of trace events
@@ -227,3 +221,43 @@ probes:
                       --target-type system \
                       --target-arch x86_64 \
                       <trace-events >qemu.stp
+
+== Trace event properties ==
+
+Each event in the "trace-events" file can be prefixed with a space-separated
+list of zero or more of the following event properties.
+
+=== "disable" ===
+
+If a specific trace event is going to be invoked a huge number of times, this
+might have a noticeable performance impact even when the event is
+programmatically disabled.
+
+In this case you should declare such event with the "disable" property. This
+will effectively disable the event at compile time (by using the "nop" backend),
+thus having no performance impact at all on regular builds (i.e., unless you
+edit the "trace-events" file).
+
+In addition, there might be cases where relatively complex computations must be
+performed to generate values that are only used as arguments for a trace
+function. In these cases you can use the macro 'TRACE_${EVENT_NAME}_ENABLED' to
+guard such computations and avoid its compilation when the event is disabled:
+
+    #include "trace.h"  /* needed for trace event prototype */
+
+    void *qemu_vmalloc(size_t size)
+    {
+        void *ptr;
+        size_t align = QEMU_VMALLOC_ALIGN;
+
+        if (size < align) {
+            align = getpagesize();
+        }
+        ptr = qemu_memalign(align, size);
+        if (TRACE_QEMU_VMALLOC_ENABLED) { /* preprocessor macro */
+            void *complex;
+            /* some complex computations to produce the 'complex' value */
+            trace_qemu_vmalloc(size, ptr, complex);
+        }
+        return ptr;
+    }
diff --git a/scripts/tracetool.py b/scripts/tracetool.py
index 947b808..dc93a1a 100755
--- a/scripts/tracetool.py
+++ b/scripts/tracetool.py
@@ -123,6 +123,13 @@ def trace_h_begin(events):
 
 @for_format("h", END)
 def trace_h_end(events):
+    for e in events:
+        if 'disable' in e.properties:
+            enabled = 0
+        else:
+            enabled = 1
+        print "#define TRACE_%s_ENABLED %d" % (e.name.upper(), enabled)
+    print
     print '#endif /* TRACE_H */'
 
 
-- 
1.7.1.1

  parent reply	other threads:[~2012-02-15 15:47 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-02-15 15:46 [Qemu-devel] [RFC PATCH v4 00/14] Tracing Improvements, Simpletrace v2 Harsh Prateek Bora
2012-02-15 15:46 ` [Qemu-devel] [RFC PATCH v4 01/14] Converting tracetool.sh to tracetool.py Harsh Prateek Bora
2012-02-15 15:46 ` [Qemu-devel] [RFC PATCH v4 02/14] trace: [tracetool] Do not rebuild event list in backend code Harsh Prateek Bora
2012-02-15 15:46 ` [Qemu-devel] [RFC PATCH v4 03/14] trace: [tracetool] Simplify event line parsing Harsh Prateek Bora
2012-02-15 15:46 ` [Qemu-devel] [RFC PATCH v4 04/14] trace: [tracetool] Do not precompute the event number Harsh Prateek Bora
2012-02-15 15:46 ` [Qemu-devel] [RFC PATCH v4 05/14] trace: [tracetool] Add support for event properties Harsh Prateek Bora
2012-02-15 15:46 ` [Qemu-devel] [RFC PATCH v4 06/14] trace: [tracetool] Process the "disable" event property Harsh Prateek Bora
2012-02-15 15:46 ` [Qemu-devel] [RFC PATCH v4 07/14] trace: [tracetool] Rewrite event argument parsing Harsh Prateek Bora
2012-02-15 15:46 ` [Qemu-devel] [RFC PATCH v4 08/14] trace: [tracetool] Make format-specific code optional with access to events Harsh Prateek Bora
2012-02-15 15:46 ` [Qemu-devel] [RFC PATCH v4 09/14] trace: [tracetool] Automatically establish available backends and formats Harsh Prateek Bora
2012-02-15 15:46 ` Harsh Prateek Bora [this message]
2012-02-15 15:46 ` [Qemu-devel] [RFC PATCH v4 11/14] trace: [tracetool] Add error-reporting functions Harsh Prateek Bora
2012-02-15 15:46 ` [Qemu-devel] [RFC PATCH v4 12/14] monitor: remove unused do_info_trace Harsh Prateek Bora
2012-02-15 15:46 ` [Qemu-devel] [RFC PATCH v4 13/14] Simpletrace v2: Handle var num of args, strings Harsh Prateek Bora
2012-02-15 15:46 ` [Qemu-devel] [RFC PATCH v4 14/14] simpletrace.py: Support for simpletrace v2 log format Harsh Prateek Bora
2012-02-28 20:23 ` [Qemu-devel] [RFC PATCH v4 00/14] Tracing Improvements, Simpletrace v2 Lluís Vilanova
2012-03-01  6:03   ` Harsh Bora
2012-03-01 13:30     ` Harsh Bora
2012-03-01 19:06       ` Lluís Vilanova

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1329320783-6365-11-git-send-email-harsh@linux.vnet.ibm.com \
    --to=harsh@linux.vnet.ibm.com \
    --cc=aneesh.kumar@linux.vnet.ibm.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@gmail.com \
    --cc=vilanova@ac.upc.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).