Patchwork trace: Provide a per-event status define for conditional compilation

login
register
mail settings
Submitter Lluís Vilanova
Date Sept. 21, 2011, 3:50 p.m.
Message ID <20110921155051.10212.14972.stgit@ginnungagap.bsc.es>
Download mbox | patch
Permalink /patch/115802/
State New
Headers show

Comments

Lluís Vilanova - Sept. 21, 2011, 3:50 p.m.
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>
---
 docs/tracing.txt  |   44 ++++++++++++++++++++++++++++++++++++++------
 scripts/tracetool |    8 +++++++-
 2 files changed, 45 insertions(+), 7 deletions(-)
Richard Henderson - Sept. 21, 2011, 5:59 p.m.
On 09/21/2011 08:50 AM, Lluís Vilanova wrote:
> +        void *complex = NULL;
> +        if (!size && !allow_zero_malloc()) {
> +            abort();
> +        }
> +        ptr = oom_check(malloc(size ? size : 1));
> +    #if trace_qemu_malloc_enabled
> +        /* some complex computations to produce the 'complex' value */
> +    #endif
> +        trace_qemu_malloc(size, ptr, complex);  /* <-- trace event */

That's just ugly.  Surely something like

    if (trace_qemu_malloc_enabled) {
        void *complex;
        /* some complex computations to produce the 'complex' value */
        trace_qemu_malloc(size, ptr, complex);
    }

be a better example to set.


r~
Lluís Vilanova - Sept. 21, 2011, 6:35 p.m.
Richard Henderson writes:

> On 09/21/2011 08:50 AM, Lluís Vilanova wrote:
>> +        void *complex = NULL;
>> +        if (!size && !allow_zero_malloc()) {
>> +            abort();
>> +        }
>> +        ptr = oom_check(malloc(size ? size : 1));
>> +    #if trace_qemu_malloc_enabled
>> +        /* some complex computations to produce the 'complex' value */
>> +    #endif
>> +        trace_qemu_malloc(size, ptr, complex);  /* <-- trace event */

> That's just ugly.  Surely something like

>     if (trace_qemu_malloc_enabled) {
>         void *complex;
>         /* some complex computations to produce the 'complex' value */
>         trace_qemu_malloc(size, ptr, complex);
>     }

> be a better example to set.

True XD

I'll send a new version, thanks.


Lluis

Patch

diff --git a/docs/tracing.txt b/docs/tracing.txt
index b36b54b..06ee19f 100644
--- a/docs/tracing.txt
+++ b/docs/tracing.txt
@@ -103,12 +103,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
@@ -229,3 +223,41 @@  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 guard such computations to avoid its
+compilation when the event is disabled:
+
+    #include "trace.h"  /* needed for trace event prototype */
+    
+    void *qemu_malloc(size_t size)
+    {
+        void *ptr;
+        void *complex = NULL;
+        if (!size && !allow_zero_malloc()) {
+            abort();
+        }
+        ptr = oom_check(malloc(size ? size : 1));
+    #if trace_qemu_malloc_enabled
+        /* some complex computations to produce the 'complex' value */
+    #endif
+        trace_qemu_malloc(size, ptr, complex);  /* <-- trace event */
+        return ptr;
+    }
diff --git a/scripts/tracetool b/scripts/tracetool
index 4c9951d..97f9f1b 100755
--- a/scripts/tracetool
+++ b/scripts/tracetool
@@ -519,7 +519,7 @@  linetostap_end_dtrace()
 # Process stdin by calling begin, line, and end functions for the backend
 convert()
 {
-    local begin process_line end str disable
+    local begin process_line end str name enabled
     begin="lineto$1_begin_$backend"
     process_line="lineto$1_$backend"
     end="lineto$1_end_$backend"
@@ -534,8 +534,14 @@  convert()
         # Process the line.  The nop backend handles disabled lines.
         if has_property "$str" "disable"; then
             "lineto$1_nop" "$str"
+            enabled=0
         else
             "$process_line" "$str"
+            enabled=1
+        fi
+        if [ "$1" = "h" ]; then
+            name=$(get_name "$str")
+            echo "#define trace_${name}_enabled ${enabled}"
         fi
     done