* [Qemu-devel] Add support for SystemTAP and DTrace tracing backends (v6) @ 2010-11-12 13:20 Daniel P. Berrange 2010-11-12 13:20 ` [Qemu-devel] [PATCH 1/2] Add a DTrace tracing backend targetted for SystemTAP compatability Daniel P. Berrange ` (2 more replies) 0 siblings, 3 replies; 9+ messages in thread From: Daniel P. Berrange @ 2010-11-12 13:20 UTC (permalink / raw) To: qemu-devel An update of the SystemTAP/DTrace patches from http://lists.gnu.org/archive/html/qemu-devel/2010-11/msg00563.html The first patch contains the generic DTrace tracing backend support. The second patch contains additional pieces for SystemTAP to generate a tapset for each of the qemu-system-XXX binaries, to simplify life for admins wanting to use the tracing backend. Changed in v6: - Fix handling of probes with no-args in DTrace provider - Generate one tapset per target, for both system and user emulators - Re-write command line arg parsing in tracetool so it doesn't assume a particular ordering of args - Change '-s' to '--stap' in tracetool to avoid confusion - Pass full binary name into tracetool ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Qemu-devel] [PATCH 1/2] Add a DTrace tracing backend targetted for SystemTAP compatability 2010-11-12 13:20 [Qemu-devel] Add support for SystemTAP and DTrace tracing backends (v6) Daniel P. Berrange @ 2010-11-12 13:20 ` Daniel P. Berrange 2010-11-12 13:30 ` Stefan Hajnoczi 2010-11-12 13:20 ` [Qemu-devel] [PATCH 2/2] Add support for generating a systemtap tapset static probes Daniel P. Berrange 2010-11-15 10:51 ` [Qemu-devel] Add support for SystemTAP and DTrace tracing backends (v6) Stefan Hajnoczi 2 siblings, 1 reply; 9+ messages in thread From: Daniel P. Berrange @ 2010-11-12 13:20 UTC (permalink / raw) To: qemu-devel This introduces a new tracing backend that targets the SystemTAP implementation of DTrace userspace tracing. The core functionality should be applicable and standard across any DTrace implementation on Solaris, OS-X, *BSD, but the Makefile rules will likely need some small additional changes to cope with OS specific build requirements. This backend builds a little differently from the other tracing backends. Specifically there is no 'trace.c' file, because the 'dtrace' command line tool generates a '.o' file directly from the dtrace probe definition file. The probe definition is usually named with a '.d' extension but QEMU uses '.d' files for its external makefile dependancy tracking, so this uses '.dtrace' as the extension for the probe definition file. The 'tracetool' program gains the ability to generate a trace.h file for DTrace, and also to generate the trace.d file containing the dtrace probe definition. Example usage of a dtrace probe in systemtap looks like: probe process("qemu").mark("qemu_malloc") { printf("Malloc %d %p\n", $arg1, $arg2); } * .gitignore: Ignore trace-dtrace.* * Makefile: Extra rules for generating DTrace files * Makefile.obj: Don't build trace.o for DTrace, use trace-dtrace.o generated by 'dtrace' instead * tracetool: Support for generating DTrace data files Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- .gitignore | 2 + Makefile | 23 +++++++++++ Makefile.objs | 4 ++ configure | 14 ++++++- tracetool | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- 5 files changed, 154 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index a43e4d1..3efb4ec 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,8 @@ config-host.* config-target.* trace.h trace.c +trace-dtrace.h +trace-dtrace.dtrace *-timestamp *-softmmu *-darwin-user diff --git a/Makefile b/Makefile index 02698e9..554ad97 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,9 @@ # Makefile for QEMU. GENERATED_HEADERS = config-host.h trace.h qemu-options.def +ifeq ($(TRACE_BACKEND),dtrace) +GENERATED_HEADERS += trace-dtrace.h +endif ifneq ($(wildcard config-host.mak),) # Put the all: rule here so that config-host.mak can contain dependencies. @@ -108,7 +111,11 @@ ui/vnc.o: QEMU_CFLAGS += $(VNC_TLS_CFLAGS) bt-host.o: QEMU_CFLAGS += $(BLUEZ_CFLAGS) +ifeq ($(TRACE_BACKEND),dtrace) +trace.h: trace.h-timestamp trace-dtrace.h +else trace.h: trace.h-timestamp +endif trace.h-timestamp: $(SRC_PATH)/trace-events config-host.mak $(call quiet-command,sh $(SRC_PATH)/tracetool --$(TRACE_BACKEND) -h < $< > $@," GEN trace.h") @cmp -s $@ trace.h || cp $@ trace.h @@ -120,6 +127,20 @@ trace.c-timestamp: $(SRC_PATH)/trace-events config-host.mak trace.o: trace.c $(GENERATED_HEADERS) +trace-dtrace.h: trace-dtrace.dtrace + $(call quiet-command,dtrace -o $@ -h -s $<, " GEN trace-dtrace.h") + +# Normal practice is to name DTrace probe file with a '.d' extension +# but that gets picked up by QEMU's Makefile as an external dependancy +# rule file. So we use '.dtrace' instead +trace-dtrace.dtrace: trace-dtrace.dtrace-timestamp +trace-dtrace.dtrace-timestamp: $(SRC_PATH)/trace-events config-host.mak + $(call quiet-command,sh $(SRC_PATH)/tracetool --$(TRACE_BACKEND) -d < $< > $@," GEN trace-dtrace.dtrace") + @cmp -s $@ trace-dtrace.dtrace || cp $@ trace-dtrace.dtrace + +trace-dtrace.o: trace-dtrace.dtrace $(GENERATED_HEADERS) + $(call quiet-command,dtrace -o $@ -G -s $<, " GEN trace-dtrace.o") + simpletrace.o: simpletrace.c $(GENERATED_HEADERS) version.o: $(SRC_PATH)/version.rc config-host.mak @@ -157,6 +178,8 @@ clean: rm -f slirp/*.o slirp/*.d audio/*.o audio/*.d block/*.o block/*.d net/*.o net/*.d fsdev/*.o fsdev/*.d ui/*.o ui/*.d rm -f qemu-img-cmds.h rm -f trace.c trace.h trace.c-timestamp trace.h-timestamp + rm -f trace-dtrace.dtrace trace-dtrace.dtrace-timestamp + rm -f trace-dtrace.h trace-dtrace.h-timestamp $(MAKE) -C tests clean for d in $(ALL_SUBDIRS) libhw32 libhw64 libuser libdis libdis-user; do \ if test -d $$d; then $(MAKE) -C $$d $@ || exit 1; fi; \ diff --git a/Makefile.objs b/Makefile.objs index 15569af..23b17ce 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -286,11 +286,15 @@ libdis-$(CONFIG_SPARC_DIS) += sparc-dis.o ###################################################################### # trace +ifeq ($(TRACE_BACKEND),dtrace) +trace-obj-y = trace-dtrace.o +else trace-obj-y = trace.o ifeq ($(TRACE_BACKEND),simple) trace-obj-y += simpletrace.o user-obj-y += qemu-timer-common.o endif +endif vl.o: QEMU_CFLAGS+=$(GPROF_CFLAGS) diff --git a/configure b/configure index 7025d2b..f8dad3e 100755 --- a/configure +++ b/configure @@ -929,7 +929,7 @@ echo " --enable-docs enable documentation build" echo " --disable-docs disable documentation build" echo " --disable-vhost-net disable vhost-net acceleration support" echo " --enable-vhost-net enable vhost-net acceleration support" -echo " --trace-backend=B Trace backend nop simple ust" +echo " --trace-backend=B Trace backend nop simple ust dtrace" echo " --trace-file=NAME Full PATH,NAME of file to store traces" echo " Default:trace-<pid>" echo " --disable-spice disable spice" @@ -2193,6 +2193,18 @@ EOF exit 1 fi fi + +########################################## +# For 'dtrace' backend, test if 'dtrace' command is present +if test "$trace_backend" = "dtrace"; then + if ! has 'dtrace' ; then + echo + echo "Error: dtrace command is not found in PATH $PATH" + echo + exit 1 + fi +fi + ########################################## # End of CC checks # After here, no more $cc or $ld runs diff --git a/tracetool b/tracetool index 7010858..1ade103 100755 --- a/tracetool +++ b/tracetool @@ -20,10 +20,12 @@ Backends: --nop Tracing disabled --simple Simple built-in backend --ust LTTng User Space Tracing backend + --dtrace DTrace/SystemTAP backend Output formats: -h Generate .h file -c Generate .c file + -d Generate .d file (DTrace only) EOF exit 1 } @@ -46,8 +48,9 @@ get_args() # Get the argument name list of a trace event get_argnames() { - local nfields field name + local nfields field name sep nfields=0 + sep="$2" for field in $(get_args "$1"); do nfields=$((nfields + 1)) @@ -58,7 +61,7 @@ get_argnames() name=${field%,} test "$field" = "$name" && continue - printf "%s" "$name, " + printf "%s%s " $name $sep done # Last argument name @@ -73,7 +76,7 @@ get_argc() { local name argc argc=0 - for name in $(get_argnames "$1"); do + for name in $(get_argnames "$1", ","); do argc=$((argc + 1)) done echo $argc @@ -154,7 +157,7 @@ EOF cast_args_to_uint64_t() { local arg - for arg in $(get_argnames "$1"); do + for arg in $(get_argnames "$1", ","); do printf "%s" "(uint64_t)(uintptr_t)$arg" done } @@ -247,7 +250,7 @@ linetoh_ust() local name args argnames name=$(get_name "$1") args=$(get_args "$1") - argnames=$(get_argnames "$1") + argnames=$(get_argnames "$1", ",") cat <<EOF DECLARE_TRACE(ust_$name, TP_PROTO($args), TP_ARGS($argnames)); @@ -274,7 +277,7 @@ linetoc_ust() local name args argnames fmt name=$(get_name "$1") args=$(get_args "$1") - argnames=$(get_argnames "$1") + argnames=$(get_argnames "$1", ",") fmt=$(get_fmt "$1") cat <<EOF @@ -306,6 +309,93 @@ EOF echo "}" } +linetoh_begin_dtrace() +{ + cat <<EOF +#include "trace-dtrace.h" +EOF +} + +linetoh_dtrace() +{ + local name args argnames state nameupper + name=$(get_name "$1") + args=$(get_args "$1") + argnames=$(get_argnames "$1", ",") + state=$(get_state "$1") + if [ "$state" = "0" ] ; then + name=${name##disable } + fi + + nameupper=`echo $name | tr '[:lower:]' '[:upper:]'` + + # Define an empty function for the trace event + cat <<EOF +static inline void trace_$name($args) { + if (QEMU_${nameupper}_ENABLED()) { + QEMU_${nameupper}($argnames); + } +} +EOF +} + +linetoh_end_dtrace() +{ + return +} + +linetoc_begin_dtrace() +{ + return +} + +linetoc_dtrace() +{ + # No need for function definitions in dtrace backend + return +} + +linetoc_end_dtrace() +{ + return +} + +linetod_begin_dtrace() +{ + cat <<EOF +provider qemu { +EOF +} + +linetod_dtrace() +{ + local name args state + name=$(get_name "$1") + args=$(get_args "$1") + state=$(get_state "$1") + if [ "$state" = "0" ] ; then + name=${name##disable } + fi + + # DTrace provider syntax expects foo() for empty + # params, not foo(void) + if [ "$args" = "void" ]; then + args="" + fi + + # Define prototype for probe arguments + cat <<EOF + probe $name($args); +EOF +} + +linetod_end_dtrace() +{ + cat <<EOF +}; +EOF +} + # Process stdin by calling begin, line, and end functions for the backend convert() { @@ -324,9 +414,10 @@ convert() disable=${str%%disable *} echo if test -z "$disable"; then - # Pass the disabled state as an arg to lineto$1_simple(). - # For all other cases, call lineto$1_nop() - if [ $backend = "simple" ]; then + # Pass the disabled state as an arg for the simple + # or DTrace backends which handle it dynamically. + # For all other backends, call lineto$1_nop() + if [ $backend = "simple" -o "$backend" = "dtrace" ]; then "$process_line" "$str" else "lineto$1_nop" "${str##disable }" @@ -360,9 +451,19 @@ tracetoc() convert c } +tracetod() +{ + if [ $backend != "dtrace" ]; then + echo "DTrace probe generator not applicable to $backend backend" + exit 1 + fi + echo "/* This file is autogenerated by tracetool, do not edit. */" + convert d +} + # Choose backend case "$1" in -"--nop" | "--simple" | "--ust") backend="${1#--}" ;; +"--nop" | "--simple" | "--ust" | "--dtrace") backend="${1#--}" ;; *) usage ;; esac shift @@ -370,6 +471,7 @@ shift case "$1" in "-h") tracetoh ;; "-c") tracetoc ;; +"-d") tracetod ;; "--check-backend") exit 0 ;; # used by ./configure to test for backend *) usage ;; esac -- 1.7.2.3 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] Add a DTrace tracing backend targetted for SystemTAP compatability 2010-11-12 13:20 ` [Qemu-devel] [PATCH 1/2] Add a DTrace tracing backend targetted for SystemTAP compatability Daniel P. Berrange @ 2010-11-12 13:30 ` Stefan Hajnoczi 0 siblings, 0 replies; 9+ messages in thread From: Stefan Hajnoczi @ 2010-11-12 13:30 UTC (permalink / raw) To: Daniel P. Berrange; +Cc: qemu-devel On Fri, Nov 12, 2010 at 1:20 PM, Daniel P. Berrange <berrange@redhat.com> wrote: > This introduces a new tracing backend that targets the SystemTAP > implementation of DTrace userspace tracing. The core functionality > should be applicable and standard across any DTrace implementation > on Solaris, OS-X, *BSD, but the Makefile rules will likely need > some small additional changes to cope with OS specific build > requirements. > > This backend builds a little differently from the other tracing > backends. Specifically there is no 'trace.c' file, because the > 'dtrace' command line tool generates a '.o' file directly from > the dtrace probe definition file. The probe definition is usually > named with a '.d' extension but QEMU uses '.d' files for its > external makefile dependancy tracking, so this uses '.dtrace' as > the extension for the probe definition file. > > The 'tracetool' program gains the ability to generate a trace.h > file for DTrace, and also to generate the trace.d file containing > the dtrace probe definition. > > Example usage of a dtrace probe in systemtap looks like: > > probe process("qemu").mark("qemu_malloc") { > printf("Malloc %d %p\n", $arg1, $arg2); > } > > * .gitignore: Ignore trace-dtrace.* > * Makefile: Extra rules for generating DTrace files > * Makefile.obj: Don't build trace.o for DTrace, use > trace-dtrace.o generated by 'dtrace' instead > * tracetool: Support for generating DTrace data files > > Signed-off-by: Daniel P. Berrange <berrange@redhat.com> > --- > .gitignore | 2 + > Makefile | 23 +++++++++++ > Makefile.objs | 4 ++ > configure | 14 ++++++- > tracetool | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- > 5 files changed, 154 insertions(+), 11 deletions(-) Reviewed-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Qemu-devel] [PATCH 2/2] Add support for generating a systemtap tapset static probes 2010-11-12 13:20 [Qemu-devel] Add support for SystemTAP and DTrace tracing backends (v6) Daniel P. Berrange 2010-11-12 13:20 ` [Qemu-devel] [PATCH 1/2] Add a DTrace tracing backend targetted for SystemTAP compatability Daniel P. Berrange @ 2010-11-12 13:20 ` Daniel P. Berrange 2010-11-12 13:53 ` Stefan Hajnoczi 2010-11-15 10:51 ` [Qemu-devel] Add support for SystemTAP and DTrace tracing backends (v6) Stefan Hajnoczi 2 siblings, 1 reply; 9+ messages in thread From: Daniel P. Berrange @ 2010-11-12 13:20 UTC (permalink / raw) To: qemu-devel This introduces generation of a qemu.stp/qemu-system-XXX.stp files which provides tapsets with friendly names for static probes & their arguments. Instead of probe process("qemu").mark("qemu_malloc") { printf("Malloc %d %p\n", $arg1, $arg2); } It is now possible todo probe qemu.system.i386.qemu_malloc { printf("Malloc %d %p\n", size, ptr); } There is one tapset defined per target arch, for both user and system emulators. * Makefile.target: Generate stp files for each target * tracetool: Support for generating systemtap tapsets * configure: Check for whether systemtap is available with the DTrace backend Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- Makefile.target | 29 ++++++++++++- configure | 7 +++ tracetool | 128 +++++++++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 146 insertions(+), 18 deletions(-) diff --git a/Makefile.target b/Makefile.target index 91e6e74..7c3671c 100644 --- a/Makefile.target +++ b/Makefile.target @@ -40,7 +40,27 @@ kvm.o kvm-all.o vhost.o vhost_net.o: QEMU_CFLAGS+=$(KVM_CFLAGS) config-target.h: config-target.h-timestamp config-target.h-timestamp: config-target.mak -all: $(PROGS) +ifdef CONFIG_SYSTEMTAP_TRACE +stap: $(QEMU_PROG).stp + +ifdef CONFIG_USER_ONLY +TARGET_TYPE=user +else +TARGET_TYPE=system +endif + +$(QEMU_PROG).stp: + $(call quiet-command,sh $(SRC_PATH)/tracetool \ + --$(TRACE_BACKEND) \ + --binary $(bindir)/$(QEMU_PROG) \ + --target-arch $(TARGET_ARCH) \ + --target-type $(TARGET_TYPE) \ + --stap < $(SRC_PATH)/trace-events > $(QEMU_PROG).stp," GEN $(QEMU_PROG).stp") +else +stap: +endif + +all: $(PROGS) stap # Dummy command so that make thinks it has done something @true @@ -340,6 +360,9 @@ clean: rm -f *.o *.a *~ $(PROGS) nwfpe/*.o fpu/*.o rm -f *.d */*.d tcg/*.o ide/*.o rm -f hmp-commands.h qmp-commands.h gdbstub-xml.c +ifdef CONFIG_SYSTEMTAP_TRACE + rm -f *.stp +endif install: all ifneq ($(PROGS),) @@ -348,6 +371,10 @@ ifneq ($(STRIP),) $(STRIP) $(patsubst %,"$(DESTDIR)$(bindir)/%",$(PROGS)) endif endif +ifdef CONFIG_SYSTEMTAP_TRACE + $(INSTALL_DIR) "$(DESTDIR)$(datadir)/../systemtap/tapset" + $(INSTALL_DATA) $(QEMU_PROG).stp "$(DESTDIR)$(datadir)/../systemtap/tapset" +endif # Include automatically generated dependency files -include $(wildcard *.d */*.d) diff --git a/configure b/configure index f8dad3e..2917874 100755 --- a/configure +++ b/configure @@ -2203,6 +2203,10 @@ if test "$trace_backend" = "dtrace"; then echo exit 1 fi + trace_backend_stap="no" + if has 'stap' ; then + trace_backend_stap="yes" + fi fi ########################################## @@ -2645,6 +2649,9 @@ fi if test "$trace_backend" = "simple"; then trace_file="\"$trace_file-%u\"" fi +if test "$trace_backend" = "dtrace" -a "$trace_backend_stap" = "yes" ; then + echo "CONFIG_SYSTEMTAP_TRACE=y" >> $config_host_mak +fi echo "CONFIG_TRACE_FILE=$trace_file" >> $config_host_mak echo "TOOLS=$tools" >> $config_host_mak diff --git a/tracetool b/tracetool index 1ade103..fce491c 100755 --- a/tracetool +++ b/tracetool @@ -23,9 +23,16 @@ Backends: --dtrace DTrace/SystemTAP backend Output formats: - -h Generate .h file - -c Generate .c file - -d Generate .d file (DTrace only) + -h Generate .h file + -c Generate .c file + -d Generate .d file (DTrace only) + --stap Generate .stp file (DTrace with SystemTAP only) + +Options: + --binary [path] Full path to QEMU binary + --target-arch [arch] QEMU emulator target arch + --target-type [type] QEMU emulator target type ('system' or 'user') + EOF exit 1 } @@ -396,6 +403,51 @@ linetod_end_dtrace() EOF } +linetostap_begin_dtrace() +{ + return +} + +linetostap_dtrace() +{ + local i arg name args arglist state + name=$(get_name "$1") + args=$(get_args "$1") + arglist=$(get_argnames "$1", "") + state=$(get_state "$1") + if [ "$state" = "0" ] ; then + name=${name##disable } + fi + + # Define prototype for probe arguments + cat <<EOF +probe qemu.$targettype.$targetarch.$name = process("$binary").mark("$name") +{ +EOF + + i=1 + for arg in $arglist + do + # 'limit' is a reserved keyword + if [ "$arg" = "limit" ]; then + arg="_limit" + fi + cat <<EOF + $arg = \$arg$i; +EOF + i="$((i+1))" + done + + cat <<EOF +} +EOF +} + +linetostap_end_dtrace() +{ + return +} + # Process stdin by calling begin, line, and end functions for the backend convert() { @@ -461,19 +513,61 @@ tracetod() convert d } -# Choose backend -case "$1" in -"--nop" | "--simple" | "--ust" | "--dtrace") backend="${1#--}" ;; -*) usage ;; -esac -shift - -case "$1" in -"-h") tracetoh ;; -"-c") tracetoc ;; -"-d") tracetod ;; -"--check-backend") exit 0 ;; # used by ./configure to test for backend -*) usage ;; -esac +tracetostap() +{ + if [ $backend != "dtrace" ]; then + echo "SystemTAP tapset generator not applicable to $backend backend" + exit 1 + fi + if [ -z "$binary" ]; then + echo "--binary is required for SystemTAP tapset generator" + exit 1 + fi + if [ -z "$targettype" ]; then + echo "--target-type is required for SystemTAP tapset generator" + exit 1 + fi + if [ -z "$targetarch" ]; then + echo "--target-arch is required for SystemTAP tapset generator" + exit 1 + fi + echo "/* This file is autogenerated by tracetool, do not edit. */" + convert stap +} + + +backend= +output= +binary= +targettype= +targetarch= + + +until [ -z "$1" ] +do + case "$1" in + "--nop" | "--simple" | "--ust" | "--dtrace") backend="${1#--}" ;; + + "--binary") shift ; binary="$1" ;; + "--target-arch") shift ; targetarch="$1" ;; + "--target-type") shift ; targettype="$1" ;; + + "-h" | "-c" | "-d") output="${1#-}" ;; + "--stap") output="${1#--}" ;; + + "--check-backend") exit 0 ;; # used by ./configure to test for backend + + *) + usage;; + esac + shift +done + +if [ "$backend" = "" -o "$output" = "" ]; then + usage +fi + +gen="traceto$output" +"$gen" exit 0 -- 1.7.2.3 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PATCH 2/2] Add support for generating a systemtap tapset static probes 2010-11-12 13:20 ` [Qemu-devel] [PATCH 2/2] Add support for generating a systemtap tapset static probes Daniel P. Berrange @ 2010-11-12 13:53 ` Stefan Hajnoczi 0 siblings, 0 replies; 9+ messages in thread From: Stefan Hajnoczi @ 2010-11-12 13:53 UTC (permalink / raw) To: Daniel P. Berrange; +Cc: qemu-devel On Fri, Nov 12, 2010 at 1:20 PM, Daniel P. Berrange <berrange@redhat.com> wrote: > This introduces generation of a qemu.stp/qemu-system-XXX.stp > files which provides tapsets with friendly names for static > probes & their arguments. Instead of > > probe process("qemu").mark("qemu_malloc") { > printf("Malloc %d %p\n", $arg1, $arg2); > } > > It is now possible todo > > probe qemu.system.i386.qemu_malloc { > printf("Malloc %d %p\n", size, ptr); > } > > There is one tapset defined per target arch, for both > user and system emulators. > > * Makefile.target: Generate stp files for each target > * tracetool: Support for generating systemtap tapsets > * configure: Check for whether systemtap is available > with the DTrace backend > > Signed-off-by: Daniel P. Berrange <berrange@redhat.com> > --- > Makefile.target | 29 ++++++++++++- > configure | 7 +++ > tracetool | 128 +++++++++++++++++++++++++++++++++++++++++++++++------- > 3 files changed, 146 insertions(+), 18 deletions(-) Reviewed-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] Add support for SystemTAP and DTrace tracing backends (v6) 2010-11-12 13:20 [Qemu-devel] Add support for SystemTAP and DTrace tracing backends (v6) Daniel P. Berrange 2010-11-12 13:20 ` [Qemu-devel] [PATCH 1/2] Add a DTrace tracing backend targetted for SystemTAP compatability Daniel P. Berrange 2010-11-12 13:20 ` [Qemu-devel] [PATCH 2/2] Add support for generating a systemtap tapset static probes Daniel P. Berrange @ 2010-11-15 10:51 ` Stefan Hajnoczi 2 siblings, 0 replies; 9+ messages in thread From: Stefan Hajnoczi @ 2010-11-15 10:51 UTC (permalink / raw) To: Daniel P. Berrange; +Cc: qemu-devel On Fri, Nov 12, 2010 at 1:20 PM, Daniel P. Berrange <berrange@redhat.com> wrote: > An update of the SystemTAP/DTrace patches from > > http://lists.gnu.org/archive/html/qemu-devel/2010-11/msg00563.html > > The first patch contains the generic DTrace tracing backend support. > The second patch contains additional pieces for SystemTAP to generate > a tapset for each of the qemu-system-XXX binaries, to simplify life > for admins wanting to use the tracing backend. > > Changed in v6: > > - Fix handling of probes with no-args in DTrace provider > - Generate one tapset per target, for both system and user > emulators > - Re-write command line arg parsing in tracetool so it > doesn't assume a particular ordering of args > - Change '-s' to '--stap' in tracetool to avoid confusion > - Pass full binary name into tracetool Both patches look good. It would be nice to merge this. Stefan ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Qemu-devel] [PATCH 0/2] Add support for SystemTAP and DTrace tracing backends (v5) @ 2010-11-08 19:33 Daniel P. Berrange 2010-11-08 19:33 ` [Qemu-devel] [PATCH 2/2] Add support for generating a systemtap tapset static probes Daniel P. Berrange 0 siblings, 1 reply; 9+ messages in thread From: Daniel P. Berrange @ 2010-11-08 19:33 UTC (permalink / raw) To: qemu-devel A repost of the SystemTAP/DTrace patches from http://lists.gnu.org/archive/html/qemu-devel/2010-11/msg00496.html The patch is now split into two pieces. The first patch contains the generic DTrace tracing backend support. The second patch contains additional pieces for SystemTAP to generate a tapset for each of the qemu-system-XXX binaries, to simplify life for admins wanting to use the tracing backend. This addresses the problem in previous versions of the patch where the tapset only worked for /usr/bin/qemu and no other binaries. Unfortunately SystemTAP does not allow for use of wildcards, so it was neccessary to go for a separate tapset file per emulator binary. Changes in v5: - The Makefile merge error is now fixed ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Qemu-devel] [PATCH 2/2] Add support for generating a systemtap tapset static probes 2010-11-08 19:33 [Qemu-devel] [PATCH 0/2] Add support for SystemTAP and DTrace tracing backends (v5) Daniel P. Berrange @ 2010-11-08 19:33 ` Daniel P. Berrange 0 siblings, 0 replies; 9+ messages in thread From: Daniel P. Berrange @ 2010-11-08 19:33 UTC (permalink / raw) To: qemu-devel This introduces generation of a qemu.stp/qemu-system-XXX.stp files which provides tapsets with friendly names for static probes & their arguments. Instead of probe process("qemu").mark("qemu_malloc") { printf("Malloc %d %p\n", $arg1, $arg2); } It is now possible todo probe qemu.system.i386.qemu_malloc { printf("Malloc %d %p\n", size, ptr); } There is one tapset defined per target arch. * Makefile: Generate a qemu.stp file for systemtap * tracetool: Support for generating systemtap tapsets Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- Makefile.target | 19 +++++++++++- configure | 7 ++++ tracetool | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 117 insertions(+), 1 deletions(-) diff --git a/Makefile.target b/Makefile.target index 91e6e74..a5e6410 100644 --- a/Makefile.target +++ b/Makefile.target @@ -40,7 +40,20 @@ kvm.o kvm-all.o vhost.o vhost_net.o: QEMU_CFLAGS+=$(KVM_CFLAGS) config-target.h: config-target.h-timestamp config-target.h-timestamp: config-target.mak -all: $(PROGS) +ifdef CONFIG_SYSTEMTAP_TRACE +trace: $(QEMU_PROG).stp + +$(QEMU_PROG).stp: + $(call quiet-command,sh $(SRC_PATH)/tracetool \ + --$(TRACE_BACKEND) \ + --bindir $(bindir) \ + --target $(TARGET_ARCH) \ + -s < $(SRC_PATH)/trace-events > $(QEMU_PROG).stp," GEN $(QEMU_PROG).stp") +else +trace: +endif + +all: $(PROGS) trace # Dummy command so that make thinks it has done something @true @@ -348,6 +361,10 @@ ifneq ($(STRIP),) $(STRIP) $(patsubst %,"$(DESTDIR)$(bindir)/%",$(PROGS)) endif endif +ifdef CONFIG_SYSTEMTAP_TRACE + $(INSTALL_DIR) "$(DESTDIR)$(datadir)/../systemtap/tapset" + $(INSTALL_DATA) $(QEMU_PROG).stp "$(DESTDIR)$(datadir)/../systemtap/tapset" +endif # Include automatically generated dependency files -include $(wildcard *.d */*.d) diff --git a/configure b/configure index f8dad3e..e560f87 100755 --- a/configure +++ b/configure @@ -2192,6 +2192,10 @@ EOF echo exit 1 fi + trace_backend_stap="no" + if has 'stap' ; then + trace_backend_stap="yes" + fi fi ########################################## @@ -2645,6 +2649,9 @@ fi if test "$trace_backend" = "simple"; then trace_file="\"$trace_file-%u\"" fi +if test "$trace_backend" = "dtrace" -a "$trace_backend_stap" = "yes" ; then + echo "CONFIG_SYSTEMTAP_TRACE=y" >> $config_host_mak +fi echo "CONFIG_TRACE_FILE=$trace_file" >> $config_host_mak echo "TOOLS=$tools" >> $config_host_mak diff --git a/tracetool b/tracetool index 5b6636a..d797ab7 100755 --- a/tracetool +++ b/tracetool @@ -26,6 +26,12 @@ Output formats: -h Generate .h file -c Generate .c file -d Generate .d file (DTrace only) + -s Generate .stp file (DTrace with SystemTAP only) + +Options: + --bindir [bindir] QEMU binary install location + --target [arch] QEMU target architecture + EOF exit 1 } @@ -390,6 +396,54 @@ linetod_end_dtrace() EOF } +linetos_begin_dtrace() +{ + return +} + +linetos_dtrace() +{ + local name args arglist state + name=$(get_name "$1") + args=$(get_args "$1") + arglist=$(get_argnames "$1", "") + state=$(get_state "$1") + if [ "$state" = "0" ] ; then + name=${name##disable } + fi + + if [ "$target" = "i386" ] + then + binary="qemu" + else + binary="qemu-system-$target" + fi + + # Define prototype for probe arguments + cat <<EOF +probe qemu.system.$target.$name = process("$bindir/$binary").mark("$name") +{ +EOF + + i=1 + for arg in $arglist + do + cat <<EOF + $arg = \$arg$i; +EOF + i="$((i+1))" + done + + cat <<EOF +} +EOF +} + +linetos_end_dtrace() +{ + return +} + # Process stdin by calling begin, line, and end functions for the backend convert() { @@ -455,6 +509,24 @@ tracetod() convert d } +tracetos() +{ + if [ $backend != "dtrace" ]; then + echo "SystemTAP tapset generator not applicable to $backend backend" + exit 1 + fi + if [ -z "$target" ]; then + echo "--target is required for SystemTAP tapset generator" + exit 1 + fi + if [ -z "$bindir" ]; then + echo "--bindir is required for SystemTAP tapset generator" + exit 1 + fi + echo "/* This file is autogenerated by tracetool, do not edit. */" + convert s +} + # Choose backend case "$1" in "--nop" | "--simple" | "--ust" | "--dtrace") backend="${1#--}" ;; @@ -462,10 +534,30 @@ case "$1" in esac shift +bindir= +case "$1" in + "--bindir") + bindir=$2 + shift + shift + ;; +esac + +target= +case "$1" in + "--target") + target=$2 + shift + shift + ;; +esac + + case "$1" in "-h") tracetoh ;; "-c") tracetoc ;; "-d") tracetod ;; +"-s") tracetos ;; "--check-backend") exit 0 ;; # used by ./configure to test for backend *) usage ;; esac -- 1.7.2.3 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [Qemu-devel] [PATCH 0/2] Add support for SystemTAP and DTrace tracing backends @ 2010-11-08 11:33 Daniel P. Berrange 2010-11-08 11:33 ` [Qemu-devel] [PATCH 2/2] Add support for generating a systemtap tapset static probes Daniel P. Berrange 0 siblings, 1 reply; 9+ messages in thread From: Daniel P. Berrange @ 2010-11-08 11:33 UTC (permalink / raw) To: qemu-devel This is an update of the SystemTAP/DTrace patches previously sent http://lists.gnu.org/archive/html/qemu-devel/2010-10/msg01451.html The patch is now split into two pieces. The first patch contains the generic DTrace tracing backend support. The second patch contains additional pieces for SystemTAP to generate a tapset for each of the qemu-system-XXX binaries, to simplify life for admins wanting to use the tracing backend. This addresses the problem in previous versions of the patch where the tapset only worked for /usr/bin/qemu and no other binaries. Unfortunately SystemTAP does not allow for use of wildcards, so it was neccessary to go for a separate tapset file per emulator binary. Regards, Daniel ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Qemu-devel] [PATCH 2/2] Add support for generating a systemtap tapset static probes 2010-11-08 11:33 [Qemu-devel] [PATCH 0/2] Add support for SystemTAP and DTrace tracing backends Daniel P. Berrange @ 2010-11-08 11:33 ` Daniel P. Berrange 2010-11-08 21:24 ` Stefan Hajnoczi 0 siblings, 1 reply; 9+ messages in thread From: Daniel P. Berrange @ 2010-11-08 11:33 UTC (permalink / raw) To: qemu-devel; +Cc: Daniel P. Berrange From: Daniel P. Berrange <berrange@redhat.com> This introduces generation of a qemu.stp/qemu-system-XXX.stp files which provides tapsets with friendly names for static probes & their arguments. Instead of probe process("qemu").mark("qemu_malloc") { printf("Malloc %d %p\n", $arg1, $arg2); } It is now possible todo probe qemu.system.i386.qemu_malloc { printf("Malloc %d %p\n", size, ptr); } There is one tapset defined per target arch. * Makefile: Generate a qemu.stp file for systemtap * tracetool: Support for generating systemtap tapsets Signed-off-by: Daniel P. Berrange <dan@berrange.com> --- Makefile.target | 19 +++++++++++- configure | 7 ++++ tracetool | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 117 insertions(+), 1 deletions(-) diff --git a/Makefile.target b/Makefile.target index 91e6e74..a5e6410 100644 --- a/Makefile.target +++ b/Makefile.target @@ -40,7 +40,20 @@ kvm.o kvm-all.o vhost.o vhost_net.o: QEMU_CFLAGS+=$(KVM_CFLAGS) config-target.h: config-target.h-timestamp config-target.h-timestamp: config-target.mak -all: $(PROGS) +ifdef CONFIG_SYSTEMTAP_TRACE +trace: $(QEMU_PROG).stp + +$(QEMU_PROG).stp: + $(call quiet-command,sh $(SRC_PATH)/tracetool \ + --$(TRACE_BACKEND) \ + --bindir $(bindir) \ + --target $(TARGET_ARCH) \ + -s < $(SRC_PATH)/trace-events > $(QEMU_PROG).stp," GEN $(QEMU_PROG).stp") +else +trace: +endif + +all: $(PROGS) trace # Dummy command so that make thinks it has done something @true @@ -348,6 +361,10 @@ ifneq ($(STRIP),) $(STRIP) $(patsubst %,"$(DESTDIR)$(bindir)/%",$(PROGS)) endif endif +ifdef CONFIG_SYSTEMTAP_TRACE + $(INSTALL_DIR) "$(DESTDIR)$(datadir)/../systemtap/tapset" + $(INSTALL_DATA) $(QEMU_PROG).stp "$(DESTDIR)$(datadir)/../systemtap/tapset" +endif # Include automatically generated dependency files -include $(wildcard *.d */*.d) diff --git a/configure b/configure index f8dad3e..e560f87 100755 --- a/configure +++ b/configure @@ -2192,6 +2192,10 @@ EOF echo exit 1 fi + trace_backend_stap="no" + if has 'stap' ; then + trace_backend_stap="yes" + fi fi ########################################## @@ -2645,6 +2649,9 @@ fi if test "$trace_backend" = "simple"; then trace_file="\"$trace_file-%u\"" fi +if test "$trace_backend" = "dtrace" -a "$trace_backend_stap" = "yes" ; then + echo "CONFIG_SYSTEMTAP_TRACE=y" >> $config_host_mak +fi echo "CONFIG_TRACE_FILE=$trace_file" >> $config_host_mak echo "TOOLS=$tools" >> $config_host_mak diff --git a/tracetool b/tracetool index 5b6636a..d797ab7 100755 --- a/tracetool +++ b/tracetool @@ -26,6 +26,12 @@ Output formats: -h Generate .h file -c Generate .c file -d Generate .d file (DTrace only) + -s Generate .stp file (DTrace with SystemTAP only) + +Options: + --bindir [bindir] QEMU binary install location + --target [arch] QEMU target architecture + EOF exit 1 } @@ -390,6 +396,54 @@ linetod_end_dtrace() EOF } +linetos_begin_dtrace() +{ + return +} + +linetos_dtrace() +{ + local name args arglist state + name=$(get_name "$1") + args=$(get_args "$1") + arglist=$(get_argnames "$1", "") + state=$(get_state "$1") + if [ "$state" = "0" ] ; then + name=${name##disable } + fi + + if [ "$target" = "i386" ] + then + binary="qemu" + else + binary="qemu-system-$target" + fi + + # Define prototype for probe arguments + cat <<EOF +probe qemu.system.$target.$name = process("$bindir/$binary").mark("$name") +{ +EOF + + i=1 + for arg in $arglist + do + cat <<EOF + $arg = \$arg$i; +EOF + i="$((i+1))" + done + + cat <<EOF +} +EOF +} + +linetos_end_dtrace() +{ + return +} + # Process stdin by calling begin, line, and end functions for the backend convert() { @@ -455,6 +509,24 @@ tracetod() convert d } +tracetos() +{ + if [ $backend != "dtrace" ]; then + echo "SystemTAP tapset generator not applicable to $backend backend" + exit 1 + fi + if [ -z "$target" ]; then + echo "--target is required for SystemTAP tapset generator" + exit 1 + fi + if [ -z "$bindir" ]; then + echo "--bindir is required for SystemTAP tapset generator" + exit 1 + fi + echo "/* This file is autogenerated by tracetool, do not edit. */" + convert s +} + # Choose backend case "$1" in "--nop" | "--simple" | "--ust" | "--dtrace") backend="${1#--}" ;; @@ -462,10 +534,30 @@ case "$1" in esac shift +bindir= +case "$1" in + "--bindir") + bindir=$2 + shift + shift + ;; +esac + +target= +case "$1" in + "--target") + target=$2 + shift + shift + ;; +esac + + case "$1" in "-h") tracetoh ;; "-c") tracetoc ;; "-d") tracetod ;; +"-s") tracetos ;; "--check-backend") exit 0 ;; # used by ./configure to test for backend *) usage ;; esac -- 1.7.2.3 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PATCH 2/2] Add support for generating a systemtap tapset static probes 2010-11-08 11:33 ` [Qemu-devel] [PATCH 2/2] Add support for generating a systemtap tapset static probes Daniel P. Berrange @ 2010-11-08 21:24 ` Stefan Hajnoczi 0 siblings, 0 replies; 9+ messages in thread From: Stefan Hajnoczi @ 2010-11-08 21:24 UTC (permalink / raw) To: Daniel P. Berrange; +Cc: qemu-devel On Mon, Nov 8, 2010 at 11:33 AM, Daniel P. Berrange <dan@berrange.com> wrote: > @@ -390,6 +396,54 @@ linetod_end_dtrace() > EOF > } > > +linetos_begin_dtrace() > +{ > + return > +} > + > +linetos_dtrace() > +{ > + local name args arglist state Missing binary, i, and arg. > + name=$(get_name "$1") > + args=$(get_args "$1") > + arglist=$(get_argnames "$1", "") > + state=$(get_state "$1") > + if [ "$state" = "0" ] ; then > + name=${name##disable } > + fi > + > + if [ "$target" = "i386" ] > + then > + binary="qemu" > + else > + binary="qemu-system-$target" > + fi Perhaps we should just pass in the binary name to avoid hardcoding "qemu" and "qemu-system-$target" here. If possible, let's make SystemTap also work for userspace targets, not just for full-system softmmu targets. > + > + # Define prototype for probe arguments > + cat <<EOF > +probe qemu.system.$target.$name = process("$bindir/$binary").mark("$name") > +{ > +EOF > + > + i=1 > + for arg in $arglist > + do > + cat <<EOF > + $arg = \$arg$i; > +EOF > + i="$((i+1))" > + done > + > + cat <<EOF > +} > +EOF > +} > + > +linetos_end_dtrace() > +{ > + return > +} > + > # Process stdin by calling begin, line, and end functions for the backend > convert() > { > @@ -455,6 +509,24 @@ tracetod() > convert d > } > > +tracetos() How about using 'stap' instead of 's' so it's clear we're not generating assembly? Stefan ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2010-11-15 10:51 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-11-12 13:20 [Qemu-devel] Add support for SystemTAP and DTrace tracing backends (v6) Daniel P. Berrange 2010-11-12 13:20 ` [Qemu-devel] [PATCH 1/2] Add a DTrace tracing backend targetted for SystemTAP compatability Daniel P. Berrange 2010-11-12 13:30 ` Stefan Hajnoczi 2010-11-12 13:20 ` [Qemu-devel] [PATCH 2/2] Add support for generating a systemtap tapset static probes Daniel P. Berrange 2010-11-12 13:53 ` Stefan Hajnoczi 2010-11-15 10:51 ` [Qemu-devel] Add support for SystemTAP and DTrace tracing backends (v6) Stefan Hajnoczi -- strict thread matches above, loose matches on Subject: below -- 2010-11-08 19:33 [Qemu-devel] [PATCH 0/2] Add support for SystemTAP and DTrace tracing backends (v5) Daniel P. Berrange 2010-11-08 19:33 ` [Qemu-devel] [PATCH 2/2] Add support for generating a systemtap tapset static probes Daniel P. Berrange 2010-11-08 11:33 [Qemu-devel] [PATCH 0/2] Add support for SystemTAP and DTrace tracing backends Daniel P. Berrange 2010-11-08 11:33 ` [Qemu-devel] [PATCH 2/2] Add support for generating a systemtap tapset static probes Daniel P. Berrange 2010-11-08 21:24 ` Stefan Hajnoczi
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).