From patchwork Fri Feb 10 11:49:44 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Llu=C3=ADs_Vilanova?= X-Patchwork-Id: 140583 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 020FFB6EEA for ; Fri, 10 Feb 2012 22:50:30 +1100 (EST) Received: from localhost ([::1]:47888 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RvozY-0005zE-Js for incoming@patchwork.ozlabs.org; Fri, 10 Feb 2012 06:50:16 -0500 Received: from eggs.gnu.org ([140.186.70.92]:52184) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RvozF-0005pB-Qy for qemu-devel@nongnu.org; Fri, 10 Feb 2012 06:49:58 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RvozC-0001jA-D2 for qemu-devel@nongnu.org; Fri, 10 Feb 2012 06:49:57 -0500 Received: from gw.ac.upc.edu ([147.83.30.3]:55474) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RvozB-0001io-Hu for qemu-devel@nongnu.org; Fri, 10 Feb 2012 06:49:54 -0500 Received: from localhost (unknown [10.8.0.22]) by gw.ac.upc.edu (Postfix) with ESMTP id 7BDA62D000D; Fri, 10 Feb 2012 12:49:52 +0100 (CET) To: qemu-devel@nongnu.org From: =?utf-8?b?TGx1w61z?= Vilanova Date: Fri, 10 Feb 2012 12:49:44 +0100 Message-ID: <20120210114944.5104.3041.stgit@ginnungagap.bsc.es> In-Reply-To: <20120210114849.5104.63589.stgit@ginnungagap.bsc.es> References: <20120210114849.5104.63589.stgit@ginnungagap.bsc.es> User-Agent: StGit/0.15 MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-Received-From: 147.83.30.3 Cc: stefanha@gmail.com, harsh@linux.vnet.ibm.com Subject: [Qemu-devel] [PATCH v3 10/11] trace: Provide a per-event status define for conditional compilation X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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 --- docs/tracing.txt | 46 ++++++++++++++++++++++++++++++++++++++++------ scripts/tracetool.py | 7 +++++++ 2 files changed, 47 insertions(+), 6 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- 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 @@ -234,3 +228,43 @@ probes: --target-type system \ --target-arch x86_64 \ 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 8ce39df..1134544 100755 --- a/scripts/tracetool.py +++ b/scripts/tracetool.py @@ -124,6 +124,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 */'