Merge remote-tracking branch 'stefanha/tracing' into staging
* stefanha/tracing: vga: add trace event for ppm_save console: add some trace events maintainers: Add docs/tracing.txt to Tracing docs: correct ./configure line in tracing.txt trace: make trace_thread_create() use its function arg tracetool: Omit useless QEMU_*_ENABLED() check trace: Provide a per-event status define for conditional compilation
This commit is contained in:
commit
cbedde0969
@ -548,6 +548,7 @@ Tracing
|
||||
M: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
|
||||
S: Maintained
|
||||
F: trace/
|
||||
F: docs/tracing.txt
|
||||
T: git://github.com/stefanha/qemu.git tracing
|
||||
|
||||
Checkpatch
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
@ -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 \
|
||||
<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;
|
||||
}
|
||||
|
2
hw/vga.c
2
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;
|
||||
|
@ -415,9 +415,7 @@ linetoh_dtrace()
|
||||
# Define an empty function for the trace event
|
||||
cat <<EOF
|
||||
static inline void trace_$name($args) {
|
||||
if (QEMU_${nameupper}_ENABLED()) {
|
||||
QEMU_${nameupper}($argnames);
|
||||
}
|
||||
QEMU_${nameupper}($argnames);
|
||||
}
|
||||
EOF
|
||||
}
|
||||
@ -519,7 +517,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 +532,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
|
||||
|
||||
|
@ -658,3 +658,10 @@ 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"
|
||||
|
||||
# vga.c
|
||||
ppm_save(const char *filename, void *display_surface) "%s surface=%p"
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user