From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:41932) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RXy2J-0008A7-PV for qemu-devel@nongnu.org; Tue, 06 Dec 2011 11:38:32 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RXy2F-00082l-BW for qemu-devel@nongnu.org; Tue, 06 Dec 2011 11:38:31 -0500 Received: from gw.ac.upc.es ([147.83.30.3]:50306 helo=gw.ac.upc.edu) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RXy2E-0007wL-Vx for qemu-devel@nongnu.org; Tue, 06 Dec 2011 11:38:27 -0500 From: =?utf-8?b?TGx1w61z?= Vilanova Date: Tue, 06 Dec 2011 17:38:15 +0100 Message-ID: <20111206163815.9767.50412.stgit@ginnungagap.bsc.es> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH v2] trace: Provide a per-event status define for conditional compilation List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Blue Swirl , Richard Henderson 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 exec= ution 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" prope= rty by default, in order to avoid such costs on regular builds. Signed-off-by: Llu=C3=ADs Vilanova --- docs/tracing.txt | 46 ++++++++++++++++++++++++++++++++++++++++------ scripts/tracetool | 9 ++++++++- 2 files changed, 48 insertions(+), 7 deletions(-) diff --git a/docs/tracing.txt b/docs/tracing.txt index ea29f2c..a92716f 100644 --- a/docs/tracing.txt +++ b/docs/tracing.txt @@ -98,12 +98,6 @@ respectively. This ensures portability between 32- an= d 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= . =20 -5. If specific trace events are going to be called a huge number of time= s, 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 com= pile - time (using the "nop" backend). - =3D=3D Generic interface and monitor commands =3D=3D =20 You can programmatically query and control the dynamic state of trace ev= ents @@ -234,3 +228,43 @@ probes: --target-type system \ --target-arch x86_64 \ qemu.stp + +=3D=3D Trace event properties =3D=3D + +Each event in the "trace-events" file can be prefixed with a space-separ= ated +list of zero or more of the following event properties. + +=3D=3D=3D "disable" =3D=3D=3D + +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" b= ackend), +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}_ENAB= LED' to +guard such computations and avoid its compilation when the event is disa= bled: + + #include "trace.h" /* needed for trace event prototype */ + =20 + void *qemu_vmalloc(size_t size) + { + void *ptr; + size_t align =3D QEMU_VMALLOC_ALIGN; + =20 + if (size < align) { + align =3D getpagesize(); + } + ptr =3D 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 b/scripts/tracetool index 4c9951d..701b517 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 backen= d convert() { - local begin process_line end str disable + local begin process_line end str name NAME enabled begin=3D"lineto$1_begin_$backend" process_line=3D"lineto$1_$backend" end=3D"lineto$1_end_$backend" @@ -534,8 +534,15 @@ convert() # Process the line. The nop backend handles disabled lines. if has_property "$str" "disable"; then "lineto$1_nop" "$str" + enabled=3D0 else "$process_line" "$str" + enabled=3D1 + fi + if [ "$1" =3D "h" ]; then + name=3D$(get_name "$str") + NAME=3D$(echo $name | tr '[:lower:]' '[:upper:]') + echo "#define TRACE_${NAME}_ENABLED ${enabled}" fi done =20