From b7d66a761f44a725352e19b64c587924647e6f83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Llu=C3=ADs=20Vilanova?= Date: Tue, 6 Dec 2011 17:38:15 +0100 Subject: [PATCH 1/7] trace: Provide a per-event status define for conditional compilation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Signed-off-by: Stefan Hajnoczi --- 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 ea29f2c222..a92716f319 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 b/scripts/tracetool index 4c9951d0aa..701b517ec1 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 NAME enabled begin="lineto$1_begin_$backend" process_line="lineto$1_$backend" end="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=0 else "$process_line" "$str" + enabled=1 + fi + if [ "$1" = "h" ]; then + name=$(get_name "$str") + NAME=$(echo $name | tr '[:lower:]' '[:upper:]') + echo "#define TRACE_${NAME}_ENABLED ${enabled}" fi done From bcec43324d02d586a8bc0c9093623636e870ad19 Mon Sep 17 00:00:00 2001 From: Stefan Hajnoczi Date: Tue, 27 Sep 2011 09:00:22 +0100 Subject: [PATCH 2/7] tracetool: Omit useless QEMU_*_ENABLED() check SystemTap provides a "semaphore" that can optionally be tested before executing a trace event. The purpose of this mechanism is to skip expensive tracing code when the trace event is disabled. For example, some applications may have trace events that format or convert strings for trace events. This expensive processing should only be done in the case where the trace event is enabled. Since QEMU's generated trace events never have such special-purpose code, there is no reason to add the semaphore check. Reviewed-by: Masami Hiramatsu Signed-off-by: Stefan Hajnoczi --- scripts/tracetool | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/scripts/tracetool b/scripts/tracetool index 701b517ec1..65bd0a1b4c 100755 --- a/scripts/tracetool +++ b/scripts/tracetool @@ -415,9 +415,7 @@ linetoh_dtrace() # Define an empty function for the trace event cat < Date: Thu, 8 Mar 2012 14:20:37 +0800 Subject: [PATCH 3/7] trace: make trace_thread_create() use its function arg This patch makes trace_thread_create() to use its function arg to initialize thread. The other choice is to make this a function to use void arg, but i prefer this way. Signed-off-by: Jun Koi Signed-off-by: Stefan Hajnoczi --- trace/simple.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trace/simple.c b/trace/simple.c index bbc99302b9..33ae48696d 100644 --- a/trace/simple.c +++ b/trace/simple.c @@ -363,7 +363,7 @@ static GThread *trace_thread_create(GThreadFunc fn) sigfillset(&set); pthread_sigmask(SIG_SETMASK, &set, &oldset); #endif - thread = g_thread_create(writeout_thread, NULL, FALSE, NULL); + thread = g_thread_create(fn, NULL, FALSE, NULL); #ifndef _WIN32 pthread_sigmask(SIG_SETMASK, &oldset, NULL); #endif From 324883aafed5163d7669358f8051fd85f805cf0d Mon Sep 17 00:00:00 2001 From: Jun Koi Date: Thu, 8 Mar 2012 16:24:52 +0800 Subject: [PATCH 4/7] docs: correct ./configure line in tracing.txt This patch corrects the configure's trace option in docs/tracing.txt. Signed-off-by: Jun Koi Signed-off-by: Stefan Hajnoczi --- docs/tracing.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tracing.txt b/docs/tracing.txt index a92716f319..c541133368 100644 --- a/docs/tracing.txt +++ b/docs/tracing.txt @@ -9,7 +9,7 @@ for debugging, profiling, and observing execution. 1. Build with the 'simple' trace backend: - ./configure --trace-backend=simple + ./configure --enable-trace-backend=simple make 2. Create a file with the events you want to trace: From f922ea46ba95596ffee0155712f8e243229ed583 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Date: Sat, 10 Mar 2012 13:37:34 +0100 Subject: [PATCH 5/7] maintainers: Add docs/tracing.txt to Tracing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The topic of whether and by whom docs/tracing.txt is maintained was brought up. It currently does not have an official maintainer. Add it to the tracing section so that Stefan gets cc'ed on patches. Signed-off-by: Andreas Färber Acked-by: Stefan Hajnoczi Cc: Peter Maydell Signed-off-by: Stefan Hajnoczi --- MAINTAINERS | 1 + 1 file changed, 1 insertion(+) diff --git a/MAINTAINERS b/MAINTAINERS index d249947d12..f83d07c2c4 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -548,6 +548,7 @@ Tracing M: Stefan Hajnoczi S: Maintained F: trace/ +F: docs/tracing.txt T: git://github.com/stefanha/qemu.git tracing Checkpatch From cdbc19dd8d2fd32d9a96401aaaed0c19da7896ca Mon Sep 17 00:00:00 2001 From: Alon Levy Date: Sun, 11 Mar 2012 18:11:26 +0200 Subject: [PATCH 6/7] console: add some trace events Signed-off-by: Alon Levy Signed-off-by: Stefan Hajnoczi --- console.h | 3 +++ trace-events | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/console.h b/console.h index a95b5812eb..4334db5ca5 100644 --- a/console.h +++ b/console.h @@ -5,6 +5,7 @@ #include "qdict.h" #include "notify.h" #include "monitor.h" +#include "trace.h" /* keyboard/mouse support */ @@ -202,11 +203,13 @@ static inline DisplaySurface* qemu_create_displaysurface(DisplayState *ds, int w static inline DisplaySurface* qemu_resize_displaysurface(DisplayState *ds, int width, int height) { + trace_displaysurface_resize(ds, ds->surface, width, height); return ds->allocator->resize_displaysurface(ds->surface, width, height); } static inline void qemu_free_displaysurface(DisplayState *ds) { + trace_displaysurface_free(ds, ds->surface); ds->allocator->free_displaysurface(ds->surface); } diff --git a/trace-events b/trace-events index c5d0f0f547..94c4a6fb5c 100644 --- a/trace-events +++ b/trace-events @@ -658,3 +658,7 @@ dma_aio_cancel(void *dbs) "dbs=%p" dma_complete(void *dbs, int ret, void *cb) "dbs=%p ret=%d cb=%p" dma_bdrv_cb(void *dbs, int ret) "dbs=%p ret=%d" dma_map_wait(void *dbs) "dbs=%p" + +# console.h +displaysurface_free(void *display_state, void *display_surface) "state=%p surface=%p" +displaysurface_resize(void *display_state, void *display_surface, int width, int height) "state=%p surface=%p %dx%d" From 727500181a2b2470a676e021205d170ede23beb7 Mon Sep 17 00:00:00 2001 From: Alon Levy Date: Sun, 11 Mar 2012 18:11:27 +0200 Subject: [PATCH 7/7] vga: add trace event for ppm_save Signed-off-by: Alon Levy Signed-off-by: Stefan Hajnoczi --- hw/vga.c | 2 ++ trace-events | 3 +++ 2 files changed, 5 insertions(+) diff --git a/hw/vga.c b/hw/vga.c index 5994f43b75..6dc98f6c2a 100644 --- a/hw/vga.c +++ b/hw/vga.c @@ -30,6 +30,7 @@ #include "pixel_ops.h" #include "qemu-timer.h" #include "xen.h" +#include "trace.h" //#define DEBUG_VGA //#define DEBUG_VGA_MEM @@ -2372,6 +2373,7 @@ int ppm_save(const char *filename, struct DisplaySurface *ds) int ret; char *linebuf, *pbuf; + trace_ppm_save(filename, ds); f = fopen(filename, "wb"); if (!f) return -1; diff --git a/trace-events b/trace-events index 94c4a6fb5c..dfe28ed42b 100644 --- a/trace-events +++ b/trace-events @@ -662,3 +662,6 @@ dma_map_wait(void *dbs) "dbs=%p" # console.h displaysurface_free(void *display_state, void *display_surface) "state=%p surface=%p" displaysurface_resize(void *display_state, void *display_surface, int width, int height) "state=%p surface=%p %dx%d" + +# vga.c +ppm_save(const char *filename, void *display_surface) "%s surface=%p"